角色未使用脚本更改动画状态



我已经为3D游戏中的角色设置了动画师。然后,我设置了一些条件来更改动画。在这种情况下,我希望角色从攻击=0(运行(更改为攻击=3(攻击(。奇怪的是,它有时有效,但大多数时候角色都卡在运行动画中。 代码上有一些附加功能,例如,将速度降低到 0 并检查某个脚本。但我想把帮助集中在动画更改部分。

我尝试放大条件以更改动画,但到目前为止它不起作用。

if (anim.GetInteger("attack") == 0)
{
if (transform.position.x > 2f && transform.position.x < 3.5f && transform.position.z == 0 ||
transform.position.z > -3.5f && transform.position.z < -2f && transform.position.x == 0 ||
transform.position.x > -3.5f && transform.position.x < -2f && transform.position.z == 0 ||
transform.position.z > 2f && transform.position.z < 3.5f && transform.position.x == 0)
{
if (gameObject.GetComponent<LeftNPCmove>() != null)
{
var go = this.gameObject;
var com = go.GetComponent<LeftNPCmove>();
com.speed -= com.speed;
anim.SetInteger("attack", 3);
}

对于第一个条件子句,我打算在指定的间隔之间制作字符更改动画。 在第二个条件子句中,我告诉它将动画器中的条件从 0 更改为 3,从而进行攻击。 提前谢谢。

transform.position.z == 0

等是float值&右箭头;永远不要直接比较float值以获得平等!您在这里遇到的问题是浮点精度。

由于精度有限,总会有舍入误差,使两个float值在数学上实际上应该相等,但仍然相差一个称为epsilon的微小值(另请参阅Mathf.ApproximatelyMathf.Epsilon(。

点不精确使得使用等于运算符比较浮点数不准确。例如,1.0 == 10.0 / 10.0可能不会每次都返回true

您应该使用Mathf.Approximately来比较假定的精确值

Mathf.Approximately(transform.position.z, 0)

这基本上等于

Mathf.Abs(transform.position.z) < Mathf.Epsilon

但是,对于比较位置:对于在3D空间中移动的对象,它们通常永远不会在某个帧中具有精确的位置。因此,您可能更愿意使用更广泛的范围,例如

Mathf.Abs(transform.position.z) < 0.1f

顺便说一句,你可以稍微缩小你的代码:

// avoid repeated API calls and calculations
var position = transform.position;
var posXAbs = Mathf.Abs(position.x);
var posZAbs = Mathf.Abs(position.z);
if (posZAbs < 0.1f && posXAbs > 2f && posXAbs < 3.5f
|| posXAbs < 0.1f && posZAbs > 2f && posZAbs < 3.5f)
{
// avoid repeated and redundant GetComponent call
var com = GetComponent<LeftNPCmove>();
if (com)
{
// here also could appear floating point imprecision
// so rather set a fixed value 0
com.speed = 0; // or e.g. Vector2.zero depending what `speed` is
anim.SetInteger("attack", 3);
}
}

根据您的描述,听起来您的职位并不准确0.

尝试换掉您的

transform.position.z == 0 

Mathf.Abs(transform.position.z) < 0.01f 

X也是如此。

最新更新