2017-11-18 45 views
0

我有一個對象列表。他們是Unity場景。如何將對象數組存儲爲一個Unity場景名稱

public Object[] scenes; 

我想填補這個數組團結的場面,作爲存儲順序,他們應該團結的檢查中加載的一種便捷方式。

我試圖使用場景管理器使用的參考的水平加載到該陣列

public int currentSceneNumber = 0; 
public void LoadNext() 
{ 
    if (scenes.Length >= currentSceneNumber + 1) 
    { 
     currentSceneNumber += 1; 
     SceneManager.LoadScene(scenes[currentSceneNumber].ToString()); 
    } 
    else 
    { 
     Debug.Log("Level.cs: Unable to load next level."); 
     return; 
    } 
} 

但轉動場景成一個字符串結果「scenename(UnityEngine.SceneAsset)」的(登錄(UnityEngine。 SceneAsset)是問題的一部分。這將導致以下錯誤

Scene 'prototype02_Scene (UnityEngine.SceneAsset)' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded. 
To add a scene to the build settings use the menu File->Build Settings... 

如何獲取場景名稱從場景對象在我的數組字符串?

+1

他明確表示,加入所有場景'建立Settings',然後再次檢查你的代碼 – ahmetson

回答

1

不能在編輯器外面做這個。

當您使用public UnityEngine.Object[] scenes;來保存場景時,Unity將使用SceneAsset作爲佔位符來保存這些場景。

的問題,這是SceneAssetUnityEditor命名空間,這意味着你的代碼將在編輯器與該AssetDatabase才起作用。您無法將其構建爲在任何獨立平臺上運行。如果您嘗試構建項目,則會出現this錯誤。

這是如何讓所有的場景,並將其存儲在一個陣列(如果在編輯器中工作,並建立):

public Scene[] scenes; 

... 


void initScenes() 
{ 
    int sceneCount = SceneManager.sceneCountInBuildSettings; 
    scenes = new Scene[sceneCount]; 
    for (int i = 0; i < sceneCount; i++) 
    { 
     scenes[i] = SceneManager.GetSceneByBuildIndex(sceneCount); 
    } 
} 

你的加載代碼:

SceneManager.LoadScene(scenes[currentSceneNumber].name); 

如果你確定這是一個編輯器插件,而不是你需要在編輯器之外編譯或運行的東西,那麼這裏是你的答案:

首先,您使用的是與場景名稱無關的對象名稱,因爲Object.ToString()是覆蓋函數,用於檢索對象的 名稱。

只需將Object數組轉換爲SceneAsset,然後從中訪問場景的名稱,而不是像您當前所做的那樣訪問Object的名稱。

SceneManager.LoadScene(((SceneAsset)scenes[currentSceneNumber]).name); 

SceneAsset scene = scenes[currentSceneNumber] as SceneAsset; 
SceneManager.LoadScene(scene.name); 
+0

感謝您的回答程序員。這一切都有道理。你提出的解決方案,我可以想象的作品,但不幸的是擊敗了我試圖的目的。 我想避免必須使用構建設置窗口來組織我的場景。 我希望能夠方便的拖拽到巡視窗口中,並選擇與遊戲構建相關的場景。 – Jim

+0

爲避免使用構建設置,您必須編寫更多代碼。你必須用Menu來編寫自己的自定義編輯器構建腳本(** ScriptA **),你可以使用它來構建你的項目。然後,您可以編寫另一個腳本(** ScriptB **),將陣列中的SceneAsset添加到Assetbundle中,然後將AssetBundle複製到StreamingAssets文件夾。當您從** ScriptA **中單擊您的構建函數時,它將執行我在** ScriptB **中描述的操作,然後它將返回到** ScriptA **並構建項目。 – Programmer

相關問題