前言
ResetTrigger是个what?再此之前我并不知道,准确说看到过但是并没有care。
开始了解它,是 因 为 出 BUG 了 !!
- 项目中播放动画统一使用全局的一个通用方法。播放动画接口调用SetTrigger。
- 摇杆开始移动时,调用SetTrigger("Run"),结束时,调用SetTrigger("Idel")。
- 当角色在run时,点击了一个npc,触发寻路接口移动到npc,当然寻路开始时,也会在调用一次settrigger("Run").
- 当寻路过程中,再次控制摇杆移动时(打断寻路),没有问题,但是当停止摇杆时,应该播放idle动作,但是实际停止后还是播放run。可是看log。我明明最后一次调用了SetTrigger("Idle")
So着重看了下SetTrigger。
SetTrigger
- SetTrigger可以改变动画状态机的状态,用于触发动画
- SetTrigger是四个接口之一,其他还有SetFloat、SetInt、SetBool
- SetTrigger本质上是SetBool,不同点在于,SetBool有两个可选择的值,false/true。但是SetTrigger比较特殊,调用SetTrigger会自动激活状态,同时又会自动设置状态为false。
我们拿一个案例来讲解一下:
clipboard.png
- 当摇杆滑动时,调用SetTrigger播放run动画,可以在当前帧通过GetTrigger("homerun") 看到激活状态是true。 当过了一帧后,再次GetTrigger("homerun") 是false。可以看到,trigger会自动回到false。
- 摇杆在滑动角色在跑动时,又调用寻路接口,再次触发SetTrigger("homerun"). 这个时候,homerun的trigger状态又被设置成true。 但是重要的是:因为已经在homerun状态了,unity并不会重新进入这个状态,所以homerun的trigger状态并不会自动进入false。
- 所以在我停止的摇杆的时候,虽然我调用了SetTrigger("comidle"), unity会进入idle状态,但是因为homerun的trigger状态一直是true,所以进入idle状态后,又会进入homerun状态。由此引起的bug。
解决办法
ResetTrigger
- ResetTrigger() 可以重置那些可能已经被激活的Trigger。
所以SetTrigger() 之前,我们需要清除可能已经被激活的Trigger。如下方法:
/// <summary>
/// 清除所有的激活中的trigger缓存
/// </summary>
public void ResetAllTriggers(Animator animator)
{
AnimatorControllerParameter[] aps = animator.parameters;
for (int i = 0; i < aps.Length; i++)
{
AnimatorControllerParameter paramItem = aps[i];
if (paramItem.type == AnimatorControllerParameterType.Trigger)
{
string triggerName = paramItem.name;
bool isActive = animator.GetBool(triggerName);
if (isActive)
{
animator.ResetTrigger(triggerName);
}
}
}
}
网友评论