Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我在为Unity编写的状态管理器脚本中为每个Debug.Log获得两个输出?_C#_Unity3d - Fatal编程技术网

C# 为什么我在为Unity编写的状态管理器脚本中为每个Debug.Log获得两个输出?

C# 为什么我在为Unity编写的状态管理器脚本中为每个Debug.Log获得两个输出?,c#,unity3d,C#,Unity3d,我正在用C#为Unity编写一个州经理脚本。一切看起来都是正确的,但当我在Unity中测试它时,所有Debug.Log行输出两次。我正在跟随一本名为《通过使用Unity 3D初学者指南开发游戏学习C#》的书。我一直在研究参考资料,我不知道我做错了什么。我认为脚本远未完成,但根据文本,每个日志应该只有一个输出 这是我的接口ISBase namespace Assets.Code.Interfaces { public interface IStateBase { v

我正在用C#为Unity编写一个州经理脚本。一切看起来都是正确的,但当我在Unity中测试它时,所有Debug.Log行输出两次。我正在跟随一本名为《通过使用Unity 3D初学者指南开发游戏学习C#》的书。我一直在研究参考资料,我不知道我做错了什么。我认为脚本远未完成,但根据文本,每个日志应该只有一个输出

这是我的接口ISBase

namespace Assets.Code.Interfaces
{
    public interface IStateBase
    {
        void StateUpdate();
        void ShowIt();
        void StateFixedUpdate();
    }
}
这是我的开始状态,还有一个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()
        {

        }
    }
}
这是真正的州经理

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;
    }
}

您是否已检查是否有两个相同的脚本意外附加到同一游戏对象? 通常,当我在没有注意到的情况下两次附加同一脚本时,会出现重复日志

另一方面,我建议在切换状态时防止输入发生。任何与用户输入有关的内容都需要一些防范措施,以防快速重复

e、 g


如果它打印两次,则表示调用完成两次

虽然听起来很明显,但是要找到它是一件很重要的事情,我相信Unity会为您指出一行代码,如果您双击编辑器中的console条目的话。这将打开您的IDE,或者如果它是打开的,只需将IDE指向调用的行即可

基于此,您可能会发现在多个对象上有相同的脚本;或者,您可能在脚本的两个不同位置有相同的debug.log调用,但这些调用彼此靠近执行,最后看到的是相同的语句


如果不设置断点,一步一步地进行操作,那就没什么可做的了。

@Aravol,哇,谢谢你修复了我的帖子,我知道这很难阅读。我不知道如何发布,我只是从Unity附带的MonoDevelop中复制和粘贴。很抱歉,我发布了这样一篇草率的帖子。这是我们获得的几千名代表的特权。请记住,下次点击“代码格式”按钮(看起来像
{}
)查找大型代码块时,它们会粘在一起。您需要再发布一篇相关文章-您的应用程序配置(或使用默认设置)跟踪-很可能最终有2个跟踪侦听器(可能是输出+控制台,并将控制台重定向到VS中的输出)。@AlexeiLevenkov Hello。我不知道该怎么做你要的。我猜VS是视觉工作室,我没有。我在用Mac电脑。我在这方面比较新。我得做些调查,看看我能不能找到你要的信息。谢谢大家!@SeaNuHL我想-考虑添加你使用Mac到你的帖子…我不知道跟踪在您使用的任何工具中是如何配置的,所以我不能提出任何建议。显示我的评论谈论的配置架构。。。祝你好运
if (!switchingStateCoolDown) {
  Input.GetKeyUp (KeyCode.Space) { ... };
}

// hope you get the idea.