2017-02-22 79 views
2

在我的遊戲中有一個地圖視圖,其中包含一個50x50的網格。當你點擊瓦片時,你會發送到該瓦片視圖和攻擊等等。就代碼而言,這些「瓦片」之間的唯一區別是瓦片ID,也就是說。網格上的哪個數字。該號碼將在init上傳遞給服務器以處理剩下的事情。加載參數變量Unity

顯然,這是瓷磚的唯一區別,創建場景「1」,場景「2」...場景「2500」並調用SceneManager.LoadScene切換到特定瓷磚視圖將是錯誤的。

我可以使用DontDestroyOnLoad();當點擊圖塊來保存場景開關上的圖塊ID時,但是1)它只接受遊戲對象,而不僅僅是一個int變量。2)我不需要/想要在tile視圖中保存該變量。所以雖然它可以工作,似乎是矯枉過正。

是否有更好的做法,基本上只是將參數傳遞給場景加載?

+1

我想你可以創建一個靜態類來保存這些信息,如果你不需要它來和gameobjects對話(繼承monobehaviour)。 1秒,我會給你一個快速的例子。 – Maakep

回答

3

您可以創建一個靜態類來爲您保存信息。這個類將不會附加到任何GameObject上,並且在更改場景時不會被銷燬。它是static這意味着它只能有一個;你不能StaticClassName scn = new StaticClassName()創建新的靜態類。您可以直接通過StaticClassName.SomeStaticMethod()訪問它們,並可從的任意位置訪問。參見如何將值存儲在一個變量,改變場景,然後在現場使用這個例子:

連接到遊戲物體正常的團結腳本場景「測試」:

using UnityEngine; 
public class TestingScript : MonoBehaviour { 
    void Start() 
    { 
     StaticClass.CrossSceneInformation = "Hello Scene2!"; 
     SceneManager.LoadScene("Test2"); 
    } 
} 

新靜態類(而不是從monobehaviour繼承)保持着信息:

public static class StaticClass { 
    public static string CrossSceneInformation { get; set; } 
} 

連接到一個遊戲對象的腳本在現場 「的Test2」:

using UnityEngine; 
public class TestingScript2: MonoBehaviour { 

    void Start() { 
     Debug.Log(StaticClass.CrossSceneInformation); 
    } 
} 

你不需要讓整個類都是靜態的(如果你出於某種原因需要創建更多的實例)。如果您要從類中刪除static(不是變量),則仍然可以通過StaticClass.CrossSceneInformation訪問靜態變量,但您也可以執行StaticClass sc = new StaticClass();。有了這個sc,您可以使用該類的非靜態成員,但不能使用static CrossSceneInformation,因爲只能有一個(因爲它是靜態的)。

+1

我通常只爲每個場景製作一個這樣的類,需要一些上下文信息 – Dunno

+1

我非常喜歡這個!正是我需要的。而且你提醒我什麼是靜態的,我一直在使用它們。 – DasBeasto

+0

太棒了!樂意效勞! – Maakep