# WentStateMachine **Repository Path**: lindogames/WentStateMachine ## Basic Information - **Project Name**: WentStateMachine - **Description**: 利用UnityAnimator来编辑的StateMachine,editor下可以利用animator来达到可视化编辑,debug。runtime下把animator导出为scriptableobject来存储数据,并有独立的驱动器,可以完全脱离animator运行。(解决了addressable加载AnimatorController为空的bug)。 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-11-26 - **Last Updated**: 2021-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. # WentStateMachine ## Features 1. 读取Animator状态机配置,保存为ScriptableObject,避免Addressable无法加载animatorController的错误。 2. 可用Animator来进的状态机可视化Debug。 3. 由于去除了动画相关功能,运行在非Animator下更高效。 4. 自动Instantiate各个ScriptableObject组件,防止ScriptableObject在多个状态机之间被引用。因此同一个状态机可以运行多个实例互不干扰。 ## Defects 1. 不支持当前状态机的默认State,不在当前状态机(考虑增加) 2. 不支持Transition的时间设置 3. IStateInfo接口方法的行为与AnimatorStateInfo同名方法行为不一致,可能导致错误的Debug结果(考虑修复) ## Usage 1. 使用Aniamtor进行状态机配置 2. 继承 ``` StateBehaviour``` 来实现State脚本,如果要配置参数,请实现 ``OnStateGUI`` 方法,并用`` #if UNITY_EDITOR #endif`` 包裹。 3. Animator 中的 State,添加 ``WentStateMachineBehaviour`` 组件,在组件内,选择要绑定的 ```StateBehaviour``` 。此时已经可以手动创建Animator组件来测试状态机。 4. Create -> WentStateMachine -> StateMachineController 在 ``StateMachineController `` 中选择要复制的AnimatorController 点击 Generate 按钮。 5. 在脚本中,根据需要实例化 `` MonobehaviourRuntimeDriver`` 或 `` AnimatorDriver`` ,并调用 ``Drive`` 方法驱动状态机(AnimatorDriver 只用于 Editor 测试) ```c# if (stateMachineDriver == null) { var gameObject = GameObject.Find("CardBattleStateManager"); if(!gameObject) gameObject = new GameObject("CardBattleStateManager"); if (MONO_DRIVER) { stateMachineDriver = gameObject.GetComponent(); if(stateMachineDriver == null) stateMachineDriver =gameObject.AddComponent(); } else { #if UNITY_EDITOR stateMachineDriver = gameObject.GetComponent(); if(stateMachineDriver == null) stateMachineDriver = gameObject.AddComponent(); #else Debug.LogError("Can not use animator driver out of editor environment."); #endif } } var controller = stateMachineDriver.Drive(context.BattleData.BattleStateMachine); controller.SetGlobalParam("Context", "context"); controller.Play(Consts.Param.START, 0); controller.Start(); ``` 6. 可以用 ``SetGlobalParam`` / `` GetGlobalParam`` 方法来设置/获取当前状态机的全局参数,其他方法行为与Animator相同。