【解决】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}");
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值