我添加了两个类,例如 this
MazeGenerator具有委托和事件:
public delegate void MazeReadyAction();
public static event MazeReadyAction OnMazeReady;
MazeDirectives具有以下代码:
void Awake()
{
MazeGenerator.OnMazeReady += StartDirectives;
}
void StartDirectives()
{
mazeCoinPositions = MazeGenerator.instance.GetRandomFloorPositions(coinsToFind);
for (int i = 0; i < mazeCoinPositions.Count; i++)
{
MazeCoin mazeCoin = Instantiate(mazeCoinPrefab, mazeCoinPositions[i], Quaternion.identity) as MazeCoin;
mazeCoin.transform.SetParent(transform);
}
}
基本上是在迷宫中创建硬币并将 transform作为其父级。此函数被添加到在MazeGenerator中执行的委托中:
void Start()
{
if (OnMazeReady != null)
{
OnMazeReady();
}
}
玩家死亡后,我将场景“游戏”更改为“菜单”场景,如下所示:
public void LoadByIndex(int sceneIndex)
{
SceneManager.LoadScene(sceneIndex);
}
其中索引来自“构建设置”。
问题在于,在玩家单击菜单中的“开始”按钮后,基本上,死后
mazeCoin.transform.SetParent(transform);
无法实现转换(SetParent( transform )),我得到了
MissingReferenceException:'MazeDirectives'类型的对象已被破坏,但您仍在尝试访问它。
我很好奇为什么OnMazeReady委托从第一次开始就正确执行,但是又没有正确执行?
答案 0 :(得分:1)
您需要正确添加和删除侦听器。 例如,在OnEnable()中添加侦听器,在OnDisable()中将其删除,如下所示:
您也可以统一使用UnityEvent和UnityAction。
private void OnEnable(){
MazeGenerator.OnMazeReady += StartDirectives;
}
private void OnDisable(){
MazeGenerator.OnMazeReady -= StartDirectives;
}