- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个迷宫游戏,如果游戏重新启动,需要收集完成它的 key 不会再次出现,我收到以下错误;
MissingReferenceException: The object of type 'MazeDirectives' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
我只是禁用 MazeKey 对象,而不是破坏它,有人可以帮忙吗?下面是我的代码;
迷宫 key .cs
using UnityEngine;
using System.Collections;
public class MazeKey : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
transform.parent.SendMessage("OnKeyFound", SendMessageOptions.DontRequireReceiver);
gameObject.SetActive(false);
}
}
迷宫指令.cs
MazeGoal mazeGoal;
MazeKey mazeKey;
void StartDirectives()
{
mazeGoal = Instantiate(mazeGoalPrefab, MazeGenerator.instance.mazeGoalPosition, Quaternion.identity) as MazeGoal;
mazeGoal.transform.SetParent(transform);
mazeKeyPositions = MazeGenerator.instance.GetRandomFloorPositions(keysToFind);
for (int i = 0; i < mazeKeyPositions.Count; i++)
{
MazeKey mazeKey = Instantiate(mazeKeyPrefab, mazeKeyPositions[i], Quaternion.identity) as MazeKey;
mazeKey.transform.SetParent(transform);
}
}
要重新启动游戏,我使用下面的代码;
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
gameObject.SetActive(true);
}
}
迷宫目标.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class MazeGoal : MonoBehaviour
{
public Sprite closedGoalSprite;
public Sprite openedGoalSprite;
void Start()
{
GetComponentInChildren<SpriteRenderer>().sprite = closedGoalSprite;
}
public void OpenGoal()
{
GetComponentInChildren<SpriteRenderer>().sprite = openedGoalSprite;
}
void OnTriggerEnter2D()
{
transform.parent.SendMessage("OnGoalReached", SendMessageOptions.DontRequireReceiver);
}
最佳答案
您得到的异常不是关于 MazeKey
对象,而是关于 MazeDirectives
组件。
很遗憾,您在评论中看到了最重要的信息:
private void Awake()
{
MazeGenerator.OnMazeReady += StartDirectives;
}
所以 OnMazeReady
似乎是 static
并且没有实例化,因此在加载新场景时它不会被销毁,而是在新场景中保持完整膨胀!
当你打电话时
MazeGenerator.OnMazeReady += StartDirectives;
您将对 MazeDirectives
实例的 StartDirectives
方法的调用添加为该 static
事件的监听器。
现在,当您重新加载场景时,所有 GameObject
及其组件实例都会被销毁
=> MazeGenerator
的实例也是如此……但是 static
事件OnMazeReady
是没有被摧毁!
所以在下一个 Awake
调用之后,您现在有两个监听器
但是由于您添加的第一个监听器的 MazeDirectives
实例在重新加载场景并生成新实例时被销毁,因此您会遇到该异常
MissingReferenceException: The object of type 'MazeDirectives' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.
当该方法尝试访问被销毁实例的 transform
值时。
所以你应该在销毁实例时移除监听器
private void OnDestroy()
{
MazeGenerator.OnMazeReady -= StartDirectives;
}
或者一次只用一个监听器覆盖它
private void Awake()
{
MazeGenerator.OnMazeReady = StartDirectives;
}
这第二种方法显然只有在没有其他实例或类监听该事件时才有用。问题是使用事件有多大意义?如果不需要,我无论如何都会删除它,只是为了确定
private void OnDestroy()
{
MazeGenerator.OnMazeReady = null;
}
我更喜欢这个解决方案。
不要将 MazeGenerator.OnMazeReady
设为静态。因为无论如何我看到你正在使用单例模式,例如在
MazeGenerator.instance.mazeGoalPosition
您可以改为仅使 OnMazeReady
成为非静态的,然后以相同的方式使用它:
private void Awake()
{
MazeGenerator.instance.OnMazeReady += startDirectives;
}
因此它将与 MazeGenerator
实例一起销毁。
我会总是尽快删除我添加的所有监听器,以避免您遇到的问题。
您可以另外删除它,例如已经在 StartDirectives
中,以确保即使同一场景“意外”调用 OnMazeReady
两次,该方法也只执行一次。
提示:我说 另外 因为它总是保存/可能删除一个监听器,即使它之前没有添加,你应该总是把它留在 OnDestroy
以防在对象被销毁之前从未调用 StartDirectives
。
关于c# - 游戏重启后游戏对象不会加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53712922/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!