gpt4 book ai didi

c# - 刚体移动时,有时刚体速度为零

转载 作者:行者123 更新时间:2023-12-02 15:57:25 25 4
gpt4 key购买 nike

我正在尝试向我的可推送对象添加声音,并且只有一个简单的 if 语句来检查可推送对象是否正在移动。这个概念非常简单,如果物体正在移动,则应该播放声音,而当物体不移动时,则不应播放。然而问题是,当我调试该值时,每 5 帧左右就会有一个 0。这会导致声音工作不一致。我的脚本非常简单,我尝试更改为fixedupdate,但没有成功。我在某处读到物理计算是在fixedUpdate中完成的。

public class PushableObject : MonoBehaviour
{
Rigidbody rb;
AudioSource audioS;

bool rbIsMoving = false;

// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
audioS = GetComponent<AudioSource>();
}

// Update is called once per frame
void FixedUpdate()
{
if (rb.velocity == Vector3.zero)
{
Debug.Log("Not moving");
audioS.volume = 0f;
}
else
{
Debug.Log("Moving");
audioS.volume = 0.1f;
}
}
}

编辑:我刚刚发现,如果玩家将可插入的物体插入墙壁,声音仍在播放,因此我认为我必须改变确定物体是否移动的方式。

最佳答案

发生这种情况是由于single precision floating point .

您永远(不应该)直接比较两个 float 值,因为它们在逻辑上可能相等(例如 1 = 5*0.2),但对于计算机来说,它们可能不同一个小的“epsilon”

因此 Unity 决定 Vector3 仅使用 0.00001 精度来实现 == 的相等性

<小时/>

而是使用Mathf.Approximately它使用一个非常小的Epsilon相反。

<小时/>

比将 rb.velocity 的每个组件与 0 进行比较更容易,您真正想要的是 rb.velocity.magnitude这实际上是整体速度。

if (Mathf.Approximately(rb.velocity.magnitude, 0))
<小时/>

更新

或者存储最后一个位置并使用 Vector3.Distance 将其与当前位置进行比较再次使用 Mathf.Approximately

private Vector3 lastPosition;

private void LateUpdate()
{
if(Mathf.Approximately(Vector3.Distance(lastPosition, transform.position), 0))
{
//...
}
else
{
//...
lastPosition = transform.positiom;
}
}

或者使用自定义阈值

if(Vector3.Distance(lastPosition, transform.position) <= someThreshold)

或者,如果您想要的阈值是0.00001,那么这次您实际上可以使用==

if(lastPosition == transform.position)

关于c# - 刚体移动时,有时刚体速度为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54790695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com