2015-01-09 183 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,但是这些调用彼此靠近执行,最终会看到相同的语句。

没有太多可以做的,没有把一个断点,并逐步

相关问题