教育网站建设平台,雨花区网站建设,小视频解析网站怎么做,医院网站建设套餐方案1 有限状态机简介
有限状态机#xff08;英语#xff1a;finite-state machine#xff0c;缩写#xff1a;FSM#xff09;#xff0c;简称状态机#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型
在游戏开发中应用有限状态机#xff… 1 有限状态机简介
有限状态机英语finite-state machine缩写FSM简称状态机是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型
在游戏开发中应用有限状态机能够将复杂的行为逻辑分解为一组简单的状态和转换规则每个状态都可以独立地处理其逻辑使代码更加结构化和组织化。同时可以方便的添加新的状态和转换规则以适应游戏的需求。而且避免了在每帧中检查所有可能的行为只需要处理当前状态的逻辑
Unity 中的 Animator Controller 使用状态机来管理各种动画状态和它们之间的过渡。但角色处于不同的状态时除了播放对应的动画外也会执行相关的逻辑使用状态机来控制角色的行为也会为开发带来很大的便利
2 动画状态机
1 动画工作流程
Unity 的动画系统基于动画剪辑的概念动画剪辑包含某些对象应如何随时间改变其位置、旋转或其他属性的相关信息。每个剪辑可视为单个线性录制。来自外部的动画剪辑由美术师或动画师使用第三方工具例如 Autodesk® 3ds Max® 或 Autodesk® Maya®创建而成或者来自动作捕捉工作室或其他来源
然后动画剪辑将编入称为 Animator Controller 的一个类似于流程图的结构化系统中。Animator Controller 充当状态机负责跟踪当前应该播放哪个剪辑以及动画应该何时改变或混合在一起 2 动画状态机
角色或其他动画游戏对象通常具有若干不同的动画这些动画对应于该角色或对象可在游戏中执行的不同动作。例如角色可以在空闲时轻微呼吸或摇摆在得到指令时行走以及从平台上跌落时恐慌地抬起手臂。Mecanim 使用类似于流程图的可视化布局系统来表示状态机从而控制需要在角色或对象上使用的动画剪辑并对这些动画剪辑排序
状态机的基本思想是使角色在某一给定时刻进行一个特定的动作。动作类型可因游戏类型的不同而不同常用的动作包括空闲、行走、跑步、跳跃等其中每一个动作被称为一种状态。在某种意义上角色处于行走、空闲或者其它的状态中。一般来说角色从一个状态立即切换到另一个状态是需要一定的限制条件的。比如角色只能从跑步状态切换到跑跳状态而不能直接由静止状态切换到跑跳状态。角色从当前状态进入下一个状态的选项被称为状态过渡条件。状态集合、状态过渡条件以及记录当前状态的变量放在一起形成了一个状态机
状态及其过渡条件可以通过图形来表达其中的节点表示状态而弧线节点间的箭头表示状态过渡。可以将当前状态视为放置在节点之一上的标记或亮点然后只能沿箭头之一跳转到另一个节点 状态机对于动画的重要意义在于用户可以通过很少的代码对状态机进行设计和升级。每一个状态有一个与之关联的运动只要状态机处于此状态就会播放此运动。从而让动画师或设计师方便地定义动作顺序而不必去关心底层代码的实现
Unity 的动画状态机提供了一种纵览角色所有动画剪辑的方法并且允许通过游戏中的各种事件如用户输入来触发不同的动画效果
动画状态机可以通过 Animator Controller 窗口来创建这些状态机如下所示 动画状态机包括动画状态、动画过渡和动画事件而复杂的状态机还可以含有简单的子状态机更多信息请参阅文档「https://docs.unity3d.com/cn/2021.2/Manual/AnimationOverview.html」
3 Animator Controller
1 创建资源
Animator Controller 资源是在 Unity 内创建的可以为角色或对象维护一组动画更多信息请参阅「https://docs.unity3d.com/cn/2021.2/Manual/Animator.html」 可通过以下方式创建 Animator Controller 从 Project 视图中选择 Create Animator Controller 在 Project 视图中右键单击并选择 Create Animator Controller 从 Assets 菜单中选择 Assets Create Animator Controller
2 查看视图
在 Animator 窗口中可创建、查看和修改 Animator Controller 资源视图内使用鼠标中键或按住 Alt/Option 键拖拽可平移视图更多信息请参阅文档「https://docs.unity3d.com/cn/2021.2/Manual/AnimatorWindow.html」 可通过以下方式查看 Animator Controller 视图 从 Assets 菜单中选择 Window Animation Animator 双击 Animator Controller 资源
3 整理状态
双击角色的 Animator Controller可以看到对应的状态机当前状态机会把所有的动作依次执行一遍 游戏中暂时需要的状态包括: idle、move、attack、define、skill、die可以整理已经存在的状态也可以新建状态 整理状态断开转换选中状态或者箭头点击号 新建状态拖动动画资源到窗口自动创建状态
整理后的状态机 3 行为状态机
在 Animator Controller 中可以看到每个状态机包含多个状态节点每个状态节点包含一个状态及多个转换 选中转换查看转换信息每个转换包含多个过渡条件同时转换需要有来源及目标即从什么状态转换到什么状态 了解 Unity 的动画状态机后根据这些基本要素构建行为状态机
1 过渡条件
从当前状态进入下一个状态的选项被称为状态过渡条件因此条件类中需要一个有返回值的函数的委托来判定是否进入目标状态
public class Condition
{private Funcbool _func { get; }public Condition(Funcbool func){_func func;}public bool Evaluate() _func.Invoke();
}2 转换
转换中包含目标状态及过渡条件
public class TransitionTEnum where TEnum : Enum
{public TEnum To { get; }public Condition Condition { get; }public Transition(TEnum to, Condition condition){To to;Condition condition;}
}3 状态
状态中包含进入、更新、退出等事件为了与角色调用方便额外增加状态所属者
public class StateTOwner where TOwner : class
{public readonly TOwner Owner;public State(TOwner owner){Owner owner;}public virtual void OnEnter(){}public virtual void OnUpdate(){}public virtual void OnFixedUpdate(){}public virtual void OnExit(){}
}4 状态节点
状态及其对应的转换构成一个状态节点
public class StateNodeTEnum, TOwner where TEnum : Enum where TOwner : class
{public TEnum Key { get; }public StateTOwner State { get; }public HashSetTransitionTEnum Transitions { get; }public StateNode(TEnum key, StateTOwner state){Key key;State state;Transitions new HashSetTransitionTEnum();}public void AddTransition(TEnum to, Condition condition){Transitions.Add(new TransitionTEnum(to, condition));}
}5 状态机
状态集合、状态过渡条件以及记录当前状态的变量放在一起形成了一个状态机