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就能生成状态机的参数了:

根据Spine动画自动创建代码状态机相关推荐

  1. SSM框架——使用MyBatis Generator自动创建代码

    SSM框架--使用MyBatis Generator自动创建代码 这是通过命令行, 不用ide插件. 若在IDEA中通过插件generator, 还可以参考另一篇: IDEA搭建Spring+Spri ...

  2. 使用MyBatis Generator自动创建代码

    SSM框架--使用MyBatis Generator自动创建代码 1. 目录说明 使用自动生成有很多方式,可以在eclipse中安装插件,但是以下将要介绍的这种方式我认为很轻松,最简单,不需要装插件, ...

  3. 利用MyBatis Generator自动创建代码

    如果你使用过hibernate的eclipse插件自动创建DAO文件,那么就容易理解下面介绍的内容:如果你还没有用过hibernate也无妨.下面介绍使用mybatis 3的eclipse插件自动生成 ...

  4. 如何用MyBatis-Generator自动创建代码(映射生成实体类、DAO接口和Mapping映射文件)

    如何用MyBatis自动生成实体类.DAO接口和Mapping映射文件 引言: 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBa ...

  5. MyBatis学习总结(9)——使用MyBatis Generator自动创建代码

    2019独角兽企业重金招聘Python工程师标准>>> 由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所 ...

  6. SSM框架-使用MyBatis Generator自动创建代码

    参考:http://blog.csdn.net/zhshulin/article/details/23912615 SSM搭建的时候用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半 ...

  7. unity 在代码中创建spine动画组件

    项目中用到了spine动画,使用Assetbundle打包后,在手机上运行会出现丢材质的情况.如果不进行打包,直接放到Resources目录下是可以正常加载的,但是,这样包就会很大,而且也不能进行热更 ...

  8. Unity中使用动画状态机控制Spine动画

    下载Spine-Unity 为了在Unity中支持Spine动画,在http://zh.esotericsoftware.com/spine-unity-download/#Download下载spi ...

  9. 如何自动生成『状态机』代码?

    关注.星标公众号,直达精彩内容 来源:网络素材 有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State M ...

最新文章

  1. 不符合核销规则条件_1136家建筑企业资质核查不符合条件,复查合格率仅50
  2. c/c++中运行外部程序
  3. 关于html和javascript在浏览器中的加载顺序问题的讨论
  4. 携手伙伴谋增长 同心协力齐飞飏
  5. 2020年12月最新OneDrive网盘免费领取5TB教程
  6. GitHub入门详解
  7. Linux中的压缩命令
  8. 图片轮流翻转,一直循环
  9. C# 寻找数组中的最大子数组
  10. 阿里mysql集群_MySQL集群搭建详解
  11. 转行之后,我为什么选择做软件测试
  12. oracle表示大于等于,这些基础请记住,java转义的问题:小于等于、 大于等于Mybatis 、oracle...
  13. 本周最新文献速递20210718
  14. wamp下localhost目录Your Projects下项目无法打开解决方案
  15. 2022-2028年全球与中国救生艇行业市场前瞻与投资战略规划分析
  16. NB-IoT的应用领域
  17. Linux信号控制-sigprocmask,sigsuspend,sigpending,sigaction,sigqueue
  18. Python3.8的下载与安装
  19. 前5名最佳SQL数据库恢复软件
  20. 水桶服务器eula文件,minecraft1.8开服问题.doc

热门文章

  1. 数学建模常用算法—因子分析
  2. Xpage客户端脚本触发局部刷新
  3. 【Unity Shader】用Cubemap实现天空盒和环境映射
  4. RNA-seq流程学习笔记(14)-在windows10平台上利用R包合并表达矩阵、设置实验分组信息、列名及数据的导入导出
  5. MCE | LYTAC 与靶向蛋白降解技术
  6. 什么是威胁情报(Threat Intelligence)
  7. 使用Kettle批量同步数据库表
  8. Linux编辑器——vim
  9. 学界 | 谈一谈读计算机博士的未来出路在哪里?-- 无论如何也要终身学习
  10. 软件人和硬件人有啥区别?