对于多量的、复杂的、有规律的控制器使用代码生成

动画状态代码控制

1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪些事情,为了解决这个问题,unity允许每个动画单元来绑定一个脚本代码,这个脚本代码必须继承于StateMachineBehaviour;
2: 可以在动画状态的Add Behaviour上添加挂载一个脚本到动画状态;
3: StateMachineBehaviour主要接口:
  (1)OnStateEnter: 当动画开始播放的时候被调用;
  (2)OnStateExit: 当动画结束播放的时候被调用;
  (3)OnStateMove: 当动画被移动的时候调用;
  (4)OnStateIK: 当动画触发逆向运动学时调用此方法;
  (5)OnStateUpdate: 每帧都会被调用;

动画状态代码控制案例

1.创建Unity工程和文件目录

2.导入资源文件包body_anim.unitypackage(第58)

3.打开Models文件夹,点击模型Boy,设置Rig---->Animation Tyoe---->Humanoid(人形动画)

4.配置Avatar

5.把模型Boy拖进场景中,会自己挂载一个Animator的组件

6.在res文件夹下创建一个动画控制器Create---->Animator Controller,叫做anim_ctrl,双击打开,可以用鼠标中键按下拖动背景

7.把Assets\Animations\AnisForFight的Boy@ForwardKick.FBX直接拖进Animator视图中的状态机中,设置为默认,再连接一条线到Exit

8.把anim_ctrl关联到Boy模型的Animator组件的Controller

9.运行,角色会不停地踢腿,现在我们要给它加一个代码控制

10点击状态机里面的ForwardKick,右边属性面板下有一个Add Behaviour,点击创建一个新的脚本叫anim_test。

11.这时候anim_test脚本文件在文件目录的外面,我们可以把它拖进scripts文件夹

打开脚本anim_test

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class anim_test : StateMachineBehaviour {//layerIndex就是动画所在的层,Base Layer层的layerIndex是0//要获得其他节点的组件都可以像MonoBehaviour那样做// OnStateEnter is called when a transition starts and the state machine starts to evaluate this stateoverride public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {Debug.Log("OnStateEnter");}//每一帧都执行// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacksoverride public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {Debug.Log("OnStateUpdate");}// OnStateExit is called when a transition ends and the state machine finishes evaluating this stateoverride public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {Debug.Log("OnStateExit");}//下面两个用的不多// OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {////}// OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here.//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {////}
}

代码生成动画控制器

1:10个状态,每2个状态之间需要建立两两的联系,那么这个动画控制器就会有100个过渡条件,那么这个时候最好的方式是代码自动的生成动画控制器;
2: 扩展编辑器,来动态生成这个动画控制器,不用手动的去修改;
3: 扩展编辑器的相关的API:
  (1)创建一个动画控制器:createAnimationControllerAtPath(“path”);
  (2)获取动画状态机: AnimatorStateMachine controller.layers[index].stateMachine;
  (3)设置默认的动画状态: stateMachine.defaultState
  (4)加载AnimationClip: AssertDatabase.LoaderAssetAtPath(“path”, typeof(AnimationClip))
      As AnimationClip;
  (5)为每个状态指定动画:state.motion = animclip;
  (6)AnimController.AddParameter(名字, AnimationParamsType);
  (7)添加一个过渡: AddTransition(dst_state, false);
  (8)过渡添加一个条件: trans.AddCondition();
  (9)最后一个添加exit state: AddExitTransition(); 制定输出动画;

代码生成动画控制器案例

1.先导入动画资源包anims.unitypackage(第58)到Assets\Animations目录下,里面有十个动画

2.扩展编辑器,新建一个Editor文件夹,在Editor目录下创建一个脚本叫CreateAnimCtrl

打开CreateAnimCtrl

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditor.Animations;public class CreateAnimCtrl : MonoBehaviour {[MenuItem("Assets/Create/CreateAnimCtrl")]//添加了一个菜单栏,可以在最上面菜单栏点击Assets/Create发现多了一个CreateAnimCtrl// 执行函数,点击Assets/Create/CreateAnimCtrl会执行的函数static void Run() {Debug.Log("Run called");// Step1: 生成我们的动画控制文件;这个操作等于右键Create---->Animator Controller到Assets/res目录下,名字叫code_anim.controllerAnimatorController ctrl = AnimatorController.CreateAnimatorControllerAtPath("Assets/res/code_anim.controller");// Step2 获取我们的动画状态机;AnimatorStateMachine state_machine = ctrl.layers[0].stateMachine;// 创建我们的动画状态;先创建一个数组,里面可以放10个动画状态AnimatorState[] state = new AnimatorState[10] ;for (int i = 0; i < 10; i++) {state[i] = state_machine.AddState("state" + i);//状态机添加动画状态// 这个语句相当于把Assets\Animations\AnisWithNum目录下的一个一个的可执行动画文件关联到对应的动画状态的Motion属性// as 强转类型过去,是C#的语法AnimationClip anim = AssetDatabase.LoadAssetAtPath("Assets/Animations/AnisWithNum/Ani" + i + ".FBX", typeof(AnimationClip)) as AnimationClip;state[i].motion = anim;}// 两两添加过渡;for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {  // i --> j 的transform// 创建每个动画过渡的控制变量,等于在Animator面板的Parameters面板下的参数添加条件变量,是开关类型的变量,这个变量就是只要选中就会执行ctrl.AddParameter(i + "switch" + j, AnimatorControllerParameterType.Trigger);// end //两两动画状态之间添加过渡,等于在状态机那个图里面选择一个动画状态然后右键Make TransitionAnimatorStateTransition trans = state[i].AddTransition(state[j], false);//给每个过渡添加条件,等于在过渡的属性面板下面的Condition属性点击+号,默认是0,就是关闭的状态trans.AddCondition(AnimatorConditionMode.If, 0, i + "switch" + j);}}// end // 设置一个默认动画状态,把第0个动画状态设置为默认动画状态;state_machine.defaultState = state[0];}
}

3.点击Assets/Create/CreateAnimCtrl,自动生成动画控制器且配置好了。最后把code_anim.controller关联到Boy模型的Animator组件的Controller属性中。

转载于:https://www.cnblogs.com/HangZhe/p/7264411.html

关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器相关推荐

  1. unity重定向_关于Unity中Mecanim动画的重定向与动画混合

    应用 一个RPG游戏,里面有100种怪物,每种怪物其实都差不多的,行走,跳跃,攻击,难道动画师要调100次动画吗?其实不需要 Unity抽象出人形动画系统,用Unity简化版的骨骼来进行统一的管理,只 ...

  2. Unity3D摄像机(Camera)跟随角色移动的代码控制和演示动画

    摄像机跟随物体方法一是把摄像机设置为物体Player的子物体. 话不多说,先把动画演示放出来康康. 接下来是,具体的源码: 一.在Main Camera下创建一个脚本FollowPlayer .将下面 ...

  3. unity中的关于声音(利用UI控制)

    在游戏制作中声音是一个比较重要的部分,没有声音可以说游戏是没有灵魂的. unity中声音组件介绍 在unity中如果想要加入声音,我们可以再摄像机上添加一个AudioSource 然后下载我们想要的音 ...

  4. 【100个 Unity实用技能】☀️ | Unity中 检查当前设备网络状态 的几种方法整理

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  5. 【酷熊科技】工作积累 ----------- 动画播放 直接写代码控制的

    动画 播放 1 using UnityEngine; 2 using System.Collections; 3 4 public class GameLoading : MonoBehaviour ...

  6. Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animat ...

  7. 替代Protocol buffers 的FlatBuffers:高效利用内存的序列化函数库(Unity中测试)

    孙广东   2015.7.4 http://www.open-open.com/lib/view/open1441004786315.html 虽然FB的反序列化超级快,但是数据大小还是蛮大的(可能的 ...

  8. Linux Shell学习笔记:exit退出状态代码

    inux提供$?特殊变量来保存最后一条命令执行结束的退出状态.执行完一条命令后,立即执行echo$?,可以查看最后一条命令的退出状态值. 正常的情况下,命令成功执行完成的退出状态是0,如果非0,则命令 ...

  9. 黑马程序员之ASP.NET学习笔记:Http状态代码及其含义

    -----------------------------------2345王牌技术员联盟.2345王牌技术员联盟.期待与您交流!---------------------------------- ...

最新文章

  1. 网站被降权后该如何操作?
  2. 【计算理论】计算复杂性 ( 证明 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的指数关系 )
  3. 解析中间人攻击(1/4)---ARP缓存中毒
  4. 控制系统数字仿真与CAD-第三次实验-附完整代码
  5. 富士康跳楼事件续集,主管扬言现场把人处理掉,并表示拒不处理善后
  6. HDU 12O3 I NEED A OFFER!
  7. 判断conime.exe是不是病毒!
  8. 记号, 函数空间及不等式
  9. ThingJS结合图表实现数据展示
  10. 2021最新C++面试题(附答案)
  11. android 根据宽度调整字体大小,android 字体大小 根据分辨率 自动调整
  12. App耗电及Crash体验优化
  13. jav学习日记:多线程(一)
  14. OFDM技术与FDM技术区别
  15. YOLO图像快速标注工具
  16. python nonetype_理解Python中的NoneType对象
  17. 小米4电信4G_2014716_官方线刷包_救砖包_解账户锁
  18. Hackme Writeup
  19. linux网络丢包测试工具,用NETEM模拟网络丢包 (转)
  20. 计算机应用与软件退稿率高吗,软件学报_软件学报退稿概率高吗

热门文章

  1. 68.视图在数据库系统三级结构的哪一级上?
  2. MySQL使用sql备份文件恢复数据库
  3. Python深度学习之搭建小型卷积神经网络(Kaggle网站Dogs-vs-Cats数据集)
  4. 深入理解计算机系统:网络编程 上
  5. 查看redis缓存大小_一个 bug 引发了服务器崩溃,对应 redis 的 key 回收原理你清楚了吗?...
  6. python工资管理系统课程设计_高校教师绩效工资管理系统设计开发,源码下载
  7. 064_let关键字
  8. mysql frm和ibd怎么恢复数据库_mysql数据库通过frm和ibd恢复数据
  9. wps不能打印_Excel表格怎么打印在一张纸上?
  10. 傅里叶变化的本质:复数的实部和虚部的对应关系