[英]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.