如何使用 unity animator 启动多个动画?
How to start more than one animation with unity animator?
我有一个动画管理员能够从 1 个动画创建 运行 时间动画(开始帧、结束帧和延迟,然后计算速度,稍后会进行变形等)。我的unity版本是5.3.1f1
一切正常,有些东西没有完成但是是可选的。动画师可以对请求的动画进行排队,以防止中断当前动画。
问题是,我只能用一个对象启动 1 次动画。启动下一个动画的代码完全相同,只是没有什么可做的。
事件如果它是 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()));
}
}
感谢您的宝贵时间。
我找到了解决方法。
我不想将其标记为可接受的解决方案,因为在我看来它不是 "clean"
对于像我这样的特定情况,动画师肯定存在某种问题。
我的解决方案是使用 animator.speed = 0 而不是 animator.stop();
一切都随着那个小变化立即工作
我会在 unity 论坛上问我的问题,因为肯定有一些奇怪的事情
我有一个动画管理员能够从 1 个动画创建 运行 时间动画(开始帧、结束帧和延迟,然后计算速度,稍后会进行变形等)。我的unity版本是5.3.1f1
一切正常,有些东西没有完成但是是可选的。动画师可以对请求的动画进行排队,以防止中断当前动画。
问题是,我只能用一个对象启动 1 次动画。启动下一个动画的代码完全相同,只是没有什么可做的。
事件如果它是 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()));
}
}
感谢您的宝贵时间。
我找到了解决方法。 我不想将其标记为可接受的解决方案,因为在我看来它不是 "clean"
对于像我这样的特定情况,动画师肯定存在某种问题。
我的解决方案是使用 animator.speed = 0 而不是 animator.stop(); 一切都随着那个小变化立即工作
我会在 unity 论坛上问我的问题,因为肯定有一些奇怪的事情