当前位置: 首页 > news >正文

Unity 虚拟仿真实验中设计模式的使用 ——命令模式(Command Pattern)

📖 目录

  1. 前言

  2. 什么是命令模式

  3. 案例背景:虚拟仿真实验中的操作管理

  4. 案例效果图(示意)

  5. 代码实现

    • 5.1 命令接口:ICommand

    • 5.2 具体命令类:HeatCommand / CoolCommand

    • 5.3 调用者:CommandInvoker

    • 5.4 接收者:WaterHeater

    • 5.5 UI 控制:按钮触发命令

  6. 运行流程

  7. 注意事项总结

  8. 扩展思考

  9. 总结


1. 前言

在虚拟仿真实验中,实验对象的操作可能需要:

  • 记录操作顺序

  • 撤销/重做操作

  • 队列化操作执行

如果直接在 UI 里写逻辑,操作管理会混乱。

命令模式(Command Pattern) 可以把操作封装成对象,使得操作可 记录、撤销、排队,且 调用者与接收者解耦


2. 什么是命令模式

命令模式:将一个请求封装成对象,从而使你可用不同的请求、队列化请求或记录请求日志,以及支持可撤销操作。

优点

  • 解耦调用者和接收者

  • 可以记录、撤销或重做操作

  • 易于扩展新操作


3. 案例背景:虚拟仿真实验中的操作管理

  • 实验对象:水壶

  • 可操作行为:

    1. 加热(HeatCommand)

    2. 冷却(CoolCommand)

  • UI 点击按钮 → 创建命令 → 执行

  • 可以撤销操作 → 返回上一个状态


4. 案例效果图(示意)

[加热按钮] → HeatCommand → 水温升高
[冷却按钮] → CoolCommand → 水温下降
[撤销按钮] → 回到上一个状态

5. 代码实现

5.1 命令接口:ICommand

public interface ICommand
{void Execute();void Undo();
}

5.2 具体命令类

HeatCommand

using UnityEngine;public class HeatCommand : ICommand
{private WaterHeater receiver;private float previousTemp;public HeatCommand(WaterHeater receiver){this.receiver = receiver;}public void Execute(){previousTemp = receiver.Temperature;receiver.Heat();}public void Undo(){receiver.SetTemperature(previousTemp);}
}

CoolCommand

using UnityEngine;public class CoolCommand : ICommand
{private WaterHeater receiver;private float previousTemp;public CoolCommand(WaterHeater receiver){this.receiver = receiver;}public void Execute(){previousTemp = receiver.Temperature;receiver.Cool();}public void Undo(){receiver.SetTemperature(previousTemp);}
}

5.3 调用者:CommandInvoker

using System.Collections.Generic;public class CommandInvoker
{private Stack<ICommand> commandHistory = new Stack<ICommand>();public void ExecuteCommand(ICommand command){command.Execute();commandHistory.Push(command);}public void Undo(){if (commandHistory.Count > 0){ICommand command = commandHistory.Pop();command.Undo();}}
}

5.4 接收者:WaterHeater

using UnityEngine;public class WaterHeater : MonoBehaviour
{public float Temperature { get; private set; } = 20f;public void Heat(){Temperature += 10f;Debug.Log($"加热中,温度:{Temperature}℃");}public void Cool(){Temperature -= 10f;Debug.Log($"冷却中,温度:{Temperature}℃");}public void SetTemperature(float temp){Temperature = temp;Debug.Log($"撤销操作,温度恢复:{Temperature}℃");}
}

5.5 UI 控制:按钮触发命令

using UnityEngine;
using UnityEngine.UI;public class CommandUI : MonoBehaviour
{[SerializeField] private Button heatButton;[SerializeField] private Button coolButton;[SerializeField] private Button undoButton;[SerializeField] private WaterHeater waterHeater;private CommandInvoker invoker = new CommandInvoker();private void Start(){heatButton.onClick.AddListener(() =>{invoker.ExecuteCommand(new HeatCommand(waterHeater));});coolButton.onClick.AddListener(() =>{invoker.ExecuteCommand(new CoolCommand(waterHeater));});undoButton.onClick.AddListener(() =>{invoker.Undo();});}
}

6. 运行流程

  1. 玩家点击 加热按钮 → 创建 HeatCommand → 执行 → 温度升高

  2. 玩家点击 冷却按钮 → 创建 CoolCommand → 执行 → 温度下降

  3. 玩家点击 撤销按钮 → 弹出栈顶命令 → 调用 Undo → 恢复上一次状态


7. 注意事项总结

  • 撤销操作需记录状态:在 Execute 前保存当前状态

  • 命令对象独立:命令类只调用接收者方法,不处理 UI

  • 调用者解耦接收者:UI 或系统只与 CommandInvoker 交互


8. 扩展思考

  • 可以结合 对象池模式,回收命令对象,减少 GC

  • 可以记录操作序列 → 实现实验回放

  • 可以结合 观察者模式 → UI 或日志自动更新


9. 总结

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

  • 使用 命令模式 封装实验操作

  • 支持撤销操作,操作管理清晰

  • 调用者和接收者解耦,易于扩展新操作

👉 命令模式在虚拟实验系统中,非常适合操作管理、撤销与回放功能,提升实验交互体验。

http://www.dtcms.com/a/411728.html

相关文章:

  • 海口专业网站建设公司重庆建站费用
  • 深度学习(6)python数据处理
  • 何做好网站建设销售中小学网站建设方案
  • 【实时Linux实战系列】延迟 SLI/SLO/SLA 设计与观测体系
  • NetworkPolicy 工作原理详解
  • Matlab通过GUI实现点云的中值滤波(附最简版)
  • 网站篡改搜索引擎js网站 目录 结构
  • 企业网站设计行业crm管理系统定制
  • 论文《Inference for Iterated GMM Under Misspecification》的例子3
  • 计算机图形图像技术实验报告
  • 编译DuckDB c++插件模板并加载运行
  • 做logo什么网站河田镇建设局网站
  • OA、PMES、TMES、SAP、PPM、CRM、DMS、HR系统
  • C语言 ——— 指针
  • 内力网站建设seo简单优化
  • 大模型-自编码器(AutoEncoder)原理(上)
  • Promise开发【进阶】
  • 建立网站需要备案吗网络科技公司起名字大全免费
  • solidworks ppo 试做1
  • Matter over Thread方案,如何助力智能家居生态互通?
  • 创办网站需要怎么做wordpress 点评类网站
  • 网站开发与运营怎么样0基础网站开发
  • mp3链接地址制作网站网站建设与开发选题
  • Dify 从入门到熟悉100 天的学习大纲
  • 为什么做的网站要续费东莞cms建站模板
  • 安徽省高速公路建设指挥部网站为什么实验楼网站上做实验这么卡
  • Java Web应用开发——第一章:Java Web概述测验
  • 北京网站建设哪家好免费正能量不良网站推荐
  • 高端网站建设公司有哪些项目南京房地产开发公司
  • 网络编程