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

Unity3d 角色未使用脚本更改动画状态,unity3d,Unity3d,我已经为3D游戏中的角色设置了动画师。然后设置一些条件来更改动画。在本例中,我希望角色从攻击=0(运行)更改为攻击=3(攻击)。奇怪的是,它有时可以工作,但大多数时候角色都被困在运行动画中。 代码中有一些额外的内容,例如,将速度降低到0并检查某个脚本。但是我想把帮助集中在动画更改部分 我试图扩大条件,以改变动画,但它不工作,迄今为止 if (anim.GetInteger("attack") == 0) { if (transform.position.x

我已经为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);

                }
if(anim.GetInteger(“攻击”)==0)
{
如果(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()!=null)
{
var go=this.gameObject;
var com=go.GetComponent();
com.speed-=com.speed;
动画集整数(“攻击”,3);
}
在第一个条件子句中,我打算在指定的间隔之间进行角色更改动画。 在第二个条件子句中,我告诉它将动画中的条件从0更改为3,从而进行攻击。
提前感谢。

根据您的描述,您的职位听起来不太准确

试着换掉你的手机

transform.position.z==0
为了

Mathf.Abs(transform.position.z)<0.01f
X也是一样。

transform.position.z==0
等是
float
值&rightarrow;从不直接比较
float
值是否相等!这里的问题是

由于精度有限,总是会出现舍入误差,使得两个
浮点值在数学上实际上应该相等,但仍然不同于一个称为
ε
的微小值(另请参见和)

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

您更应该使用来比较假定的精确值

Mathf.近似(transform.position.z,0)
基本上等于

Mathf.Abs(transform.position.z)
但是,对于比较位置:对于三维空间中的移动对象,通常情况下,它们在某一帧中的位置非常精确。因此,您可能更希望使用更广泛的范围,如

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

顺便说一句,您可以将代码缩小一点:

//避免重复的API调用和计算
var位置=变换位置;
var posXAbs=Mathf.Abs(位置x);
var posZAbs=Mathf.Abs(位置z);
如果(posZAbs<0.1f&&posXAbs>2f&&posXAbs<3.5f
||posXAbs<0.1f&&posZAbs>2f&&posZAbs<3.5f)
{
//避免重复和冗余的GetComponent调用
var com=GetComponent();
国际单项体育联合会(com)
{
//这里也可能出现浮点不精确
//因此,不如设置一个固定值0
com.speed=0;//或例如Vector2.0,取决于'speed'是什么
动画集整数(“攻击”,3);
}
}

谢谢。我会尝试一下,稍后再回来反馈。我现在不能这么做。虽然你说的完全有道理,但它仍然不起作用。角色仍在运行动画。我一定是在其他地方搞砸了。我发现:我有另一个条件条款与之冲突。我真是个笨蛋。谢谢对于你的回答,它确实帮助我更加谨慎地查看代码!非常感谢。问题仍然存在,但我从你的评论中学到了更多。我一定是在其他地方做错了什么,因为当角色到达我指定的坐标时,仍然卡在运行动画中。这是我有史以来的第一个游戏,所以这显然是我的错。但我似乎找不到哪里出错了。再次感谢您提供的关于缩减代码的提示。我选择暂时保持原样,这样我就不会把更多事情搞砸了。但是我将值更改为Mathf.Abs(transform.position.x)我发现了:我有另一个条件条款与之相冲突。我真是个傻瓜。谢谢你的回答,它确实帮助我更加谨慎地查看代码!我为首先回答浮点数的人设置了正确的答案,因为他名声不好,而且是因为他首先回答。我试图对你的答案投赞成票,但我的声誉不足以显示出我的投票。非常感谢,真的。我希望你理解我的理由。祝你有一个美好的一天。这对我来说没关系;)很高兴你找到了答案!一般来说:选择以最佳方式解决你的具体问题的答案。如果以后添加了其他答案,而其他人认为更好,它无论如何都会获得投票