unity3d 使用委托+事件 完成低耦合发送消息

WinForm嵌入Unity3D:打造工业级3D可视化桌面应用 在工业上位机、数据监控等传统桌面应用开发中,WinForm凭借其成熟的控件生态和快速开发能力,一直是构建复杂表单界面的首选。然而,当需求从静态数据展示升级到动态3D可视化时,传统的GDI+绘图技术便显得力不从心。此时,将实时3D渲染引擎集成到现有应用中,成为提升软件交互性和沉浸感的关键。通过进程间通信或原生窗口嵌入等技术,可以实现WinForm与3D引擎的高效数据交换与界面融合,从而在保留原有数据管理、硬件通信优势的同时,为应用注入强大的3D渲染、动画与交互能力。这种混合架构尤其适用于数字孪生、设备运维仿真 阅读详情

        最近在自学unity3d,看了网上的一些教学视频和小游戏按钮,感觉gameobject与gameobject 的消息传递,代码耦合性很强,因为我是开发as3的用的是面向对象的MVC思想,所以看到耦合性强的代码就有点强迫症去修改它,以下是用委托+事件做的一个低耦合的消息传递;不说废话,进入主题奋斗;


首先创建一个简单的场景,一个plane,放在上面的两个cube,其中一个cube(称为A)移动撞向另一个cube(称为B),撞了之后A向B发送 一个消息,能自定义消息的;


一个单例去保存委托和事件,(懂as3的朋友,这个单例相当一个事件的dispacter),代码如下

using UnityEngine;
using System.Collections;
/// <summary>
/// 单例
/// </summary>
public class EventDispacter{


//实例化单例
private static EventDispacter instance;


//定义委托事件,它定义了可以代表的方法的类型
/**碰撞检测*/
public delegate void CollisionHandler(DataType evt);
public event CollisionHandler CollisionHapend;  


private  EventDispacter(SingletonEnforcer enforcer){


}


public static EventDispacter getInstance()
{
if(instance==null)
{
instance=new EventDispacter(new SingletonEnforcer());
}
return instance;
}


public void sendCollisionHapend(DataType evt){
if(CollisionHapend!=null)CollisionHapend (evt);
}


}


class SingletonEnforcer {}



自定义消息的方法如下:

using UnityEngine;
using System.Collections;


public class DataType{
//定义委托事件发送消息的内容,或者其他东西
private string txt;

public string Txt{
get{return txt;}
set{txt=value; }
}
}


在A  cube这个物体的脚本中

using UnityEngine;
using System.Collections;


public class Cmain : MonoBehaviour {


//要传递的内容
private DataType d;


void OnTriggerEnter (Collider c){  
//print ("Cmaincrash");
//if (EventDispacter.getInstance().CollisionHapend) {
d = new DataType ();
d.Txt = "Success  to send a message!!";
   //发送事件
EventDispacter.getInstance().sendCollisionHapend(d);
//}
}  

// Update is called once per frame
void Update () {
transform.Translate (new Vector3 (1, 0, 0)*Time.deltaTime);
}
}

在B  cube中脚本如下:

using UnityEngine;
using System.Collections;


public class CSon : MonoBehaviour {


// Use this for initialization
void Start () {
//监听发送的事件
EventDispacter.getInstance().CollisionHapend+=dealFun;

}


// Update is called once per frame
void dealFun(DataType d) {
print (d.Txt);
}

void OnDestroy(){

  //移除发送的事件

//这个移除很重要,因为unity销毁的是只是自身的物体,对于这种事件的引用不会回收,如果销毁了该物体却不移除该事件监听的话则会提示

//该物体已经销毁却尝试去连接它,而且该事件监听一直会占着内存
EventDispacter.getInstance().CollisionHapend-=dealFun;

}


}



这样就完成了一个gameobject向另外一个或者多个gameobject发送消息,又不会产生强耦合的问题;

发这博文一是希望学unity3d的朋友觉得我哪里写得不好的话指出来,一起探讨,二是激励自己,自学需要动力啊哭

Unity3D毕业设计:构建可扩展的2D游戏架构与模块化实践 在游戏开发中,架构设计是确保项目可维护性和可扩展性的核心。通过解耦、模块化与数据驱动等原则,开发者能够构建清晰、灵活的系统结构。ECS(实体-组件-系统)与MVC(模型-视图-控制器)的混合架构,结合事件驱动通信,能有效降低代码耦合度,提升开发效率。这种架构在Unity3D中尤其适用于2D游戏项目,如横版跳跃或俯视角射击游戏,通过ScriptableObject实现数据驱动,便于调整游戏参数和扩展内容。本文以毕业设计为背景,探讨如何从零搭建一个模块化框架,帮助开发者避免“意大利面条式”代码,提升工程实践能力 阅读详情

相关推荐

Unity游戏开发架构设计:从源码剖析到模块化、事件系统与对象池实践

在Unity游戏开发中,模块化设计、事件系统和对象池是构建可维护、高性能项目的核心架构思想。模块化通过高内聚低耦合原则,将系统拆分为独立的功能模块,如资源管理、UI管理等,有效降低了代码的复杂性。事件系统基于观察者模式,实现了模块间的解耦通信,是架构设计的关键桥梁。对象池技术则通过复用GameObject实例,显著减少了实例化与销毁带来的性能开销和垃圾回收压力,是移动端和大型项目性能优化的基石。这些技术共同构成了现代Unity游戏框架的支柱,尤其适用于中大型项目的开发。通过剖析宣雨松源码等实战框架,开发者能

weixin_30607029的博客 384

高内聚,低耦合

搬家后的博客链接: IT客栈 www.itkezhan.org 这是软件工程中的概念     首先要知道一个软件是由多个子程序组装而成, 而一个程序由多个模块(方法)构成!     而内聚就是指程序内的各个模块之间的关系紧密程度, 偶合就是各个外部程序(子程序)之间的关系紧密程度.     所以很易明白,为什么要高内聚?模块之间的关系越紧密,出错就越少!低偶合?子程序间的关

failure01的专栏 2899

Unity脚本编程实战:从组件化到性能优化的完整开发指南

在游戏开发领域,脚本编程是连接游戏逻辑与引擎功能的核心桥梁。其本质是通过代码控制游戏对象的行为与交互,实现从基础操作到复杂系统的功能。从技术原理层面,现代游戏引擎普遍采用组件化架构,这要求开发者遵循高内聚、低耦合的设计原则,将功能拆分为独立模块。这种架构的价值在于提升代码的可维护性、可测试性与团队协作效率。在实际应用场景中,无论是角色控制、UI交互还是资源管理,组件化思维都能显著改善开发流程。例如,在实现动态UI系统时,结合对象池技术与动画插件(如DOTween)可以高效创建流畅的交互界面;而在处理复杂模型

weixin_33725270的博客 705

unity 脚本之间的优雅沟通方式

引用方式 我们现在有一个Role脚本来管理单个角色,一个RoleManager来控制整体的角色以及一个MapManager来变换位置,指示方位什么的 public class RoleManager : MonoBehaviour{ public static RoleManager Instance; [SerializeField] private Role _prefab; public List<Role> Roles{get; private set;

jkkk_的博客 4518

Unity有限状态机实战:告别面条代码,构建清晰角色控制逻辑

有限状态机(FSM)是一种经典的软件架构模式,通过将对象的行为分解为离散的“状态”并定义状态间的转换规则,来管理复杂逻辑。其核心原理在于“状态独立、转换明确”,每个状态封装特定行为,状态机负责协调切换。这一模式在游戏开发中价值显著,能有效解决角色控制、AI行为等场景下if-else嵌套带来的代码混乱问题,实现高内聚、低耦合。在Unity3D开发中,FSM常用于管理玩家角色的闲置、移动、攻击等状态,或处理UI流程、任务下载等场景。本文将以Unity为例,深入探讨如何从零构建一个可复用的FSM框架,涵盖状态基类

weixin_30607029的博客 534

YIUI框架深度解析:基于ET的数据驱动UI开发实践

在Unity游戏开发中,UI管理是构建复杂应用的核心挑战之一。传统命令式编程需要开发者手动操作每个UI组件,导致业务逻辑与视图层高度耦合,代码难以维护。数据驱动是一种先进的架构思想,它通过建立数据模型与UI组件之间的绑定关系,实现数据变化时UI的自动更新,从而将开发者的关注点从“如何操作UI”转移到“数据状态是什么”。这种模式显著提升了代码的可维护性和开发效率,尤其适用于状态频繁变化的游戏界面。YIUI框架正是这一思想在Unity UGUI上的工程化实践,它通过Model-View-Component的清晰

java天气 431

Unity3D开发之基于委托的消息框架开发

我们在开发项目的时候会发现,我们经常要在不同模块不同类之间调用函数。比如:我们在点击场景一个物体后,就需要对UI界面做一定的变化。通常最简单的方式是我们直接在面板绑定持有对更改界面的函数的对象。可是如果项目比较大,类比较多的情况下,我们会发现项目变得异常混乱。更改一点需求可能会牵一发而动全身。其实这就是代码的耦合性太高。 一.静态委托事件 如果项目很小,只有几处跨模块调用代码,我们通常会在方法...

Jay W的博客 1015

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 939

[Unity] C#使用委托和事件实现Unity消息中心(观察者模式)

最近在学习ue的gameplay框架设计和设计模式,再回过头看一下自己过去一年写的unity项目框架(屎山)代码,感慨良多。体会到了做游戏写脚本,语言语法只是表层功夫,学会它可以让游戏跑起来。走多远的关键,还是在数据结构/算法/设计模式的内功。过去一年,自己也看了很多unity教程,国内unity开发社区还是挺活跃的,新手阶段能在网上找到各种各样的教程。但学会教程≠会做项目,实践才是检验真理的第一出路。......

m0_51776409的博客 3477

2025年人形机器人产业研究

人形机器人是一种模仿人类外形、动作和行为的机器人,旨在替代或辅助人类完成各种任务。其显著特征包括人类外形、动作模仿和智能交互能力。根据形态和功能,人形机器人可分为小型、中型、大型以及服务型、工业型、救援型和娱乐型等类别。发展历程经历了初始阶段、高度集成系统阶段和突破性进展阶段,技术不断进步。关键技术包括执行系统、控制系统和感知与交互系统,涉及机械结构、运动控制、平衡控制、任务执行控制以及感知与交互能力。主要研究方向包括外部仿人化和内部仿生,前者关注外观设计、动作控制和任务执行能力,后者致力于模拟人类核心机制

一名80后IT人的成长记录,记录自己在工作、学习中的点点滴滴,在成长的喜悦与忧心的故事里,铭记反脆弱的勇气。 1567

使用Qt Creator调用eBUS SDK

在新界面,勾选左下角“ Show unreachable Network Devices",可以看到没有成功连接的网络相机,原因是IP地址配置错误。每个版本的OpenCV的依赖项的名字都不同,我这里是opencv_world490.lib与opencv_world490d.lib。函数,可以看到在这里是图像缓存区,能够对捕获的图像进行一些操作。在Visual Studio打开项目属性,在VC++目录这里,把Opencv的路径添加进去。这时,会自动跳转到mainwindow.cpp,生成该按钮对应的槽函数。

qq_35685051的博客 1288

Unity中使用委托/事件实现GameObject之间的通信

Unity中使用委托/事件实现GameObject之间的通信

cuit_xuchen的博客 4975

Xilinx差分原语-IBUFGDS与OBUFGDS FPGA

它将差分信号转换为单端信号,并将其输入到FPGA的逻辑片上。它将单端信号转换为差分信号,并将其输出到FPGA的引脚。在FPGA设计中,差分信号是一种常见的信号传输方式,用于提高抗噪性和抑制共模噪声。Xilinx是一家知名的FPGA供应商,提供了许多差分原语,其中包括IBUFGDS和OBUFGDS。通过使用Xilinx的差分原语,如IBUFGDS和OBUFGDS,可以实现差分信号的输入和输出。这些差分原语提供了方便且可靠的接口,使得在FPGA设计中处理差分信号变得更加简单和高效。是差分输入信号的端口,

git_database727的博客 2096

Unity3D的委托和事件的用法详解

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!// 1. 定义委托类型// 2. 使用委托// 3. 赋值方法// 4. 调用委托myDelegate?.Invoke();// 5. 多播委托(多个方法)myDelegate += () => Debug.Log("Lambda表达式");myDelegate?.Invoke();// 6. 移除方法1.2 Unity内置委托类型。

Thomas_YXQ的博客 610

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 343

最新Python爬虫实战(入门爬虫篇)——案例15:微博热搜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过 Python 爬虫技术,成功实现了对微博热搜 API 接口数据的批量爬取与 Excel 保存。代码采用模块化设计,包含接口请求、JSON 解析、数据提取、Excel 持久化等完整流程;通过模拟真实浏览器的请求头和 cookies,有效规避基础反爬策略,保证请求的稳定性。整个爬虫逻辑遵循“API请求 → JSON解析 → 数据提取 → 保存到Excel”的标准流程,与异步加载类网站的爬取范式高度一致。AJAX 接口抓包与分析。

努力让自己发光,对的人才能迎着光而来 7万+

ET框架UI事件系统实战指南:从委托机制到高效交互的深度解析

ET框架作为一款优秀的Unity3D客户端和C#服务器框架,其事件系统设计巧妙且功能强大,特别适合游戏开发中的UI交互场景。本文将通过实战案例,深入解析ET框架的事件机制在UI开发中的应用,帮助你掌握高效、解耦的UI事件处理方式。🚀 ## 为什么需要事件驱动的UI系统? 在传统的游戏开发中,UI逻辑往往与业务逻辑紧密耦合,导致代码难以维护和扩展。ET框架通过事件系统实现了数据驱动逻辑的设计理

gitblog_00039的博客 608

使用 Simulink 和 Simscape Electrical 工具箱设计一个 Buck 转换器系统

Buck 转换器(降压转换器)是一种常用的 DC-DC 转换器,用于将较高的输入电压转换为较低的输出电压。为了评估其抗干扰能力,我们可以在模型中引入不同的干扰源,并观察系统的响应情况。电网电压波动:输入电压的变化。负载突变:负载电阻或电感的变化。电磁干扰:高频噪声或脉冲干扰。通过模拟这些干扰,我们可以分析系统的动态响应特性,并采取相应的措施来提高系统的抗干扰能力。

xiaoheshang_123的博客 377

unity3d 类与类之间的通信

参考文章如下: https://blog.youkuaiyun.com/KingSea168/article/details/47326045 脚本交互 https://www.cnblogs.com/jeason1997/p/4818777.html 优雅地管理你的代码 https://blog.youkuaiyun.com/arbut/article/details/44203371 委托、事件、单例在Unit...

写给自己看的博客 3127

YOLOv8/v9 遥感图像目标检测实战指南:建筑物检测与变化监测

遥感图像在城市规划、灾害评估、农业监管等领域应用广泛,但传统目标检测方法存在效率低、精度不足、难以适配遥感图像大尺寸、多尺度目标等问题。本文以“建筑物检测与变化监测”为核心,基于DOTA、NWPU VHR-10等公开数据集,系统讲解YOLOv8/v9在遥感图像中的实战流程。从数据获取、格式转换、模型训练优化,到大图切片推理、建筑物变化监测,全程提供可复现的代码与参数配置。通过针对性优化(旋转增强、切片推理等),模型在NWPU VHR-10数据集上mAP50达0.85以上,可适配卫星影像、无人机航拍等多场景

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 519

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PyWxDump:微信聊天记录导出工具,为何突然下线了

PyWxDump 是一款微信 PC 端数据库解密与聊天记录导出工具。但项目已于 2025 年 10 月因收到微信官方律师函被作者移除,仓库里现在只剩一份移除通知。以下内容说明它曾经能做什么、现在不可用的事实意味着什么。 ## 📦 安装后你实际会拿到什么 这一节帮你避免照着旧教程折腾半天、结果发现仓库是空的弯路。 ```bash git clone https://gitcode.com/G

gitblog_00756的博客 404

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Unity依赖注入框架Zenject/Extenject:从原理到实战的终极架构指南

依赖注入(Dependency Injection)是一种重要的软件设计模式,其核心原理是通过将对象的依赖关系外部化,由专门的容器(Container)来负责创建和注入,从而实现控制反转(Inversion of Control)。这项技术的核心价值在于解耦代码、提升可测试性与可维护性,尤其适用于中大型、需要长期迭代的软件项目。在游戏开发领域,其应用场景广泛,能有效管理复杂的游戏对象生命周期、服务模块间的通信以及数据共享。本文以Unity引擎中广受欢迎的依赖注入框架Zenject(现Extenject)为主

weixin_34319817的博客 389

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Unity 委托 (Delegate) 的简单理解以及实现

Unity C# 简单理解委托(Delegate)以及实现

Ci 6141

Unity3D基于委托的事件消息系统

什么是事件机制,事件机制其实是一种叫做观察者模式的设计模式,事件的本质是一种方法的委托(Delegate),把回调方法委托到事件管理器,当条件达到时,通过事件key来告诉事件管理器可以执行那些委托的方法。 好了,接下来直接上代码吧 下面展示一些 内联代码片。 事件类 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; na

胖橘的博客 414

Unity中脚本之间如何解耦?

在 Unity3D 中,脚本之间的解耦是一个非常重要的问题。解耦可以使代码更加灵活和易于维护,因为它可以减少各个脚本之间的依赖性。列举事件、接口、单例等常见解耦方法异同点,并分别举例。

穿裤子的云 1760

Unity-设计模式-第二章:什么叫耦合性?

这个问题说不清楚,网上说的一堆乱七八糟的,就是没找到g点 我这里举个例子,你自己体会。 对于继承来说,有好处,也有坏处,坏处就是增强了耦合性,为什么呢? 因为,当你修改父类的常量,变量,和方法时,必须要考虑子类的修改,甚至要考虑重构。 所以在我看来,耦合性这东西应该就是 “牵一发而动全身”  ...

qq_37080133的博客 1085
上一篇: Unity3d碰撞检测中碰撞器与触发器的区别
下一篇: C# 中& 与&&的区别
我是一纸巾
博客等级 码龄12年 14粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值