我已经为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.Approximately
和Mathf.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也是如此。