Unity3D开发小贴士(十五)状态机组件
来源:互联网 发布:酒吧霸屏软件 编辑:程序博客网 时间:2024/05/06 16:04
在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包中)
0 0
- Unity3D开发小贴士(十五)状态机组件
- Unity3d开发(十五) AudioClip 参数解析
- Unity3d开发(十六) 重写UGUI组件
- unity3d 游戏人工智能开发之状态机(C#模板与示例)
- unity3D游戏开发十五之NGUI二
- unity3D游戏开发十五之NGUI二
- unity3D游戏开发十五之NGUI二
- Unity3d编程,简易状态机(fsm)
- Unity3D游戏开发框架-FSM状态机的实现
- Unity3D 游戏引擎之详解游戏开发音频的播放(十五)
- 如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)
- Unity3D研究院之详解游戏开发音频的播放(十五)
- 如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)
- Unity3d学习 状态机
- 动画状态机Animator-Unity3d
- unity3d中使用状态机
- Unity3D c# 状态机封装
- Unity3D学习笔记(十五)脚本:HelloWorld!
- commons-io之LineIterator
- centos6.8安装zabbix3.2
- 哇,你也想自由职业啊
- 2 分钟读懂大数据框架 Hadoop 和 Spark 的异同
- 生产制造追溯系统-条码打印
- Unity3D开发小贴士(十五)状态机组件
- AJax学习笔记
- 【LeetCode】 083. Remove Duplicates from Sorted List
- 北航程序设计决赛(虽然。。。。但是)补题。
- 软件开发中涉及操作系统知识总结—线程、进程与协程
- Leetcode 368. Largest Divisible Subset
- Java基本类型(一)
- 第三周练习计划
- 向SQL数据库中插入多条数据