【解决】MissingReferenceException: The object of type ‘GameObject‘ has been destroyed...

开发平台: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}");
}

猜你喜欢

转载自blog.csdn.net/qq_51026638/article/details/126127643
今日推荐