IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 根据Spine动画自动创建代码状态机 -> 正文阅读

[游戏开发]根据Spine动画自动创建代码状态机

Spine创建状态机的方法

导入Spine的三个文件,然后会生成SkeletonData.asset文件,然后将SkeletonData.asset文件拖动到Hierarchy下,选择SkeletonMecanim,能够看到在文件同一目录下生成了controller文件
在这里插入图片描述

代码生成状态机状态和连线

在RPG游戏中,角色有几十个,二他们的动画是类似的,所以应该代码创建生成状态和连线.
我的思路如下:
1.选中动画控制器,它是AnimatorController类型的.
2.创建需要的动画状态,这里我定义了一个枚举:

  public enum AnimatorName
    {
        standby,
        walk,
        attack,
        attack_1,
        death
    }

然后把这些状态添加到动画控制器里面.
3.给这些状态设置相应的动画,设置是否循环,速度等参数.我的Spine动画有这些.这里之前一直找不到得到这些动画的集合的方法,后面终于找到AssetDatabase.LoadAllAssetsAtPath这个API得到.
在这里插入图片描述
4.连线,各个状态都可以切换,我只定义了一个切换条件,当State为对应的枚举值时,切换到对应的状态.

详细代码提供如下:

  [MenuItem("CreateAnimator/CreateDynamicAnimator")]
    public static void CreateDynamicAnimator()
    {
        //选中动画控制器
        Object animObj = Selection.activeObject;
        AnimatorController dynamicAni = animObj as AnimatorController;
        //得到动画控制器第一层的默认动画状态机
        AnimatorStateMachine stateMachine = dynamicAni.layers[0].stateMachine;
        //先移除一下旧的状态
        foreach (var childAnimatorState in stateMachine.states)
        {
            stateMachine.RemoveState(childAnimatorState.state);
        }
        //创建状态集合
        List<AnimatorState> states = new List<AnimatorState>();
        //循环枚举将各个值添加为一个状态
        foreach (int code in Enum.GetValues(typeof(AnimatorName)))
        {
            string strName = Enum.GetName(typeof(AnimatorName), code);
            AnimatorState state = stateMachine.AddState(strName);
            state.speed = 1f;
            states.Add(state);
        }
        //指定默认状态
        stateMachine.defaultState = states[0];
      
        加载动画片段
        string path = AssetDatabase.GetAssetPath(animObj);
        Object[] anis = AssetDatabase.LoadAllAssetsAtPath(path);
        Dictionary<string,AnimationClip> dict =new Dictionary<string, AnimationClip>();
        foreach (var ani in anis)
        {
            if (ani is AnimationClip)
            {
                AnimationClip clim = (AnimationClip) ani;
                dict.Add(clim.name,clim);
                //设置动画循环 除了死亡动作
                if (!ani.name.Equals(AnimatorName.death.ToString()))
                {
                    AnimationClipSettings clipSetting = AnimationUtility.GetAnimationClipSettings(clim);
                    clipSetting.loopTime = true;
                    AnimationUtility.SetAnimationClipSettings(clim, clipSetting);
                }
            }
        }
        //为每一个状态指定相应的动画片段 动画的名字和状态的名字相同
        for (int i = 0; i < states.Count; i++)
        {
            if (!dict.ContainsKey(states[i].name))
            {
                Debug.LogError($"non-existent {states[i].name} AnimationClip");
                return;
            }
            states[i].motion = dict[states[i].name];
            //关闭逆向运动学
            states[i].iKOnFeet = false;
        }
    
        //为动画控制器添加参数,形成参数列表
        dynamicAni.AddParameter("State", AnimatorControllerParameterType.Int);
        //允许任意状态过度到任意状态
        for (int i = 0; i < states.Count; i++)
        {
            for (int j = 0; j < states.Count; j++)
            {
                if (states[i] != states[j])
                {
                    //生成状态之间的触发器,即:连线 
                    AnimatorStateTransition trans = states[i].AddTransition(states[j], false);
                    AnimatorName  temp=(AnimatorName) Enum.Parse(typeof(AnimatorName), states[j].name);
                    //为触发器添加触发条件
                    trans.AddCondition(AnimatorConditionMode.Equals, (int)temp, "State");
                }
            }
        }
    
        //指定某一个状态能够过渡到退出动画状态
        // states[0].AddExitTransition();
    }

最终选中controller,然后点击CreateAnumator就能生成状态机的参数了:

在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 11:11:09  更:2021-09-10 11:11:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 15:58:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码