赞
踩
这样便创造出了一个动画控制器
我们看到的会是以下情景:
表示任意状态的特殊状态。例如我们如果希望角色在任何状态下都有可能切换到死亡状态,那么Any State就可以帮我们做到。当你发现某个状态可以从任何状态以相同的条件跳转到时,那么你就可以用Any State来简化过渡关系。
表示状态机的入口状态。当我们为某个GameObject添加上Animator组件时,这个组件就会开始发挥它的作用。
如果Animator Controller控制多个Animation的播放,那么默认情况下Animator组件会播放哪个动画呢? 由Entry来决定的。
但是Entry本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会显示为 橘黄色。
当然,你可以随时在任意一个状态上通过 鼠标右键->Set as Layer Default State更改默认状态。
记住, Entry在Animator组件被激活后 无条件 跳转到默认状态,并且每个Layer有且仅有一个默认状态。
表示状态机的出口状态,以红色标识。如果你的动画控制器只有一层,那么这个状态可能并没有什么卵用。但是当你需要从子状态机中返回到上一层(Layer)时,把状态指向Exit就可以了。
属性名 | 描述 |
---|---|
Motion | 状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可 |
Speed | 动画播放的速度。默认值为1,表示速度为原动画的1.0倍。 |
Mutiplier | 勾选右侧的Parameter后可用,即在计算Speed的时考虑 区域1 中定义的某个参数。若选择的参数为smooth, 则动画播放速度的计算公式为 smooth * speed * fps(animation clip中指定) |
Mirror | 仅适用于humanoid animation(人型机动画) |
Cycle Offset | 周期偏移,取值范围为0-1.0,用于控制动画起始的偏移量。把它和正弦函数的offset进行对比就能够理解了,只会影响起始动画的播放位置。 |
Foot IK | 仅适用于humanoid animation(人型机动画) |
Write Default | 最好保持默认,感兴趣可以参考官方手册 |
Transitions | 该状态向其他状态发起的过渡列表,包含了Solo和Mute两个参数,在预览状态机的效果时起作用 |
Add Behaviour | 用于向状态添加“行为” |
参数有Float,Int,Bool,Trigger。
Float、Int用来控制一个动画状态的参数,比如速度方向等可以用数值量化的东西,
Bool用来控制动画状态的转变,比如从走路转变到跑步,
Trigger本质上也是bool类型,但它默认为false,且当程序设置为true后,它会自动变回false。
刚刚建完脚本是这样的:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FSM : StateMachineBehaviour { // 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) //{ // //} // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // //} // 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) //{ // //} // OnStateMove is called right after Animator.OnAnimatorMove() //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // // Implement code that processes and affects root motion //} // OnStateIK is called right after Animator.OnAnimatorIK() //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // // Implement code that sets up animation IK (inverse kinematics) //} }
以下我推荐几个非常经典的脚本
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FSMOnEnter : StateMachineBehaviour { public string[] onEnterMesssges; // 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) { foreach (var msg in onEnterMesssges) { //animator.gameObject.SendMessage(msg);//给自己发信息 animator.gameObject.SendMessageUpwards(msg);//给上一级发信息 } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FSMOnExit : StateMachineBehaviour { public string[] onExitMessages; override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { foreach (var msg in onExitMessages) { animator.gameObject.SendMessageUpwards(msg); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FSMOnUpdate : StateMachineBehaviour { public string[] onUpdateMessages; override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { foreach (var msg in onUpdateMessages) { animator.SendMessageUpwards(msg); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FSMClearSignals : StateMachineBehaviour { public string[] ClearAtEnter; public string[] ClearAtExit; override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { foreach (var signal in ClearAtEnter) { animator.ResetTrigger(signal);//清除积累的Trigger信号 } } override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { foreach (var signal in ClearAtExit) { animator.ResetTrigger(signal);//清除积累的Trigger信号 } } }
以上就是基本用法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。