Unity 虚拟仿真实验中设计模式的使用 ——状态模式(State Pattern)

📖 目录

  1. 前言

  2. 什么是状态模式

  3. 案例背景:虚拟仿真实验中的仪器状态管理

  4. 案例效果图(示意)

  5. 代码实现

    • 5.1 状态接口:IState

    • 5.2 具体状态类:IdleState / HeatingState / BoilingState

    • 5.3 状态管理器:WaterStateMachine

    • 5.4 UI 控制:状态切换按钮

  6. 运行流程

  7. 注意事项总结

  8. 扩展思考

  9. 总结


1. 前言

在虚拟仿真实验中,实验对象通常会有 多种状态,比如:

  • 水壶:空闲、加热、沸腾

  • 烧杯:空、注入液体、混合

  • 仪器:待机、运行、故障

如果用 大量 if-else 判断状态,代码会混乱且难以维护。

状态模式(State Pattern) 可以把对象的每个状态封装成类,实现 状态切换灵活、行为清晰


2. 什么是状态模式

状态模式 :允许对象在内部状态变化时改变行为,使得对象看起来好像 改变了类

优点

  • 每个状态独立,易于维护

  • 避免大量 if-else

  • 状态切换灵活,可扩展


3. 案例背景:虚拟仿真实验中的仪器状态管理

  • 我们用 加热水实验 作为例子

  • 水壶状态:

    1. Idle:水温 < 20℃,未加热

    2. Heating:温度升高 20~100℃

    3. Boiling:温度 >= 100℃

  • 不同状态下,仪器行为不同:

    • Idle:显示等待

    • Heating:UI 显示加热动画

    • Boiling:提示沸腾、触发事件


4. 案例效果图(示意)

css 复制代码
[加热按钮] → 水壶状态变化
Idle → Heating → Boiling
每个状态显示不同UI/提示

5. 代码实现

5.1 状态接口:IState

cs 复制代码
public interface IState
{
    void Enter();   // 进入状态
    void Execute(); // 状态行为
    void Exit();    // 退出状态
}

5.2 具体状态类

IdleState

cs 复制代码
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

cs 复制代码
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

cs 复制代码
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

cs 复制代码
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 控制:状态切换按钮

cs 复制代码
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. 运行流程

  1. 初始状态:Idle

  2. 点击 加热按钮 → 状态切换到 Heating

  3. 温度持续上升,HeatingState.Execute 检测温度

  4. 温度 >= 100 → 状态切换到 Boiling

  5. 每个状态 Enter/Execute/Exit 行为独立


7. 注意事项总结

  • 每个状态类应只关注自身行为

  • 状态切换统一通过 ChangeState() 管理

  • 避免在状态类中直接操作其他状态

  • Update 内只调用当前状态 Execute


8. 扩展思考

  • 可以结合 观察者模式,状态变化通知 UI/日志

  • 可以结合 策略模式,不同实验对象有不同加热策略

  • 可以增加 Idle→CoolingState,模拟自然冷却


9. 总结

通过这个虚拟仿真案例,你学会了:

  • 使用 状态模式 管理实验对象行为

  • 每个状态独立、可扩展

  • 避免大量 if-else,使虚拟实验逻辑清晰

👉 状态模式 + 观察者模式 可以让虚拟实验系统既灵活又可维护。

相关推荐
SmalBox3 小时前
【光照】[PBR][镜面反射]实现方法解析
unity·渲染
float_六七3 小时前
Nginx反向代理核心原理揭秘
运维·nginx·状态模式
Robbie丨Yang5 小时前
【Unity 入门教程】四、如何制作一个 Perfab
unity·游戏引擎
hai_qin5 小时前
五,设计模式-生成器/建造者模式
设计模式
da_vinci_x6 小时前
告别手动“拼图”:AI+自动化游戏UI雪碧图(Sprite Sheet)工作流
人工智能·游戏·设计模式·prompt·aigc·技术美术·游戏美术
爱吃小胖橘6 小时前
Unity-动画IK控制
3d·unity·c#·游戏引擎
想睡hhh7 小时前
网络实践——基于epoll_ET工作、Reactor设计模式的HTTP服务
网络·http·设计模式·reactor·epoll
徐小夕@趣谈前端13 小时前
如何实现多人协同文档编辑器
javascript·vue.js·设计模式·前端框架·开源·编辑器·github
Ziegler Han15 小时前
Unity入门:给Image添加图片
unity·游戏引擎