Unity3d,用代码动态添加动画事件

时间:2024-03-16 16:48:34
  1. Unity3d,用代码动态添加动画事件
  2. //绑定到宿主身上
  3. public class AAAA : MonoBehaviour {
  4.     private Animator animator;//animator组件
  5.     public AnimationClip[] clips;//动画片段
  6.     
  7.     void Start() {
  8.         animator = GetComponent<Animator>();
  9.         clips = animator.runtimeAnimatorController.animationClips;
  10.         string a = "attack";//动画名
  11.         string b = "attack2";
  12.         for (int i = 0; i <clips.Length; i++)
  13.         {
  14.             if (clips[i].name==a)
  15.             {                                   //动画状态机,动画名,绑定的方法,绑定到动画的中间                    
  16.                 AddAnimationEvent(animator,a,"Hello",clips[i].length*0.5f);//添加动画事件
  17.             }
  18.             if (clips[i].name==b)
  19.             {                                                                    //0.8*24所在的位置 
  20.                 AddAnimationEvent(animator,b, "Attack", 0.8f);
  21.             }
  22.         }
  23.         
  24.     }
  25.     /// <summary>
  26.     /// 给动画添加动画事件
  27.     /// </summary>
  28.     /// <param name="ani"></param>//Animator组件
  29.     /// <param name="name"></param>//动画名字
  30.     /// <param name="fun"></param>//绑定的方法
  31.     /// <param name="time"></param>//绑定到那一帧
  32.     private void AddAnimationEvent(Animator ani, string name, string fun, float time)
  33.     {
  34.         AnimationClip[] temp = ani.runtimeAnimatorController.animationClips;
  35.         for (int i = 0; i < temp.Length; i++)
  36.         {
  37.             if (temp[i].name==name)
  38.             {
  39.                 AnimationEvent _event = new AnimationEvent();
  40.                 _event.functionName = fun;
  41.                 _event.time = time;
  42.                 temp[i].AddEvent(_event);
  43.                 break;
  44.             }
  45.         }
  46.         //重新绑定
  47.         ani.Rebind();
  48.     }
  49.     void Update() {
  50.     }
  51. //动画a绑定的方法
  52.     public void Hello() {
  53.         Debug.LogError("hello"+"-------------------");
  54.     }
  55. //动画b绑定的方法
  56.     public void Attack()
  57.     {
  58.         HelloAttack("helloAttack");
  59.     }
  60.     void HelloAttack(string str)
  61.     {
  62.         Debug.LogError("攻击攻击攻击" + str);
  63.     }
  64.     void OnDestory() {
  65.         CleanAllEvent();
  66.     }
  67.     /// <summary>
  68.     /// 清除动画事件
  69.     /// </summary>
  70.     private void CleanAllEvent()
  71.     {
  72.         for (int i = 0; i <clips.Length; i++)
  73.         {
  74.             clips[i].events = default(AnimationEvent[]);
  75.         }
  76.     }
  77. }