Unity高级——状态机——Switch状态机

Unity高级——状态机——Switch状态机

我们将要学习的内容是Switch状态机,前一节我们通过if写了一个简单的功能,就是开关灯的功能,但是开关灯的功能,并不能称之为完整的状态机,虽然说它包含了状态机中所必须的元素或者概念。比如里面也呈现了一些状态的过程……但是它并不是一个完整的状态机

 

最最简单的一个的状态机,一般我们都会使用Switch语句去实现,因为我们使用Switch的时候,会和枚举一起使用,用枚举来表示我们的状态机中不同的状态。然后用Switch来判断,当前处于什么状态再来解决应该选择哪些逻辑代码进行执行。Switch本身就是一个分支语句。


using UnityEngine;
using System.Collections;

public class LightController : MonoBehaviour {

    private Light _light;

    void Awake(){
        _light = GetComponent<Light> ();
    }

    void  Update(){
        //当前的脚步就是状态机
        //用户按键时间就是状态切换的条件——事件
        if(Input.GetKeyDown(KeyCode.O)){

            //灯的光强从0变为1时,就是状态的过渡

### Unity有限状态机 (FSM) 的设计与实现 #### 定义状态枚举 (State Enum) 为了清晰地管理和识别不同状态,在项目中创建一个 `enum` 来列举所有可能的状态。这有助于提高代码可读性和维护性。 ```csharp public enum CharacterStates { Idle, Walking, Running, Jumping, Falling } ``` 此段定义了角色可以进入的不同状态,如闲置、行走、奔跑、跳跃和下落等[^1]。 #### 创建状态接口 (State Interface) 通过定义公共接口来统一各个状态下所需执行的操作,确保每种状态都遵循相同的标准流程: ```csharp public interface ICharacterState { void Enter(CharacterController controller); void Update(CharacterController controller); void Exit(CharacterController controller); } ``` 上述接口规定了每个具体状态应具备的功能——当进入该状态时做什么 (`Enter`);在每一帧更新期间做什么(`Update`);以及离开当前状态前要完成哪些工作(`Exit`)[^3]。 #### 编写具体状态类 (Concrete State Classes) 针对每一个特定场景下的行为需求,继承自之前提到的接口并填充具体的逻辑处理函数。这里以步行为例展示了一个简单的实现方式: ```csharp public class WalkState : MonoBehaviour, ICharacterState { private float speed = 5f; public void Enter(CharacterController controller){ Debug.Log("Start walking..."); } public void Update(CharacterController controller){ Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")); transform.Translate(moveDirection * Time.deltaTime * speed); } public void Exit(CharacterController controller){ Debug.Log("Stop walking."); } } ``` 这段代码展示了如何让游戏角色响应玩家输入而移动,并且记录下了进出这个动作的时间点以便调试或日志跟踪[^2]。 #### 构建状态机类 (State Machine Class) 最后一步就是构建实际负责协调这些状态之间转换的核心组件—状态机本身。它不仅保存着现在所处的位置信息,还承担起了监听外部事件触发条件从而决定何时变更至下一个目标位置的任务。 ```csharp using System.Collections.Generic; using UnityEngine; public class CharacterStateMachine : MonoBehaviour { Dictionary<CharacterStates,ICharacterState> statesDict = new(); private ICharacterState currentState; void Start(){ // 初始化所有的状态实例并将它们存入字典中方便查找访问 statesDict.Add(CharacterStates.Idle,new IdleState()); statesDict.Add(CharacterStates.Walking,new WalkState()); SwitchTo(CharacterStates.Idle); } void Update(){ if(currentState != null){ currentState.Update(this.GetComponent<CharacterController>()); } } public void SwitchTo(CharacterStates newState){ if(currentState!=null){ currentState.Exit(this.GetComponent<CharacterController>()); } currentState = statesDict[newState]; currentState.Enter(this.GetComponent<CharacterController>()); Debug.Log($"Switched to state:{newState}"); } } ``` 以上实现了基本的状态切换机制,其中包含了初始化阶段加载各种预设好的状态对象到内存里去等待被激活的过程;还有每次改变当前位置前后都会调用相应的方法通知给定的对象做好准备工作的细节描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值