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

Unity中如何将其他类的单个函数设为序列化字段?

Unity中序列化引用单个函数的实现方案

方法一:使用Unity内置的UnityEvent(推荐)

UnityEvent是Unity官方提供的可序列化事件系统,能直接在Inspector里绑定目标对象的单个函数,完美匹配你的需求。

修改你的Countdown类代码如下:

using UnityEngine;
using UnityEngine.Events;

public class Countdown : MonoBehaviour
{
    // 用UnityEvent作为序列化字段类型
    [SerializeField] private UnityEvent toggleEnd;
    [SerializeField] private float currTime;

    private void Update()
    {
        currTime -= Time.deltaTime;
        // 倒计时结束时触发绑定的函数
        if (currTime <= 0)
        {
            toggleEnd?.Invoke();
            // 可选:重置倒计时或执行其他逻辑
            // currTime = 初始时间;
        }
    }
}

你的GameActions类不需要修改:

using UnityEngine;
using UnityEngine.SceneManagement;

public class GameActions : MonoBehaviour
{
    public void actionStart()
    {
        SceneManager.LoadScene("Game");
    }
}

编辑器绑定步骤:

  1. 在Unity编辑器中,选中挂载了Countdown脚本的GameObject
  2. 在Inspector面板找到toggleEnd字段,点击右侧的+号添加一个事件项
  3. 将挂载了GameActions脚本的GameObject拖到事件项的Object输入框中
  4. 点击事件项的下拉菜单,选择GameActions -> actionStart()完成绑定

如果需要绑定带参数的函数,可以使用泛型版本的UnityEvent<T>,比如UnityEvent<float>,对应的目标函数也要匹配参数类型。

方法二:自定义可序列化回调类(适合特殊需求)

如果需要更灵活的逻辑控制,可以自定义一个可序列化的回调类,通过目标对象和方法名来触发函数:

using UnityEngine;

[Serializable]
public class MethodCallback
{
    [SerializeField] private MonoBehaviour target;
    [SerializeField] private string methodName;

    public void Invoke()
    {
        if (target != null && !string.IsNullOrEmpty(methodName))
        {
            // SendMessage会调用目标对象上指定名称的函数,无需提前知道具体类型
            target.SendMessage(methodName, SendMessageOptions.DontRequireReceiver);
        }
    }
}

然后在Countdown类中使用这个类型:

public class Countdown : MonoBehaviour
{
    [SerializeField] private MethodCallback toggleEnd;
    [SerializeField] private float currTime;

    private void Update()
    {
        currTime -= Time.deltaTime;
        if (currTime <= 0)
        {
            toggleEnd?.Invoke();
        }
    }
}

这种方法需要手动输入方法名,容易因为函数改名导致失效,所以优先推荐使用UnityEvent。

注意事项

  • 绑定的函数必须是public修饰的,否则无法在Inspector面板中被选中
  • 如果后续修改了目标函数的名称或参数,需要在Inspector中重新绑定,避免触发失败

内容的提问来源于stack exchange,提问作者Lobanov Ivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:35:19