团结,代表无法实现转型

时间:2018-12-06 23:38:00

标签: c# unity3d events delegates

我添加了两个类,例如 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委托从第一次开始就正确执行,但是又没有正确执行?

1 个答案:

答案 0 :(得分:1)

您需要正确添加和删除侦听器。 例如,在OnEnable()中添加侦听器,在OnDisable()中将其删除,如下所示:

您也可以统一使用UnityEvent和UnityAction。

private void OnEnable(){
       MazeGenerator.OnMazeReady += StartDirectives;   
}
private void OnDisable(){
       MazeGenerator.OnMazeReady -= StartDirectives;   
}