Unity3D 自定义事件(事件侦听与事件触发)实现详解

2015年03月19日 13:13 0 点赞 0 评论 更新于 2025-11-21 17:44

在以往使用 ActionScript 开发网页游戏时,ActionScript 中的 EventDispatcher 十分方便且实用。借助 C# 强大的语言环境,我实现了 C# 版的 EventDispatcherEventListener。不过,与 ActionScript 相比,C# 版存在一些差异,例如没有事件冒泡机制。但我认为事件冒泡机制在实际使用中并非必需,或者通过稍加修改也能实现相同的效果。

效果展示

首先来看效果图,在图中点击 Cube(EventDispatcher)、Sphere(EventListener)以及 Capsule(EventListener),它们会做出相应的变化。在这个例子中,这些对象相互之间没有引用关系,也不存在父子关系。

代码实现

事件触发者(EventDispatcher):CubeObject.cs

以下是 CubeObject.cs 的代码,该脚本需要挂载在 Cube 对象上。其主要功能是在用户点击鼠标左键时,检测是否点击到了 Cube 对象,如果点击到了,则触发相应的事件。

using UnityEngine;
using System.Collections;

public class CubeObject : MonoBehaviour
{
void Update()
{
// 检测鼠标左键是否按下
if (Input.GetMouseButtonDown(0))
{
// 从相机位置发射一条射线到鼠标点击位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit raycastHit = new RaycastHit();

// 进行射线检测
if (Physics.Raycast(ray, out raycastHit))
{
// 判断射线是否击中了 Cube 对象
if (raycastHit.collider.gameObject.name == "Cube")
{
// 触发事件
ObjectEventDispatcher.dispatcher.dispatchEvent(new UEvent(EventTypeName.CUBE_CLICK, "cube"), this);
}
}
}
}
}

在上述代码中,Update 方法会在每一帧被调用。当鼠标左键按下时,会创建一条从相机位置到鼠标点击位置的射线,并使用 Physics.Raycast 方法进行射线检测。如果射线击中了某个对象,会进一步判断该对象是否为 Cube。如果是,则通过 ObjectEventDispatcher.dispatcher.dispatchEvent 方法触发一个自定义事件 UEvent,该事件的类型为 EventTypeName.CUBE_CLICK,并携带一个字符串参数 "cube"。同时,将当前脚本所在的对象 this 作为事件的发送者传递给事件系统。

作者信息

menghao

menghao

共发布了 3994 篇文章