2016-01-22 110 views
0

我想要一個適用於我所有級別的重新啓動菜單,因爲我加載級別1,此腳本在空的遊戲對象上將整數設置爲1。Unity3D初學者RestartButton。在場景之間共享信息?

using UnityEngine; 
using System.Collections; 

public class SetRestart : MonoBehaviour { 

    public int Setrestart = 1; 

    void awake() 
    { 
     DontDestroyOnLoad (this); 
    } 
    } 

當你失敗的水平,你會到達下一個場景叫做:LostMenu。您可以選擇重新啓動您正在播放或退出的級別。所以我在這裏做了一個按鈕,重新啓動並連接這個腳本吧:

using UnityEngine; 
using System.Collections; 

public class RestartButton : MonoBehaviour 
{ 
    public int Setrestart; 

    void Start() 
    { 
     if (Setrestart == 1) { 
      Application.LoadLevel("Main"); 
     } 
    } 
} 

(計劃是使50級水平,也是50 if語句,這僅僅是第一個被稱爲「主」第一層次,每個級別都有自己的號碼)。 問題是,當我點擊按鈕(屏幕截圖:http://prntscr.com/9tf4dd)時沒有任何反應,並且當我加載LostMenu屏幕時,int並沒有發生任何事情,它在檢查器中停留在0,而在級別場景中名爲「Main」I說要給它'int = 1'。數字1停留在「主」場景中,不會進入菜單場景。

1級是場景:「主」。

丟失時重新啓動的菜單是場景:「LostMenu」。

我清楚嗎?對不起,我的英語不好,並提前謝謝你。

+0

我總結了一些可能的方法來做到這一點在一篇文章中https://unitygem.wordpress.com/leaderboard-and-saving-data/ – Everts

回答

0

我使用一個靜態的'Globals'類在Unity中的場景之間持久保存數據。

你可以用這樣的東西來存儲你玩過的最後一層的名字。

public static class Globals 
{ 
    public static string LastLevel {get; set;} 
} 

然後,你可以只寫這個字符串在你的水平開始,在你重啓按鈕處理程序讀取它。

+0

Globals是骯髒,有用,但有點皺起了眉頭。對於第一款遊戲,應該沒問題,只要記住,這往往會導致任何類型的公共信息膨脹全局文件,而不是使用適當的實例間引用。 – Draco18s

+0

我非常不同意。全局變量沒有什麼骯髒的。全球化可能會被同樣的人所詬病,因爲它們會讓事情變得複雜和過度,以便它們可以變得更加「聰明」。 這就是說。無論你在做什麼,你都應該使用適當的架構範例。在這種情況下,簡單的海峽前進方式是迄今爲止最好的。 – acid1789

+0

真的,*它取決於*。因此,他們最終應該怎麼處理,而不是「不要使用全局」。 – Draco18s

0

爲了RestartButton瞭解存儲在SetRestartSetrestart價值,你需要有一個參考SetRestart組件GO。此時RestartButton正在檢查其自己的Setrestart值,該值默認爲0.這就是爲什麼它不起作用。

相反,你需要這樣的:

public class RestartButton : MonoBehaviour 
{ 
    GameObject persistentObject; 

    void Start() 
    { 
     persistentObject = GameObject.Find("NameOfGameObject"); 
     int shouldReset = (persistentObject.GetComponent<SetRestart>() as SetRestart).Setrestart; 
     if (shouldReset == 1) { 
      Application.LoadLevel("Main"); 
     } 
    } 
} 

GameObject.Find不是很大,性能明智的,但對於一個一次性的查找,它的罰款。還有其他獲取引用的方法,但是對於持續跨越場景變化的對象,這是唯一的方法(請注意,我將GameObject引用保存到一個字段中,而不是必需的這裏是這很好練習,所以你不是GO.Find()所有的時間)。

+0

錯誤:未將對象引用設置爲對象的實例。錯誤說它在行上說:int shouldReset =(persistentObject.GetComponent ()as SetRestart).Setrestart; – BelgianWizard

+0

那位我有''NameOfGameObject'''?您需要更改以符合您的設置。 – Draco18s