开发平台:Unity 编程平台:Visual Studio 2020以上 使用语言:C#
问题描述 描述英文MissingReferenceException: The object of type ‘GameObject’ has been destroyed。中文丢失的偏好异常:GameObject 类型的对象已经被销毁备注:这是一个 Warning 类型的错误警告,对项目稳定性基于使用情况给予 可忽略/有影响 两种BUFF。
解决方案:示例public void Awake() { EventDispacther.AddListener($"{MessageCommand.Hello}", OnResponsedMessage); }
public void OnResponsedMessage(object[] obj) { Debug.Log("Hello World"); }
- 如上所示,使用事件分发器注册监听
MessageCommand.Hello
消息。其内部方式使用 委托订阅方式进行。 - 现在 包含改内容 的脚本所挂载的对象被制作成 Prefab 预制体。用于其他脚本的调用。
- 在其他脚本中,例如:
public class ItemCreator : MonoBehaviour
{
public Transform Parent;
public GameObject Prefab;
public IEnumerator CreateAndDelete()
{
yield return new WaitForSeconds(2f);
var thisPrefab = GameObject.Instante(Prefab, Parent);
yield return new WaitForSeconds(2f);
DestroyImmediate(thisPrefab);
EventDispatcher.DispatchEvent($"{MessageCommand.Hello}");
}
}
在 创建与销毁 过程中,我们为该对象的组件中执行了 EventDispatcher
的事件注册。特别的,在销毁过程中,并未对该对象因自身销毁问题而注销事件监听。导致 事件分发器 中任然保留这一部分事件被执行,但对象已经出现丢失(销毁)。
解决方法:检查生命周期
注意 Unity 生命周期,若销毁对象,则需移除其自身所有注册信息。例如,在组件销毁阶段注销事件监听。
public void OnDestroy()
{
EventDispatcher.RemoveObserver($"{MessageCommand.Hello}");
}