Unity笔记之Animator

问题一、动画赋值

//aiAnimator.SetBool(i, false);//不可访问改变
aiAnimator.SetBool(aiAnimator.GetParameter(i).name, false);//可访问改变

也不知道是不是Animator的坑,反正就是通过名字才可以修改Animator的值。通过索引无法修改,会疯狂报警告

问题二、判断某个动画片段是否播放完

    AnimatorStateInfo animatorInfo;
    void PlayerAnimatorChoose()
    {
        animatorInfo = animator.GetCurrentAnimatorStateInfo(0);
        //normalizedTime的值为0~1,0为开始,1为结束。
        if ((animatorInfo.normalizedTime >= 1.0f) && (animatorInfo.IsName("Jump_0")))
        {
			Debug.Log("Jump_0片段播放结束了");
        }
    }

问题三、动画状态机切换

public Animator ani;
    public AnimatorController controller0;
    public AnimatorController controller1;
    void Start()
    {
        ani.runtimeAnimatorController = controller0;
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            ani.runtimeAnimatorController = controller0;
        }
        else if (Input.GetKeyDown(KeyCode.O))
        {
            ani.runtimeAnimatorController = controller1;
        }
    }

这样就可以了。

动画辅助类

using System;
using System.Collections;
using UnityEngine;

namespace ZXL
{
    /// <summary>
    /// 动画辅助类
    /// </summary>
    public static class AnimatorHelper
    {
        /// <summary>
        /// 动画播放结束后执行方法
        /// </summary>
        /// <param name="animator">状态机</param>
        /// <param name="action">播放完毕执行的方法</param>
        /// <returns></returns>
        public static IEnumerator AnimatorOver(this Animator animator, Action action)
        {
            yield return new WaitForFixedUpdate(); //需要延时一帧,否则获取到的动画片段还没开始播放,就可能被判断为已经播放完成了
            yield return new WaitUntil(() => animator.PlayIsOver());
            action?.Invoke();
        }

        /// <summary>
        /// 根据名字播放对应动画片段,并在动画播放结束后执行指定方法
        /// </summary>
        /// <param name="animator">状态机</param>
        /// <param name="animatorClipName">播放的动画名字</param>
        /// <param name="action">播放完毕执行的方法</param>
        /// <returns></returns>
        public static IEnumerator AnimatorOver(this Animator animator, string animatorClipName, Action action)
        {
            animator.Play(animatorClipName);
            //yield return new WaitForFixedUpdate();//需要延时一帧,否则获取到的动画片段还没开始播放,就可能被判断为已经播放完成了(可能需要)
            yield return new WaitUntil(() => animator.PlayIsOver());
            Debug.Log(PlayIsOver(animator));
            action?.Invoke();
        }

        /// <summary>
        /// 判断动画是否播放完毕
        /// </summary>
        /// <param name="animator">状态机</param>
        /// <returns></returns>
        public static bool PlayIsOver(this Animator animator)
        {
            var info = animator.GetCurrentAnimatorStateInfo(0);
            if (info.normalizedTime >= 1.0f)
            {
                return true;
            }

            return false;
        }
    }
}
posted @   一世癫狂  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业
点击右上角即可分享
微信分享提示