尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Unity 虚拟仿真实验中设计模式的利用 —— 观察者模式(Observer Pattern)

Unity 虚拟仿真实验中设计模式的利用 —— 观察者模式(Observer Pattern)
📅 发布时间:2026/6/20 12:23:30

目录

  1. 前言

  2. 什么是观察者模式

  3. 案例背景:虚拟仿真水温实验

  4. 案例效果图(示意)

  5. 代码实现

    • 5.1 被观察者:WaterHeater

    • 5.2 观察者:ThermometerUI

    • 5.3 观察者:ExperimentLogger

    • 5.4 观察者:BoilingAlert

    • 5.5 UI 控制:HeatButton

  6. 运行流程

  7. 注意事项总结

  8. 扩展思考

  9. 总结


1. 前言

在 虚拟仿真实验 或 教学类项目 中,经常会遇到类似的场景:

  • 实验数据变化时,需要同时更新 UI、日志、提示系统。

  • 如何做到 解耦,避免系统间的强依赖?

答案就是:观察者模式(Observer Pattern)。

本文通过一个 Unity Demo 案例,带大家学习观察者模式在虚拟仿真中的应用。


2. 什么是观察者模式

观察者模式:定义了一种 一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。

在 Unity 中,通常通过 事件(event)或委托(delegate) 来实现。


3. 案例背景:虚拟仿真水温实验

我们实现一个 加热水温实验:

  • 玩家点击按钮加热水温(被观察者)。

  • 水温变化时:

    1. 温度计 UI 实时更新

    2. 实验日志记录变化

    3. 超过 100℃ 时提示“水已沸腾”

这个场景中,“水温”就是 被观察者,UI/日志/提示系统就是 观察者。


4. 案例效果图(示意)

[按钮:加热]↓
[当前温度:80℃]   ← 温度计 UI 更新
[日志:温度变化为 80℃]  ← 日志记录
[提示:未沸腾]   ← 警告系统未触发

点击按钮后,温度升高 10℃,所有观察者自动收到通知。


5. 代码实现

5.1 被观察者:WaterHeater(加热器)

using System;
using UnityEngine;
public class WaterHeater : MonoBehaviour
{public event Action OnTemperatureChanged; // 事件:温度变化通知private int temperature = 20; // 初始温度public void HeatUp(){temperature += 10;Debug.Log($"[WaterHeater] 当前温度: {temperature}℃");OnTemperatureChanged?.Invoke(temperature); // 通知所有观察者}public int GetTemperature() => temperature;
}

5.2 观察者:ThermometerUI(温度计 UI)

using UnityEngine;
using UnityEngine.UI;
public class ThermometerUI : MonoBehaviour
{[SerializeField] private Text temperatureText;[SerializeField] private WaterHeater waterHeater;private void OnEnable(){waterHeater.OnTemperatureChanged += UpdateUI;}private void OnDisable(){waterHeater.OnTemperatureChanged -= UpdateUI;}private void UpdateUI(int temperature){temperatureText.text = $"温度: {temperature}℃";}
}

5.3 观察者:ExperimentLogger(实验日志)

using UnityEngine;
public class ExperimentLogger : MonoBehaviour
{[SerializeField] private WaterHeater waterHeater;private void OnEnable(){waterHeater.OnTemperatureChanged += LogTemperature;}private void OnDisable(){waterHeater.OnTemperatureChanged -= LogTemperature;}private void LogTemperature(int temperature){Debug.Log($"[ExperimentLogger] 记录日志:温度变化为 {temperature}℃");}
}

5.4 观察者:BoilingAlert(沸腾提示)

using UnityEngine;
public class BoilingAlert : MonoBehaviour
{[SerializeField] private WaterHeater waterHeater;private void OnEnable(){waterHeater.OnTemperatureChanged += CheckBoiling;}private void OnDisable(){waterHeater.OnTemperatureChanged -= CheckBoiling;}private void CheckBoiling(int temperature){if (temperature >= 100){Debug.Log("[BoilingAlert] ⚠️ 水已沸腾!");}}
}

5.5 UI 控制:HeatButton(按钮)

using UnityEngine;
using UnityEngine.UI;
public class HeatButton : MonoBehaviour
{[SerializeField] private Button heatButton;[SerializeField] private WaterHeater waterHeater;private void Start(){heatButton.onClick.AddListener(() => waterHeater.HeatUp());}
}

6. 运行流程

  1. 玩家点击 加热按钮 → WaterHeater.HeatUp()

  2. OnTemperatureChanged 事件触发

  3. 所有观察者收到通知:

    • ThermometerUI 更新 UI

    • ExperimentLogger 写日志

    • BoilingAlert 检查是否沸腾

解耦效果:

  • WaterHeater 只负责 通知,不关心谁在监听。

  • 观察者们只关心自己逻辑,随时可新增/移除。


7. 注意事项总结

  • 事件解绑:
    使用 OnDisable 取消订阅,避免内存泄漏或空引用错误。

  • 事件为空判断:
    使用 OnTemperatureChanged?.Invoke(value),避免 NullReferenceException。

  • 避免强依赖:
    WaterHeater 不直接调用 UI / 日志 / 提示,而是通过事件通知。


8. 扩展思考

  • 可以新增 成绩统计系统,订阅水温变化来计算实验得分。

  • 可以新增 数据上传系统,把实验数据同步到后台。

  • 可以改为 ScriptableObject Event,进一步解耦 UI 和逻辑。


9. 总结

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

  • 如何用 观察者模式 解耦系统之间的依赖

  • 如何通过 事件机制 在 Unity 中实现一对多通知

  • 如何把这个模式应用到虚拟仿真实验中(UI、日志、提示、成绩等系统)

这就是 Unity 中观察者模式的最佳实践!

相关新闻

  • shader func
  • 2025 年碟式离心机厂家 TOP 企业品牌推荐排行榜,DB640 系列 / DB330 系列 / DB440 系列 / DB460 系列 / DB550 系列 / 专业碟式离心机推荐这十家公司!
  • 20231408徐钰涵课程思维导图Openssl实践

最新新闻

  • IPXWrapper:让经典游戏在Windows 11重获联机生命的终极方案
  • 北京昌平离婚律所哪家好:3维度甄别昌平专业婚姻律师团 - 品牌2026
  • 本地 AI 写作环境搭建:Ollama + Open WebUI + Serper 实战记录
  • 深度剖析qrcode.vue:从技术选型到架构设计的性能优化实践
  • 3分钟免费安装VideoDownloadHelper:简单视频下载插件终极指南
  • 暗黑破坏神2存档编辑器终极教程:三步掌握角色与装备自由定制

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号