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

UnityEventTools.AddPersistentListener失效报错,求解决方案

UnityEvent添加持久化监听报错的原因与解决方法

问题重现

在自定义Editor脚本中尝试给UnityEvent添加持久化监听,代码如下:

UnityEditor.Events.UnityEventTools.AddPersistentListener(targetEvent,  delegate { UpdateAndRunPromptById(id); });

触发报错:

Could not register callback <UpdateSubscribedEvents>b__0 on . The class null does not derive from UnityEngine.Object

报错原因

Unity的持久化UnityEvent监听有两个硬性要求:

  1. 回调方法的宿主对象必须继承自UnityEngine.Object(比如MonoBehaviour、ScriptableObject、Component等),因为Unity需要序列化这个对象的引用,才能在编辑器重启、场景保存后保留监听关系。
  2. 不能使用匿名委托作为持久化监听的回调——匿名委托无法被Unity序列化,且无法关联到合法的Unity对象实例,导致Unity找不到可持久化的目标,最终抛出“类null不派生自UnityEngine.Object”的错误。

解决方法

步骤1:确保方法宿主类继承自UnityEngine.Object

将UpdateAndRunPromptById方法所在的普通类,修改为继承自UnityEngine.Object的子类,示例:

public class PromptManager : MonoBehaviour
{
    public void UpdateAndRunPromptById(int id)
    {
        // 方法逻辑
    }
}

步骤2:替换匿名委托为可序列化的回调绑定

根据参数需求选择对应方式:

  • 带参数回调(使用泛型UnityEvent):如果是带参数的回调,使用对应泛型的UnityEvent(比如UnityEvent<int>),直接绑定到目标对象的方法并传递参数:
    // 假设promptManager是PromptManager类的实例(继承自UnityEngine.Object)
    UnityEditor.Events.UnityEventTools.AddPersistentListener(targetEvent, promptManager.UpdateAndRunPromptById, id);
    
  • 无参数回调:直接绑定目标对象的方法即可:
    UnityEditor.Events.UnityEventTools.AddPersistentListener(targetEvent, promptManager.UpdateAndRunPromptById);
    

特殊场景处理

如果必须添加自定义逻辑的回调(比如额外参数处理),可以在宿主类中封装专用方法,把参数作为宿主类的成员变量,再绑定这个方法:

// 在PromptManager类中添加
public int targetId;
public void RunPromptWithTargetId()
{
    UpdateAndRunPromptById(targetId);
}

// 在Editor脚本中绑定
promptManager.targetId = id;
UnityEditor.Events.UnityEventTools.AddPersistentListener(targetEvent, promptManager.RunPromptWithTargetId);

内容的提问来源于stack exchange,提问作者Justin Davis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:45:19