You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:57:00