【Unity基础】Unity通信之Messaging System

Unity的新UI系统引入了一种新的消息传递系统,旨在替代传统的SendMessage方法。这个系统使用纯C#编写,并通过自定义接口的方式,解决了SendMessage的一些局限性。新的消息系统不仅支持在目标GameObject上调用指定接口,还允许在整个GameObject层次结构传播消息。通过该系统,你可以轻松地传递自定义数据,并根据需求控制消息的传播范围(例如只在当前对象、其子对象或父对象中执行)。

Messging System的优势

  • 类型安全:传统的SendMessage使用字符串来指定消息,容易出现拼写错误和运行时错误。新的系统使用接口,提供了类型安全的调用。
  • 灵活性:允许传递自定义数据,并灵活控制消息在GameObject层次结构中的传播方式。
  • 统一的事件处理:新的系统可以轻松地与UI系统的事件处理集成,并支持自定义事件。

自定义消息的定义

在Unity的UntiyEngine.EventSystems命名空间中,有一个基础接口IEventSystemHandler。任何继承自这个接口的接口都可以作为消息接收器。

定义自定义消息接口

csharp 复制代码
using UnityEngine.EventSystems;
public interface ICustomMessageTarget : IEventSystemHanlder
{
	// 可以通过消息系统调用的函数
	void Message1();
	void Message2();
}

实现自定义消息接口

csharp 复制代码
using UnityEngine;
using UnityEngine.EventSystems;

public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
	public void Message1()
	{
		Debug.Log("Message 1 received");
	}
	public void Message2()
	{
		Debug.Log("Message 2 received");
	}
}

在这个示例中,我们定义了一个名为ICustomMessageTarget的接口,包含两个方法Message1和Message2。然后,我们在一个MonoBehaviour类中实现了该接口,这样这个组件就可以接收这些消息。

发送消息

一旦你定义并实现了自定义消息接口,接下来就是发送消息。可以使用ExecuteEvents类的静态方法来发送消息。

发送消息

csharp 复制代码
using UnityEngine;
using UnityEngine.EventSystems;

public class Messaging : MonoBehaviour
{
	public GameObject target;
	
	void Update()
	{
		if(Input.GetKeyDown(KeyCode.Space))
		{
			// 向目标GameObject发送Message1消息
			ExecuteEvents.Execute<ICustomeMessageTarget>(target, null, (x, y) => x.Message1());
		}
	}
} 

解释

  • ExecuteEvents.Execute<ICustomeMessageTarget>: 此方法会在指定的目标GameObject上执行实现ICustomMessageTarget接口的所有组件中的Message1方法。
  • 参数target是消息发送的目标对象,可以在Inspector窗口中指定。
  • 第三个参数是一个lambda表达式,指定要调用的接口方法。

示例演示

  1. 创建一个新项目,并添加一个新场景。
  2. 创建GameObject:在场景中添加一个Cube,并将其命名为TargetCube。
  3. 创建并添加脚本:
  • 创建CustomMessageTarget脚本,将其附加到TargetCube上。
  • 创建MessageSender脚本,并将其附加到另一个GameObject(例如,Main Camera)上。
  • 在MessageSender脚本中,将TargetCube拖动到target字段中。
  1. 运行项目:
  • 按下空格键时,MessageSender会向TargetCube发送Message1消息,触发CustomMessageTarget中的Message1方法,在控制台打印出"Message 1 received"。

其他ExecuteEvents方法

ExecuteEvents类还提供了其他方法,允许你:

  • 在GameObject的子对象中执行消息ExecuteHierarchy
  • 在GameObject的父对象中执行消息ExecuteInParentExecuteHierarchy
  • 搜索并找到实现特定接口的GameObject(Find等方法)

总结

Unity的新消息传递系统通过使用接口和类型安全的方式来替代SendMessage,使得消息传递更加灵活和安全。通过ExecuteEvents类,你可以轻松地在目标GameObject上发送自定义消息,并控制消息的传播范围。这不仅适用于UI系统,也可以在游戏逻辑中广泛使用。

相关推荐
叶帆16 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君16 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子17 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai31524754317 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光17 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光17 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯17 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案17 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔17 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技17 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d