C#中是否支持通过代码主动触发事件?Unity场景下如何实现?
Unity C# 主动触发自定义事件的实现方案
C# + Unity 环境下完全可以实现类似JS手动调用click()触发事件的逻辑,最常用的有两种实现方案,都支持主动调用触发,和JS调用click()的逻辑完全对齐。
方案1:使用C#原生委托/事件(性能更高)
适合纯代码逻辑开发,运行性能更好:
using UnityEngine; // 先声明委托类型,参数可以根据你的需求自定义 public delegate void ReachTargetHandler(Vector3 reachPosition); public class ObjectMoveController : MonoBehaviour { // 声明要触发的到达目标点事件 public event ReachTargetHandler OnReachTarget; public Transform targetPoint; public float arriveThreshold = 0.1f; void Update() { // 检测用户输入,这里用空格作为触发移动的输入示例 if (Input.GetKeyDown(KeyCode.Space)) { // 此处省略对象移动的具体逻辑 // 当检测到到达目标点的距离小于阈值时 if (Vector3.Distance(transform.position, targetPoint.position) < arriveThreshold) { // 主动触发事件,和JS调用click()逻辑完全一致 OnReachTarget?.Invoke(transform.position); } } } }
其他需要监听事件的脚本直接订阅即可:
public class EventListener : MonoBehaviour { public ObjectMoveController moveController; void OnEnable() { // 订阅事件 moveController.OnReachTarget += HandleReachTarget; } void OnDisable() { // 取消订阅,避免内存泄漏 moveController.OnReachTarget -= HandleReachTarget; } // 事件触发时执行的逻辑 void HandleReachTarget(Vector3 arrivePos) { Debug.Log($"已到达目标点,位置:{arrivePos}"); // 此处写你要执行的特定事件逻辑 } }
方案2:使用UnityEvent(可视化配置更友好)
如果需要在Inspector面板里直接配置触发逻辑,不需要写代码订阅,可以用Unity自带的UnityEvent:
using UnityEngine; using UnityEngine.Events; public class ObjectMoveController : MonoBehaviour { // 声明带参数的UnityEvent,如果不需要参数直接用UnityEvent即可 [System.Serializable] public class ReachTargetEvent : UnityEvent<Vector3> {} public ReachTargetEvent OnReachTarget; public Transform targetPoint; public float arriveThreshold = 0.1f; void Update() { if (Input.GetKeyDown(KeyCode.Space)) { if (Vector3.Distance(transform.position, targetPoint.position) < arriveThreshold) { // 主动触发事件,和JS调用click()效果一致 OnReachTarget?.Invoke(transform.position); } } } }
这种方案可以直接在Inspector面板把要触发的方法拖到OnReachTarget的事件列表里,不需要额外写订阅代码,更适合非程序员快速配置。
补充说明
- 调用事件前用
?.Invoke()的写法,可以避免没有订阅者时触发空引用异常 - 如果是Unity内置的UI事件比如按钮点击,你也可以直接调用
button.onClick?.Invoke()主动触发,和JS里调用element.click()的用法完全一致
内容的提问来源于stack exchange,提问作者Nutan Panta
相关产品推荐
相关产品推荐

