unity 动画控制


播放控制

Animator animator;

animator.speed=0;//停止播放
animator.speed=-1;//倒放

animator.Play("stateName",0,0);//播放指定状态(stateName是Animator窗口里各个状态的名称)

跳到指定帧,并停止

Animator animator;

animator.speed=0;//停止播放

AnimationClip clip=animator.runtimeAnimatorController.animationClips[0];
float frameTime=(1f/clip.frameRate)*5;//跳到第5帧

animator.Play("stateName",0,frameTime);//播放指定状态(stateName是Animator窗口里各个状态的名称)

在动画指定的时间里,添加事件函数
注意:函数所在的脚本和Animator 组件必须绑定到同一个GameObject

using UnityEngine;
using System.Collections;

public class TestAnimationEvent:MonoBehaviour{
	
	private void Awake(){
		Animator animator=GetComponent<Animator>();//Animator组件和此脚本必须绑定到同一个GameObject
                
		AnimatorOverrideController overrideController=new AnimatorOverrideController(animator.runtimeAnimatorController);
		//通过子符串获取AnimationClip,注意并不是Animator窗口里各个状态的名称,而是在Animator窗口中选择的状态在Inspector面板的motion属性显示的名称
		AnimationClip clip=overrideController["CINEMA_4D___"];

		//在动画指定的时间,添加事件
		AnimationEvent onCompleteEvent=new AnimationEvent();
		onCompleteEvent.objectReferenceParameter=this;
		onCompleteEvent.functionName=nameof(OnAnimationClipComplete);
		onCompleteEvent.time=clip.length;//clip.length动画长度,单位为秒。这里表示在结束时添加事件
		clip.AddEvent(onCompleteEvent);
	}

	private void OnAnimationClipComplete(UnityEngine.Object objectReference){//注意:参数类型是UnityEngine.Object不是object
		//注意:当内存中拥有多个当前类的实例时,将会调用多次此函数,使用objectReferenceParameter属性传递this区分
		if(objectReference!=this)return;

		Debug.Log("onShakeAnimComplete;");
	}
}

第二种方法:
通过AnimatorStateInfo.normalizedTime判断播放完成

using UnityEngine;
using System.Collections;

public class Test:MonoBehaviour{

	public Animator animator;

	private void Awake(){
		animator.Play("attack");
		InvokeRepeating(nameof(checkStateComplete),0.02f,0.02f);
	}

	private void checkStateComplete(){
		AnimatorStateInfo stateInfo=animator.GetCurrentAnimatorStateInfo(0);
		if(stateInfo.IsName("attack")){
            //normalizedTime:表示动画的标准化时间,区间:[0,1]
			if(stateInfo.normalizedTime>=1.0f) {
				onStateComplete();
				CancelInvoke(nameof(checkStateComplete));
			}
		}
	}
	
	private void onStateComplete(){
		Debug.Log("onStateComplete");
	}
	
	private void OnDestroy(){
		CancelInvoke("checkStateComplete");
	}
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM