(统一)有没有办法在引用的对象实例被删除/丢失时得到通知?

Posted

技术标签:

【中文标题】(统一)有没有办法在引用的对象实例被删除/丢失时得到通知?【英文标题】:(Unity) Is there a way to get notified when referenced object instance gets deleted/missed? 【发布时间】:2022-01-19 16:41:01 【问题描述】:

假设我们有一个带有 Transform 属性的 MonoBehaviour 类:

public class Class : MonoBehaviour

    public Transform Target; //An object is already referenced here.

问题很简单:如果该对象被(外部)删除,有没有办法获取事件或某种回调?

Unity 会将其显示为“缺失”:

因为它只是一个转换,所以你不能在这里真正使用OnDestroy(),即使你可以,这也不是一个好的选择,因为有多少转换实例。

【问题讨论】:

也许 OnValidate 当“检查器中的值发生变化”时?然后使用tryGetComponent ? OnValidate() 仅在编辑器中有效,因此不是一个选项。 tryGetComponent 可以工作,但它会强制脚本检查每一帧以确保它。会的,我只是认为可能有更好的解决方案。 那么,制作转换 private 并创建公共 get/set 函数 - 这样您就可以在 set 函数中实现所需的逻辑。 我试过了,问题是每当对象通过Destroy(gameobject) 方法被销毁时,变换也被删除,但由于没有人设置target = null,所以“set”函数内部没有任何内容。 【参考方案1】:

可序列化字段可以在运行时通过编辑器检查器进行更改,因此无法保证编译时间。

按照建议,您可以这样做:

void OnValidate() 
    if (Target == null)
        throw new NullReferenceException();    

您也可以尝试,灵感来自documentation 示例(未调试):

using UnityEngine;
using System.Collections;
using UnityEditor;

// Creates a custom Label on the inspector for all the scripts named ScriptName
// Make sure you have a ScriptName script in your
// project, else this will not work.
[CustomEditor(typeof(Class))]
public class ClassEditor: Editor

    Class classInstance;
    protected void OnEnable() 
        classInstance = (Class)target;
    
    public override void OnInspectorGUI()
    
        //you can first try only uncommenting line below to check if this script is working
        //GUILayout.Label ("This is a Label in a Custom Editor");  
        
        if (classInstance.Target === null) 
            EditorUtility.DisplayDialog("Target transform missing");
        
    

不确定Class 名称是否会产生冲突,如果是,请更改类名。也不确定组件是否在丢失时被评估为null(null 和missing 不相同),我认为代码明智是相同的,并且两者都抛出了 nullRef 异常,但是在控制台中告诉你如果它为空或缺失。 你可以试试看。希望它至少可以帮助你。最终的问题留作家庭作业:)

【讨论】:

那么如果您执行if (classInstance.Target === null) Debug.Log("whatever")Debug.LogError,在您的脚本的Start() 中,它将显示在log files 中,您可以在那里调用您的代码。不需要事件/回调。 @FrankyDoll 在有人写了一个正确且有用的答案后更改问题有点粗鲁,并使他们的答案无效......你认为你可以将问题恢复为什么这个答案是针对并提出这个新问题in a separate post? 我想我没有明白问题的重点。项目一旦建成,您不应该丢失或操纵项目,这意味着不会发生资源在构建时可用而在构建后不可用的情况。因此,错误/回调应该在您进行构建/编译时触发。 OnValidate,或编辑器内的方法应该可以为您解决问题。我会发现在缺少我认为不可能的元素的情况下强制编译错误会更有趣...... 有一个特殊的unity-editor 标记用于编辑我故意不使用的问题,但我会按照您的喜好进行操作。

以上是关于(统一)有没有办法在引用的对象实例被删除/丢失时得到通知?的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题整理二(侧重SSH框架)

Android内存泄漏的本质原因解决办法操作实例

Java 继承02

页面显示未将对象引用设置到对象的实例怎么处理

vuex页面刷新数据丢失的解决办法

delete引用会怎么样