动画 – Unity3D:何时评估转换条件

我有一个非常简单的游戏在Unity运行,不幸的是,它没有按预期工作.

上下文

我有以下设置:

http://mazyod.com/images/Screenshot_2014-04-23_10.51.20.png

在任何状态下,如果整数参数方向等于1,则设置动画player_move_e.其他方向的2,3,4相同.一旦方向设置为0,则播放与方向相关联的空闲动画.

这里要指出的重要一点是,由于我使用的是“任何状态”块,我必须确保一旦动画状态更改为其中一个移动动画状态,我就会将方向重置为哨兵值,如-1,处于当前状态的动画状态,而不是再次将状态更改为自身.

问题

当玩家处于,例如,move_n状态,并且我快速将方向更改为,例如,move_e(没有给它足够的时间转换到空闲),动画状态被卡在move_n 🙁

我怎么知道过渡是否发生了,而且我不经常更新?最初,我正在更新FixedUpdate中的方向,然后将其移至Update,但在两种方法中都是相同的问题.

这是我看到的逻辑:

// MY CODE
animator.SetInteger(1); // Initially, it's move_e
...
// WITHIN UNITY (making it up)
Unity.UpdateStates(); // The number is read in the engine, and transition happens
...
// MY CODE
animator.SetInteger(-1); // Stay at current animation
...
// WITHIN UNITY (making it up)
Unity.UpdateStates(); // The number is read in the engine, nothing should happen
...
// MY CODE
animator.SetInteger(0); // The logic briefly changes to idle
...
// WITHIN UNITY (making it up)
Unity.UpdateStates(); // The number is read in the engine, transition to idle
...
// MY CODE
animator.SetInteger(4); // transition to north
...
// WITHIN UNITY (making it up)
// NOTHING HAPPENS!! It doesn't catch up
...
// MY CODE
animator.SetInteger(-1); // Stay at current state, assuming it changed to move_n
...
// WITHIN UNITY (making it up)
Unity.UpdateStates(); // The number is read in the engine, stays at idle_e!
...

更新:

这是整个代码:

void Update()
{
    // update animator (Stupid transition from any state includes current state -_-")
    int heading = CalculateHeading(horizontalInput, verticalInput);

    if (heading != previousHeading)
    {
        anim.SetInteger("direction", heading);
        previousHeading = heading;
    }
    else
    {
        anim.SetInteger("direction", -heading);
    }
}

void MovementManagement ()
{
    // If there is some axis input...
    if(horizontalInput != 0f || verticalInput != 0f)
    {
        Vector3 position = transform.position;
        position.x += horizontalInput * movementSpeed;
        position.y += verticalInput * movementSpeed;

        transform.position = position;
    }
}

int CalculateHeading(float horizontal, float vertical)
{
    if (horizontal == 0f && vertical == 0f)
    {
        return 0;
    }

    if (Mathf.Abs(horizontal) > Mathf.Abs(vertical))
    {
        return (horizontal > 0 ? 1 : 3);
    }
    else
    {
        return (vertical > 0 ? 4 : 2);
    }
}

最佳答案 我为自己建了一个小场景,玩了一下.我可以重现你的问题,甚至找到一个简单的解决方案.

为什么会这样

当动画师状态机仍处于转换到新状态时,似乎会出现问题.在此期间,将忽略新的参数值,但您的代码将在下一次update()调用中再次更改该值.状态机忽略了您的新方向,现在只看到没有可用转换的值,例如direction = -1.

转换的默认行为是原子,这意味着根据reference它不能被中断.但是,将其设置为false没有任何区别……这可能是一个错误,您可能想要提交错误报告.

您需要通过检查IsInTransition(int layer)来检查状态机当前是否处于转换状态:

void Update()
{
    // update animator (Stupid transition from any state includes current state -_-")
    int heading = CalculateHeading(horizontalInput, verticalInput);

    if (heading != previousHeading && !anim.IsInTransition(0))  // you may need to adjust the layer index
    {
        anim.SetInteger("direction", heading);
        previousHeading = heading;
    }
    else
    {
        anim.SetInteger("direction", -heading);
    }
}

另一种可能的解决

我不知道你在不同的方向上使用了什么样的动画,但是使用一个动画可能更容易,只需转动你的角色:)这样你就可以减少转换和状态,并且可以更容易添加更多动画动画稍后.

点赞