在Unity中同步时间和动画的问题

时间:2019-11-15 10:15:50

标签: unity3d

我的问题是我想根据剩余时间来播放不同的动画,以供用户猜测。由于Unity Update的性质,我当前的代码无法正常工作。不知道如何更改它。不想将其转换为协程,因为我将不得不更改许多以前的代码。非常感谢您的帮助。

if(userGuessing)
{
    timerText.gameObject.SetActive(true);
    timer -= Time.deltaTime;
    timerText.text = timer.ToString("0.00");
    Debug.Log(timer);
}

if(timer > 90)
{
    bossArmature.animation.Play("BossVeryHappy", -1);
}
else if(timer > 70 && timer < 90)
{
    bossArmature.animation.Play("BossHappy", -1);
}
else if(timer > 50 && timer < 70)
{
    bossArmature.animation.Play("BossNeutral", -1);
}
else if(timer > 30 && timer < 50)
{
    bossArmature.animation.Play("BossAngry", -1);
}

2 个答案:

答案 0 :(得分:1)

您可以使用动画器条件根据您的计时器来控制行为,只需将Animator的“ Timer”参数设置为当前计时器值即可。然后使用LessThan条件来浏览不同的动画。

bossArmature.animation.SetFloat("Timer", timer);

它可能看起来像这样

答案 1 :(得分:1)

BugFinder的意思可能是:使用Animator Parameters并像Tobenai's answer那样进行过渡,我实际上更喜欢这样做,因为它更易于维护和扩展。不幸的是,尽管看起来bossArmature.animation确实是Animator,但我们实际上并不知道。


但是,如果您要坚持解决方案,我只会添加一个枚举状态

private enum BossState
{
    VeryHappy,
    Happy,
    Neutral,
    Angry
}

,并具有一个用于存储此类值的字段:

private BossState state;

和相应的Property用于在值更改时自动更新动画师:

private BossState State
{
    get => state;
    set
    {
        state = value;
        switch(state)
        {
            case BossState.VeryHappy:
                bossArmature.animation.Play("BossVeryHappy", -1);
                break;
            case BossState.Happy:
                bossArmature.animation.Play("BossHappy", -1);
                break;
            case BossState.Neutral:
                bossArmature.animation.Play("BossNeutral", -1);
                break;
            case BossState.Angry:
                bossArmature.animation.Play("BossAngry", -1);
                break;
        }
    }
}

,然后将Update方法更改为仅在尚未处于该状态的情况下才检查相应的情况,否则,总是在每一帧重新启动动画。

if(userGuessing){
    timerText.gameObject.SetActive(true);
    timer -= Time.deltaTime;
    timerText.text = timer.ToString("0.00");
    Debug.Log(timer);
}

if(State != BossState.VeryHappy && timer > 90)
{
    State = BossState.VeryHappy;
}
else if(State != BossState.Happy && timer > 70 && timer < 90)
{
    State = BossState.Happy;
}
else if(State != BossState.Neutral && timer > 50 && timer < 70)
{
    State = BossState.Neutral;
}
else if(State != BossState.Angry && timer < 50)
{
    State = BossState.Angry;
}