Unity3D开发小贴士(十五)状态机组件
2016-12-19 08:19
375 查看
在Unity3D中,我们除了可以为GameObject添加组建,还可以为AnimatorController中的状态添加组建。这样我们就可以在状态(机)的不同阶段内执行不同的操作。
导入Characters包,并将ThirdPersonController添加到场景中。打开Animator窗口,单击场景中的ThirdPersonController对象,Animator中会出现如下图所示
单击Airborne,Inspector中会出现
点击Add Behaviour,便可以创建StateMachineBehaviour。
默认的脚本文件中包含这些:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestStateBehaviour : 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(). 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) {
//
//}
}
OnStateEnter是在状态进入的时候会调用。
OnStateUpdate是状态激活后每一帧调用。
OnStateExit是在状态退出的时候会调用。
OnStateMove也会状态激活后每一帧调用,在Animator.OnAnimatorMove之后,用于处理或影响根动作(root motion)。
OnStateIK当设置动画IK(Inverse Kinematics反向动力学)时会调用,在Animator.OnAnimatorIK之后。
此外还有两个回调:
OnStateMachineEnter当进入状态机的时候会调用。
OnStateMachineExit当推出状态机的时候会调用。
我们还可以在Layer上添加StateMachineBehaviour,只要这一层上的某个状态满足了上面的那些时机时便会调用那些回调。
StateMachineBehaviour常常会用于:
1、当状态进入或退出时播放音效;
2、在适当的状态时执行特定的测试(例如着地检测);
3、激活并控制与某个状态相关联的特效。
示例,一个简单的音效组件:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateSound : StateMachineBehaviour {
public AudioClip EnterSound;
public AudioClip ExitSound;
private AudioSource _audioSource;
private AudioSource lazyGetAudioSource(Animator animator)
{
if (!_audioSource)
{
_audioSource = animator.GetComponent<AudioSource> ();
}
if (!_audioSource) {
_audioSource = animator.gameObject.AddComponent<AudioSource> ();
}
return _audioSource;
}
public override void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (EnterSound)
{
lazyGetAudioSource(animator).PlayOneShot (EnterSound);
}
}
public override void OnStateExit (Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (ExitSound)
{
lazyGetAudioSource(animator).PlayOneShot (ExitSound);
}
}
}
为Airborne添加并设置这个组件
(图中Jump和Land音效也包含在Characters包中)
相关文章推荐
- 【Unity3D 游戏开发之二】高级组件(GUI:LABEL、SCROLLVIEW、TEXTFIELD…等)入门篇
- [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单
- Unity3D开发小贴士(十一)ToLua协同程序
- Unity3D开发基础组件提取总结
- Angular开发(十五)-关于父子组件中投影的介绍
- 如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)
- Unity3D 游戏引擎之详解游戏开发音频的播放(十五)
- Unity3D开发小贴士(九)序列化和反序列化Dictionary
- Unity3D开发小贴士(十八)各种事件的执行顺序
- 【UNITY3D 游戏开发之二】高级组件(GUI:LABEL、SCROLLVIEW、TEXTFIELD…等)入门篇 推荐
- Unity3d开发(十五) AudioClip 参数解析
- Unity3D开发基础组件提取总结
- Unity3D开发小贴士(十)雾效
- Unity3D开发小贴士(三)愉快的使用Lua开发
- 如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)
- Unity3D游戏开发框架-FSM状态机的实现
- Unity3d开发(十六) 重写UGUI组件
- Unity3D开发小贴士(十四)JsonUtility
- Unity3D开发小贴士(七)Lua里扩展C#对象
- Unity3D开发小贴士(八)tolua库