教学网站在线自测功能怎么做,公司网站 源码,什么是企业qq什么是营销qq,宁陵做网站#x1f4d6; 目录前言什么是状态模式案例背景#xff1a;虚拟仿真实验中的仪器状态管理案例效果图#xff08;示意#xff09;代码实现5.1 状态接口#xff1a;IState5.2 具体状态类#xff1a;IdleState / HeatingState / BoilingState5.3 状态管理器#xff1a;Water… 目录前言什么是状态模式案例背景虚拟仿真实验中的仪器状态管理案例效果图示意代码实现5.1 状态接口IState5.2 具体状态类IdleState / HeatingState / BoilingState5.3 状态管理器WaterStateMachine5.4 UI 控制状态切换按钮运行流程注意事项总结扩展思考总结
1. 前言在虚拟仿真实验中实验对象通常会有 多种状态比如水壶空闲、加热、沸腾烧杯空、注入液体、混合仪器待机、运行、故障如果用 大量 if-else 判断状态代码会混乱且难以维护。状态模式State Pattern 可以把对象的每个状态封装成类实现 状态切换灵活、行为清晰。
2. 什么是状态模式状态模式允许对象在内部状态变化时改变行为使得对象看起来好像 改变了类。优点每个状态独立易于维护避免大量 if-else状态切换灵活可扩展
3. 案例背景虚拟仿真实验中的仪器状态管理我们用 加热水实验 作为例子水壶状态Idle水温 20℃未加热Heating温度升高 20~100℃Boiling温度 100℃不同状态下仪器行为不同Idle显示等待HeatingUI 显示加热动画Boiling提示沸腾、触发事件
4. 案例效果图示意
[加热按钮] → 水壶状态变化
Idle → Heating → Boiling
每个状态显示不同UI/提示5. 代码实现5.1 状态接口IState
public interface IState
{void Enter(); // 进入状态void Execute(); // 状态行为void Exit(); // 退出状态
}5.2 具体状态类IdleState
using UnityEngine;public class IdleState : IState
{private WaterStateMachine water;public IdleState(WaterStateMachine water) { this.water water; }public void Enter() { Debug.Log(进入空闲状态); }public void Execute() { /* 等待加热 */ }public void Exit() { Debug.Log(退出空闲状态); }
}
HeatingState
using UnityEngine;public class HeatingState : IState
{private WaterStateMachine water;public HeatingState(WaterStateMachine water) { this.water water; }public void Enter() { Debug.Log(开始加热); }public void Execute(){water.Temperature 10 * Time.deltaTime;Debug.Log($加热中温度{water.Temperature:F1}℃);if (water.Temperature 100){water.ChangeState(new BoilingState(water));}}public void Exit() { Debug.Log(停止加热); }
}
BoilingState
using UnityEngine;public class BoilingState : IState
{private WaterStateMachine water;public BoilingState(WaterStateMachine water) { this.water water; }public void Enter() { Debug.Log(水已沸腾); }public void Execute() { /* 持续沸腾逻辑 */ }public void Exit() { Debug.Log(退出沸腾状态); }
}
5.3 状态管理器WaterStateMachine
using UnityEngine;public class WaterStateMachine : MonoBehaviour
{private IState currentState;public float Temperature { get; set; } 20f;private void Start(){ChangeState(new IdleState(this));}private void Update(){currentState?.Execute();}public void ChangeState(IState newState){currentState?.Exit();currentState newState;currentState?.Enter();}// 按钮点击调用public void StartHeating(){ChangeState(new HeatingState(this));}
}5.4 UI 控制状态切换按钮
using UnityEngine;
using UnityEngine.UI;public class WaterUI : MonoBehaviour
{[SerializeField] private Button heatButton;[SerializeField] private WaterStateMachine waterMachine;private void Start(){heatButton.onClick.AddListener(() waterMachine.StartHeating());}
}6. 运行流程初始状态Idle点击 加热按钮 → 状态切换到 Heating温度持续上升HeatingState.Execute 检测温度温度 100 → 状态切换到 Boiling每个状态 Enter/Execute/Exit 行为独立
7. 注意事项总结每个状态类应只关注自身行为状态切换统一通过 ChangeState() 管理避免在状态类中直接操作其他状态Update 内只调用当前状态 Execute
8. 扩展思考可以结合 观察者模式状态变化通知 UI/日志可以结合 策略模式不同实验对象有不同加热策略可以增加 Idle→CoolingState模拟自然冷却
9. 总结通过这个虚拟仿真案例你学会了使用 状态模式 管理实验对象行为每个状态独立、可扩展避免大量 if-else使虚拟实验逻辑清晰 状态模式 观察者模式 可以让虚拟实验系统既灵活又可维护。