2015-01-09 180 views
1

我正在爲C#編寫Unity的狀態管理器腳本。一切似乎都是正確的,但是當我在Unity內測試它時,所有Debug.Log行輸出兩次。我正在跟着一本名爲的書一起學習C#通過Unity 3D開發遊戲初學者指南。我已經研究和研究了這個參考文獻,我沒有看到我做錯了什麼。我認爲腳本遠未完成,但根據文本,每個日誌只能有一個輸出。爲什麼我在爲Unity編寫的狀態管理器腳本中爲每個Debug.Log生成兩個輸出?

這是我的ISBase接口。

namespace Assets.Code.Interfaces 
{ 
    public interface IStateBase 
    { 
     void StateUpdate(); 
     void ShowIt(); 
     void StateFixedUpdate(); 
    } 
} 

這是我的BeginState,還有一個PlayState,WonState和LostState。除了類名,構造函數名,Debug.Log輸出以及新的SwitchState之外,它們幾乎完全相同。

using UnityEngine; 
using Assets.Code.Interfaces; 

namespace Assets.Code.States 
{ 
    public class BeginState : IStateBase 
    { 
     private StateManager manager; 

     public BeginState (StateManager managerRef) //Constructor 
     { 
      manager = managerRef; 
      Debug.Log ("Constructing BeginState"); 
     } 

     public void StateUpdate() 
     { 
      if (Input.GetKeyUp (KeyCode.Space)) 
           manager.SwitchState (new PlayState (manager)); 
     } 

     public void ShowIt() 
     { 

     } 

     public void StateFixedUpdate() 
     { 

     } 
    } 
} 

這裏是實際的StateManager。

using UnityEngine; 
using Assets.Code.States; 
using Assets.Code.Interfaces; 

public class StateManager : MonoBehaviour 
{ 
    private IStateBase activeState; 

    void Start() 
    { 
     activeState = new BeginState (this); 
    } 

    void Update() 
    { 
     if (activeState != null) 
         activeState.StateUpdate(); 
    } 

    public void SwitchState(IStateBase newState) 
    { 
     activeState = newState; 
    } 
} 
+0

@Aravol按照步驟,哇謝謝你修我的帖子,我知道這是很難讀。我不知道如何發佈,我只是複製並粘貼Unity隨附的MonoDevelop。我很抱歉發佈這樣一個馬虎的帖子。 – seanuhl 2015-01-09 20:48:49

+0

這是我們與幾千名代表獲得的獎勵。只需記住下次點擊大碼塊的「代碼格式」按鈕(看起來像是「{}」),以便它們全部粘在一起 – David 2015-01-09 21:03:28

+0

您需要發佈一個更多的相關內容 - 您配置的應用程序配置(或使用默認)跟蹤 - 可能最終會有2個跟蹤監聽器(可能是Output + Console並將控制檯重定向到VS中輸出)。 – 2015-01-09 21:12:40

回答

0

你有沒有檢查過你是否有兩個相同的腳本不小心連接到同一個遊戲對象? 通常重複日誌發生在我身上時,我有兩次連接相同的腳本沒有我注意到它。

另一方面,我建議在切換狀態時防止輸入發生。與用戶輸入有關的任何事情都需要快速重複的警惕。

例如

if (!switchingStateCoolDown) { 
    Input.GetKeyUp (KeyCode.Space) { ... }; 
} 

// hope you get the idea. 
1

如果打印兩次,則表示該呼叫已完成兩次。

聽起來很明顯,它是一個追蹤它的問題,並且如果雙擊編輯器中的控制檯條目,我相信Unity會指向您調用的代碼行。這應該打開你的IDE,或者如果它是打開的,只需將IDE指向所調用的行即可。

基於此,您可能會發現您在多個對象上具有相同的腳本;或者您可能在腳本的兩個不同位置調用相同的debug.log,但是這些調用彼此靠近執行,最終會看到相同的語句。

沒有太多可以做的,沒有把一個斷點,並逐步

相關問題