2016-04-14 69 views
0

所以我試圖完成的是當我加載一個場景時,我想讓某些對象處於活動或非活動狀態,具體取決於它們保存在我的文件中的信息。保存並加載Unity中的場景中的gameobjects的狀態

例子是:

在我的遊戲,當我加載我的場景之一有一個壁,然後我推書櫃到某一點,並且觸發被設置爲不活動的壁。我退出這個場景並回到現場,牆壁再次激活。我想要的是,當牆被設置爲不活動時,即使離開場景時它也保持不活動狀態,而當我稍後回到場景時不會出現。

我遇到的麻煩是如何做到這一點。目前,我有什麼是當玩家點擊「新遊戲」按鈕,我產生一個新的Game_Info並選擇默認():

[Serializable] 
public class Game_Info { 

    public bool WoodWallEnabled; 

    public void Default(){ 
     WoodWallEnabled = true; 
    } 
} 

我WoodWall腳本:

public class Get_WoodWall_Info : MonoBehaviour { 

    void Awake() { 
     gameObject.SetActive (Helper_Manager.instance.gameInfo.WoodWallEnabled); 
    } 
} 

我有一個感覺我沒有這樣做是正確的,並且有更好的方法來處理這個問題,特別是因爲這樣做需要每個遊戲對象的唯一腳本,我想通過我保存的文件(Get_WoodWall_Info,Get_WoodWall_Info1等等..)但即使我創建了大量的腳本來做到這一點,我找不到一種方法來保存遊戲對象的狀態。

你將如何處理和傳遞這種數據?

+0

我編輯我的回答你的問題的另一部分。我很抱歉沒有注意到這部分。無論如何,希望有所幫助。 – DRKblade

回答

1

我認爲PlayerPref在這種情況下是一個不錯的選擇。 你可以這樣做:

  • 呼叫PlayerPrefs.SetInt("wall enabled", active ? -1 : 0);,以節省您的木牆上的狀態active是牆壁的狀態。

  • 而在Get_WoodWall_Info,而不是使用在幫助管理器中的值,使用 PlayerPrefs.GetInt("wall enabled") != 0

價值觀PlayerPrefs將通過遊戲會話被保存,所以你可能要設置的wall enabled項設置爲0當你開始一個新的遊戲。

編輯

@JoeyL你爲什麼不創建一個腳本,您的所有遊戲對象,像這樣:

public class StateHandler : MonoBehaviour { 
    void Awake() { 
     string keyName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + gameObject.name; 
     if (PlayerPrefs.GetInt(keyName) == 0) 
      gameObject.SetActive(false); 
    } 
    public void SetActiveState (bool state) { 
     string keyName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + gameObject.name; 
     PlayerPrefs.SetInt(keyName, state ? -1 : 0); 
     gameObject.SetActive(state); 
    } 
} 

這將使用當前場景的名字和你連接的遊戲對象名稱作爲關鍵,所以你只需要確保使用這個腳本的所有gameobjects都有不同的名字。

+0

您的SetActiveState(bool stat)中的PlayerPrefs.SetInt()的第一個參數應該是keyName嗎? – JoeyL

+0

我真的認爲這是我正在尋找的!我正在製作一款2D RPG入門套件,我可以使用它來製作這款開發者的工具,因爲PlayerPrefs可以很好地使用,因爲我所做的並不適合在線。在我們講話時製作劇本並進行測試。 – JoeyL

+0

@JoeyL哦,是的,你說得對,我錯了。而且,在你的遊戲中祝你好運:) – DRKblade

1

如果您只保存WoodWallEnabled變量,則簡單地使用PlayerPref,如上所述。現在,如果您要保存整個場景信息,如目標位置或Game_Info類的每個變量,你必須的類轉換爲的JsonJsonUtility.ToJson,然後保存它使用PlayerPref。然後加載它,您使用PlayerPref加載它然後序列化回到Game_Info類與JsonUtility.FromJson

一個完整的工作實例,包括數組:

Serialize and Deserialize Json and Json Array in Unity

+0

是的,我將在場景中保存重要信息,但不是所有事情。就像我提到移動書櫃一樣,在那個場景中我有大約5個書架,但我只關心它們中的一個作爲例子。有些場景很少需要保存,而有些則有更多。 – JoeyL

+0

我在上面發佈的鏈接中的解決方案應該適合您。 – Programmer

+0

謝謝程序員我會檢查出來。順便說一句,使用這種方法的安全性如何?我記得看過一個Unity教程說使用PlayerPrefs是不安全的,因爲用戶可以進入並編輯文件到他們想要的。 – JoeyL