2016-06-08 54 views
0

我以前已經問過這個問題,我想我得到了答案,但它並沒有爲我工作。所以,這裏又是。Unity不保留場景之間的重要狀態

Unity does not保持場景之間的關鍵狀態。例如,假設我按住Space並使用以下單詞跟蹤單詞「Hello」:

Input.GetKey(KeyCode.Space)){ 
     print("Hello!"); 
} 

現在。比方說,我使用重置場景:

Application.LoadLevel(0); 

SceneManager.LoadScene(0); 

哪一個適合你。如果我重置場景,但我是仍然保持空間,沒有任何反應,直到我舉起我的手指,並再次放下它。當我構建2D Top Down遊戲時,這是一個巨大的問題,因爲我打算讓建築物和內部的東西變成不同的場景。有沒有人有任何想法?請不要建議

DontDestroyOnLoad 

因爲這是行不通的。我試過了,你可以自己試試。任何其他想法或技巧或我失蹤的東西?我在這裏絕望。謝謝。

我正在使用C#和Unity。

回答

1

團結不守場景

也就是說部分不是事實之間keystates。發生什麼是Unity的Input.GetKey(KeyCode.Space)將返回false第一幀加載新場景時。這僅發生在第一幀。之後,如果空格鍵仍然關閉,它將繼續返回true。此聲明基於Unity 5.4.0b13。如果你看到不同的結果,你必須更新。

解決方案是將您的Input.GetKey(KeyCode.Space)放入coroutine,然後在檢查按鍵之前等待yield return null;一幀。

void Start() 
{ 
    StartCoroutine(readKey()); 
} 

bool keepReading = false; 
IEnumerator readKey() 
{ 
    if (keepReading) 
    { 
     yield break; 
    } 
    keepReading = true; 

    yield return null; 

    while (keepReading) 
    { 
     if (Input.GetKey(KeyCode.Space)) 
     { 
      Debug.Log("Hello!"); 
     } 
     else 
     { 
      Debug.Log("Not down!"); 
     } 
     yield return null; 
    } 
} 

void stopReading() 
{ 
    keepReading = false; 
} 

另一種選擇是使用布爾變量來確定何時在下一幀。

bool afterFirstFrame = false; 
void Update() 
{ 
    if (afterFirstFrame) 
    { 
     //Put your code here 

     if (Input.GetKey(KeyCode.Space)) 
     { 
      Debug.Log("Hello!"); 
     } 
     else 
     { 
      Debug.Log("Not down!"); 
     } 
    } 

    if (!afterFirstFrame) 
    { 
     afterFirstFrame = true; 
    } 
} 
+0

我在5.3。我想這可能是一個原因。謝謝,給我一段時間在我標記之前查看它。 – GMR516

+1

@ GMR516嘗試更新之前我有的代碼。如果您仍有問題,請將Unity更新至我的版本。我測試了它來驗證。 – Programmer

+0

我在最新版本(5.4)上測試了這兩個代碼,但它仍然無效。 – GMR516

0

以下可能不是最乾淨的方法,但它適用於一些粗糙的測試。

通過使用PlayerPrefs,您可以存儲狀態表示並在新加載場景的Start()函數中對其進行測試。

它將創建的功能是,如果用戶在切換場景之前握住它,它將驗證第一幀爲真。只有當用戶允許釋放按鈕時,它纔會停止驗證真實。

再一次,這是一種強制操作的實現,但需要進行自定義以確保其在其他情況下的行爲正確。

private bool isPressed = false; 

void Start() 
{ 
    if (PlayerPrefs.GetInt("Pressed") != 0) 
     isPressed = true; 
    else 
     isPressed = false; 
} 

void Update() 
{ 
    if (isPressed) 
     print("Hello World"); 

    if (Input.GetKey(KeyCode.Space)) 
    { 
     if (!isPressed) isPressed = true; 
    } 

    if (Input.GetKeyUp(KeyCode.Space)) 
    { 
     isPressed = false; 
    } 
} 

public void SaveButtonState() 
{ 
    if(isPressed) 
     PlayerPrefs.SetInt("Pressed", 1); 
    else 
     PlayerPrefs.SetInt("Pressed", 0); 
} 
+0

它的工作原理,但它有點hacky。顯然,團結5.4在那裏添加了在場景之間按住按鈕的功能,所以我要去檢查一下。如果它仍然不起作用,我會將你標記爲答案。 – GMR516

+0

@ GMR516的確有點哈哈哈哈。無論哪種方式,希望你能以最好的方式爲你的應用程序工作! – ejsd1989

0

你有沒有試過在你的主要級別以下的地方添加你的內部級別。在玩家離開建築物之後,您只需將玩家移動到這一點,即可卸下場景並將玩家移回他所在的位置。