个人理解:这种情况是因为,在某个动作的某个帧事件中进行特定的SetBool的操作,但是似乎因为两个动作间的过渡时间过短过长,导致上一个动作未能播放完全(非固定持续时间)就过渡到下一个动作,事件也未执行,如下图:
比如我是在移动动作的同时,进行闪避动作,就有小概率人物动作会定格在闪避的最后一帧,同时闪避动作也不会自行结束,因为动画机里设定的Dodge参数始终为True
试了一下处理按键太麻烦,干脆直接加个判断语句,如果人物卡在这个动作一定时间了,那就把这个动作的布尔参数重新设为False,关掉这个动作(实在没办法才如此,一般建议调整过渡时间等)
代码如下:
public class anim : MonoBehaviour
{
private Animator ani;
bool isDodge;
float DodgeTime;//
void Start()
{
ani = GetComponent<Animator>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))//按下空格进行闪避
{
ani.SetBool("attack", false);
ani.SetBool("dodge", true);
}
if (ani.GetBool("dodge"))//通过动画机内的闪避参数,计算闪避动作的实际进行时间
{
DodgeTime += Time.deltaTime;
if (DodgeTime >= 0.3)//如果卡在闪避动作超过0.3秒
{
ani.SetBool("dodge", false);//那么将闪避参数设为false,结束闪避动作
Debug.Log("闪避时间为:" + DodgeTime);
DodgeTime = 0;
}
}
}
void startDodge()//在闪避动作的“事件”特定时间,添加一个函数以确定闪避开始
{
isDodge = true;
ani.SetBool("attack", false);//防止动作冲突
}
void endDodge()//在闪避动作的“事件”特定时间,添加一个函数以确定闪避结束
{
isDodge = false;
DodgeTime = 0;//如果动作正常进行没卡死,那么DodgeTime=0
ani.SetBool("dodge", false);
}