我有一个打孔动画,让我们假设,5帧;
第二帧是冲击本身。我希望能够复制这个关键帧并向前移动以下帧。
我想在发生碰撞时能够做到这一点。使动画变慢不起作用,因为它会延迟整个帧。
任何提示
答案 0 :(得分:0)
也许你可以暂停动画,等待几帧,然后恢复它。可以通过将Animator.speed设置为0来暂停动画。像这样:
public class PunchAnimation : MonoBehaviour {
public Animator animator;
public float delay;
IEnumerator WaitAndResume(Animator animator, float delay) {
animator.speed = 0;
yield return new WaitForSeconds(delay);
animator.speed = 1;
}
void OnCollisionEnter(Collision c) {
StartCoroutine(WaitAndResume(animator, delay));
}
}
答案 1 :(得分:0)
考虑你的动画有3个部分,第一部分是1s,第二部分是2s,最后部分是1s。你想玩两秒钟的中间部分。
您有两种可能的方法,首先使用Animator:
public void PlayPartialAnim(string name, float start, float end)
{
if(start > 1f || start < 0f){ Debug.Log("Wrong value for start"); return; }
if(end > 1f || end < start){ Debug.Log("Wrong value for end"); return; }
animator.Play(name, 0, start);
StartCoroutine(PlayAnimToEnd(end));
}
private IEnumerator PlayAnimToEnd(float end)
{
AnimatorStateInfo asi = animator.GetCurrentAnimatorStateInfo(0);
while(asi.normalizedTime < end){ yield return null; }
// various way to go on
animator.speed = 0;
animator.enabled = false;
animator.SetValue("valueName", value);
animator.Play("previousAnim",0,0f);
}
这完全是代码所以它实际上要求在动画之后,你会继续发生任何应该发生的事情。这意味着你传递额外的参数以重新回到正轨。
完成动画的另一种方法是使用AnimationEvent。您将它放在动画的末尾并调用方法。
public class PartialAnimation:MonoBehaviour
{
private bool partialAnimRequired = false;
public void PlayPartialAnim(string name, float start, float end)
{
if(start > 1f || start < 0f){ Debug.Log("Wrong value for start"); return; }
if(end > 1f || end < start){ Debug.Log("Wrong value for end"); return; }
animator.Play(name, 0, start);
this.partialAnimRequired = true;
}
public void CheckPartialAnim(){
if(this.partialAnimRequired == true)
{
// same as other case
// either go to idle, default, previous (requires extra param)...
}
this.partialAnimRequired = false;
}
}
ChaeckPartialAnim是您添加到AnimationEvent的方法。
布尔值允许部分使用动画,但如果你需要一个完整的运行,那么只需用常规的Play或过渡来调用它。
最后的方法是复制你的动画并手动删除无用的帧并将有用的帧移动到动画的开头。虽然很讨厌。