如何使用unity动画师启动多个动画

本文关键字:动画 启动 动画师 何使用 unity | 更新日期: 2023-09-27 18:30:02

我有一个动画师管理器,可以从1个动画创建运行时动画(开始帧、结束帧和延迟,然后计算速度,稍后进行变形等)。我的统一版本是5.3.1f1

一切都很好,有些事情没有完成,但可以选择。动画师可以对请求的动画进行排队,以防止干扰当前动画。

问题是,我只能用一个对象开始一次动画。启动下一个动画的代码完全相同,但没有什么可做的。

事件,如果其2次使用相同的动画数据制作相同的动画所有配方都很好,经过测试。

我用断点进行了密集的调试,以确保在任何时候都很好

有什么东西可以阻止我在一个对象上一个接一个地开始动画2次吗?。我没有任何错误或警告。无论我在AnimData结构中设置了什么,第一个动画都能很好地工作,但第二次,什么都没发生。

以下是要点:

public int? startAnim(int index)
{
    if(index < animIndex.Count)
    {
        startAnim(animIndex[index]);
    }
    return null;
}
//private because the struct is internal, this make sure the animator keep control of the list.
private int? startAnim(AnimData animD)
{
    if(locked)
    {
        #if UNITY_EDITOR
        Debug.Log("anim locked");
        #endif
        return null;
    }
    //current anim (queue anim) not finished
    if(endTime > Time.time)
    {
        if(canQueue)
        {
            addToQueue(animD);
            return animDataQ.Count;
        }
        else
        {
            return null;
        }
    }
    else
    {
        endTime = Time.time + animD.TotalTime;
        StartCoroutine(animManager(animD));
        return 0;
    }
    return null;
}
#endregion anim starters
private IEnumerator animManager(AnimData animData)
{
        animator.speed = Mathf.Abs(animData.calculateSpeed(animLength, AnimType.main, currentKey).Value);
        //animator.Play(0,0, animData.StartKey/animLength);
        if(animData.AnimSpeed > 0)
        {
            animator.Play(0,0, animData.StartKey/animLength/2);
        }
        else
        {
            //animator.Play(0,0, (animLength * 2) - (animData.StartKey/animLength));
            animator.Play(0,0, (((animLength*2) - animData.StartKey)/(animLength * 2)));
        }
            //animator.Play(0,0, (animData.AnimSpeed > 0) ?  animData.StartKey/animLength : ((animLength * 2) - (animData.StartKey/animLength)));
        yield return new WaitForSeconds(animData.Delay);
        animator.Stop();
        yield return null;
    endAnim();
}

private void addToQueue(AnimData animD)
{
    animDataQ.Enqueue(animD);
    endTime += animD.TotalTime;
    queueTime += animD.TotalTime;
}
private void endAnim()
{
    if(canQueue && animDataQ.Count > 0)
    {
        StartCoroutine(animManager(animDataQ.Dequeue()));
    }
}

谢谢你抽出时间。

如何使用unity动画师启动多个动画

我找到了一个变通办法。我不想把它标记为可接受的解决方案,因为在我看来并不"干净"

对于像我这样的特定情况,动画师肯定有一些问题。

我的解决方案是使用animator.speed=0而不是animator/stop();的零钱很小,一切都很好

我会向团结论坛提出我的问题,因为

肯定有一些奇怪的事情