簡體   English   中英

統一,完全重載場景

[英]Unity, reload scene completely

我有兩個場景:Menu和Game,每次發射時都會隨機生成迷宮。

玩家在迷宮中死亡后,我加載了場景菜單,在該菜單中,玩家可以按啟動按鈕,這會生成一個新的迷宮,但它只是加載了舊場景,其中玩家早逝了。

我想在每次按下開始按鈕后生成新的迷宮。
另外,當我分別用迷宮播放場景時,一切都可以正常工作。對於場景加載,我使用:

SceneManager.LoadScene(sceneIndex);

在構建設置中定義的索引。

如果需要任何其他代碼,請問我,我會添加它。

UPDATE
我有一個MazeGenerator類,其中有委托和事件:

public delegate void MazeReadyAction();
public static event MazeReadyAction OnMazeReady;

事件在迷宮生成時觸發,並在迷宮准備就緒時用於MazeDirecives類中以設置敵人和硬幣。
這樣我的MazeDirectives就有了幾行:

void Awake()
{
    MazeGenerator.OnMazeReady += StartDirectives;    
}

void StartDirectives()
{
   for (int i = 0; i < mazeCoinPositions.Count; i++)
    {
        MazeCoin mazeCoin = Instantiate(mazeCoinPrefab, mazeCoinPositions[i], 
            Quaternion.identity) as MazeCoin;
            mazeCoin.transform.SetParent(transform);
    }
}

錯誤:
MissingReferenceException: The object of type 'MazeDirectives' has been destroyed but you are still trying to access it

mazeCoin.transform.SetParent(transform);

有什么建議么?

以來

public static event MazeReadyAction OnMazeReady;

如果是static那么如果該類的實例被銷毀,它也會一直存在。

這樣之后

MazeGenerator.OnMazeReady += StartDirectives;

盡管您注冊為偵聽器的MazeDirectives對象由於SceneManager.Load而被破壞,但MazeDirectives繼續調用該偵聽器。 因此,下次調用OnMazeReady時,您實際上注冊了兩個偵聽器:一個來自第一個場景(現在已銷毀),另一個來自“新”場景。

您應該刪除舊的監聽器

private void OnDestroy()
{
    MazeGenerator.OnMazeReady -= StartDirectives;
}

甚至不“堆放”它們,只分配一個聽眾

private void Awake()
{
    MazeGenerator.OnMazeReady = StartDirectives;
}

當然,這僅適用於您的場景中沒有其他聽眾的情況。

無論如何,您應該重置它以確保

private void OnDestroy()
{
    MazeGenerator.OnMazeReady = null;
}

一般說明:隨時保存通話

MazeGenerator.OnMazeReady -= StartDirectives;

即使之前沒有添加監聽器也是如此。 這樣做

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

還確保始終只能將監聽器添加一次。

這有點蠻力,但應該可以解決。 在加載迷宮場景之前,將從主菜單場景中調用此例程。

int scenes = SceneManager.sceneCount;
if (scenes > 1)
{
    for (int i = 0; i < scenes; i++)
    {
        if (SceneManager.GetSceneAt(i).name == "Name of Maze Scene")
        {
            SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(i).name);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM