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