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"); } }
编辑器绑定步骤:
- 在Unity编辑器中,选中挂载了
Countdown脚本的GameObject - 在Inspector面板找到
toggleEnd字段,点击右侧的+号添加一个事件项 - 将挂载了
GameActions脚本的GameObject拖到事件项的Object输入框中 - 点击事件项的下拉菜单,选择
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
相关产品推荐
相关产品推荐

