关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
对于多量的、复杂的、有规律的控制器使用代码生成
动画状态代码控制
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 state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
Debug.Log("OnStateEnter");
} //每一帧都执行
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override 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 state
override 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.controller
AnimatorController ctrl = AnimatorController.CreateAnimatorControllerAtPath("Assets/res/code_anim.controller");
// Step2 获取我们的动画状态机;
AnimatorStateMachine state_machine = ctrl.layers[].stateMachine; // 创建我们的动画状态;先创建一个数组,里面可以放10个动画状态
AnimatorState[] state = new AnimatorState[] ;
for (int i = ; i < ; 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 = ; i < ; i++) {
for (int j = ; j < ; j++) { // i --> j 的transform
// 创建每个动画过渡的控制变量,等于在Animator面板的Parameters面板下的参数添加条件变量,是开关类型的变量,这个变量就是只要选中就会执行
ctrl.AddParameter(i + "switch" + j, AnimatorControllerParameterType.Trigger);
// end
//两两动画状态之间添加过渡,等于在状态机那个图里面选择一个动画状态然后右键Make Transition
AnimatorStateTransition trans = state[i].AddTransition(state[j], false); //给每个过渡添加条件,等于在过渡的属性面板下面的Condition属性点击+号,默认是0,就是关闭的状态
trans.AddCondition(AnimatorConditionMode.If, , i + "switch" + j);
}
}
// end
// 设置一个默认动画状态,把第0个动画状态设置为默认动画状态;
state_machine.defaultState = state[]; }
}
3.点击Assets/Create/CreateAnimCtrl,自动生成动画控制器且配置好了。最后把code_anim.controller关联到Boy模型的Animator组件的Controller属性中。

关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器的更多相关文章
- Unity中Mecanim工作流
Mecanim工作流可以被分解为3个主要阶段:1.资源的准备和导入这一阶段由美术师或动画师通过第三方工具来完成,例如Max或Maya.2.角色的建立主要有以下两种方式1)人形角色的建立.Mecanim ...
- 关于Unity中Mecanim动画的重定向与动画混合
应用 一个RPG游戏,里面有100种怪物,每种怪物其实都差不多的,行走,跳跃,攻击,难道动画师要调100次动画吗?其实不需要 Unity抽象出人形动画系统,用Unity简化版的骨骼来进行统一的管理,只 ...
- 神马都是浮云,unity中自己写Coroutine协程源代码
孙广东 2014.7.19 无意之间看到了,Unity维基上的一篇文章, 是关于自己写协程的介绍. 认为非常好,这样能更好的了解到协程的执行机制等特性.还是不错的. 原文链接地址例如以下: ht ...
- java程序监控tomcat中部署的项目的状态以及控制某些项目的启动停止
原文:http://blog.csdn.net/liuyuqin1991/article/details/49280777 步骤如下: ①:首先授权用户使获得这些权限 You can find the ...
- Unity 中动态修改碰撞框(位置,大小,方向)
在Unity中,玩家处于不同的状态,要求的碰撞框的 位置/大小/方向 会有所改变,怎么动态的修改碰撞框呢? 下面是Capsure Collider(胶囊体)的修改: CapsuleCollider.d ...
- 【转】Unity中的协同程序-使用Promise进行封装(三)
原文:http://gad.qq.com/program/translateview/7170967 译者:崔国军(飞扬971) 审校:王磊(未来的未来) 在这个系列的最后一部分文章,我们要通过 ...
- unity3d ppsspp模拟器中的post processing shader在unity中使用
这个位置可以看到ppsspp的特殊处理文件位置来看看这些特效 用来测试的未加特效图片 ppsspp: 传说系列一生爱---英杰传说 最后的战士 aacolor 是关于饱和度,亮度,对比度,色调的调节, ...
- Linux Shell学习笔记:exit退出状态代码
inux提供$?特殊变量来保存最后一条命令执行结束的退出状态.执行完一条命令后,立即执行echo$?,可以查看最后一条命令的退出状态值. 正常的情况下,命令成功执行完成的退出状态是0,如果非0,则命令 ...
- 关于Unity中新版动画系统的使用
Mecanim动画 1:旧版动画系统只能通过代码来控制动画播放,随着动画种类变多,代码复杂度也会增加,同时动画过渡也需要非常繁琐的代码控制,为了让有经验的动画师开发动画,unity推出了针对人物角色的 ...
随机推荐
- 【Unity】11.6 恒定力 (Constant Force)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 恒定力 (Constant Force) 是用于向刚体 (Rigidbody) 添加恒定力的快速实用工具,适用于类似火箭 ...
- python中包含UTF-8编码中文的列表或字典的输出
在python 下面一个包含中文字符串的列表(list)或字典,直接使用print会出现以下的结果: >>> dict = {"asdf": "我们的p ...
- hdu 2680 Choose the best route (dijkstra算法)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2680 /************************************************* ...
- checkpoint and savepoint in FlinK
https://info.lightbend.com/rs/558-NCX-702/images/preview-apache-flink.pdf https://www.microsoft.com/ ...
- 微网站|手机端html弹窗、弹层、提示框、加载条
layer mobile是为移动设备(手机.平板等webkit内核浏览器/webview)量身定做的弹层支撑,采用Native JavaScript编写,完全独立于PC版的layer,您需要按照场景选 ...
- jsonrpc使用
jsonrpc使用 1.什么是rpc RPC(Remote Procedure Call)远程过程调用,简单说就是通过网络请求服务,不需要了解底层网络技术的协议. 常用语分布式应用程序. 2.rpc数 ...
- Spark(Hive) SQL中UDF的使用(Python)【转】
相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...
- Docker 入门(Mac环境)- part 5 stacks
part-5 stacks 简介 stack就是栈,栈的结构是什么样的呢?一层一层是紧挨着的,然后互相依赖,不能说中间少了一个.这样说就很明白了,栈实际上在docker中就相当于多个互相依赖的组件,共 ...
- JSch远程执行脚本
JSch远程执行脚本 2017-02-24 在自动化测试的时候,需要远程操控服务器做一些操作,比如切日.起服务器.执行某些脚本.如何实现? 我们可以利用JSch,远程执行脚本.JSch是Java Se ...
- nginx源码分析:module机制
根据nginx官方文档,添加一个module的介绍,当我们需要添加一个module时,需要以下操作: 1.为该module新建一个目录. 2.添加一个config文件,一个module核心代码源文件. ...