SmartFoxServer 与 Unity 日志记录问题

Posted

技术标签:

【中文标题】SmartFoxServer 与 Unity 日志记录问题【英文标题】:SmartFoxServer with Unity Logging issue 【发布时间】:2017-06-28 03:13:05 【问题描述】:

我有一个关于 Debug.Log 如何在 Unity 中使用 SmartFoxServer 工作的问题。我正在写一个多人游戏。游戏将始终有四个玩家。由于 Unity/Visual Studio 的问题,我无法使用 Visual Studio 调试器(每次遇到断点时 Unity 都会崩溃)。所以,我使用 Debug.Log。

我的问题是:当我有四个正在运行的客户端(一个在 Unity 中,另外三个来自运行已编译的版本)并且我运行了 Debug.Log 代码时,它会针对每个实例运行还是仅针对 Unity实例?

仅供参考,当我进行构建时,我只是进行正常构建。我没有检查开发构建。当我从服务器收到响应时,我看到了奇怪的行为。有时,Debug.Log 会打印 4 次,有时只打印一次。我可以调试我的 Java 扩展并且断点只被命中一次。

这里是一些 Unity C# 代码示例:

public void OnExtensionResponse(BaseEvent evt)         
        string cmd = (string)evt.Params["cmd"];
        SFSObject dataObject = (SFSObject)evt.Params["params"];
        Debug.Log("Got response from server: " + cmd + " " + dataObject.GetUtfString("gameStatus"));
        switch ( cmd ) 


        

有时上面的 Debug.Log 代码会被调用一次,有时会被调用 2 次或 5 次。根据 Logging 的工作方式,我预计会运行 1 次(它仅针对运行的 Unity 版本进行调试)或 4 次(运行的每个游戏实例一次)。

谢谢

【问题讨论】:

【参考方案1】:

Debug.Log 将为每个实例运行,如果您想查看已编译版本上的消息(我假设为 exe),那么我建议您构建一个名为 Debug_UI 的类,它的唯一目的是显示来自 Debug 的所有消息.登录到 OnGui 方法。首先使用您要记录的消息调用静态函数,该函数将调用 Debug.Log 并将该日志插入到静态列表中,该列表将用于在 OnGui 上显示这些消息。

// 带有DebugMessage函数的静态工具类

public static List<string> logs= new List<string>();
public static  void DebugMessage (string logType, string message) 
                    logs.Add(message); 
                    if (logType.Equals("warning"))
                        Debug.LogWarning(message);
                    else if (logType.Equals("regular"))
                        Debug.Log(message);
                    else if (logType.Equals("error"))
                        Debug.LogError(message);
                

// Debug_UI 类

private bool _display;
private bool _log;
public Vector2 scrollPosition;

void OnGUI()

    if (GUILayout.Button("Log")) _log = !_log;

    if (_log)
    
        scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Width(Screen.width), GUILayout.Height(Screen.height-130));

        for(int i= Utilities.logs.Count-1; i >0; i--)
        
            GUILayout.Label(Utilities.logs[i]);
        
        GUILayout.EndScrollView();

        if (GUILayout.Button("Clear"))
            Utilities.logs.Clear();

        if (GUILayout.Button("Copy To Clipboard"))
            GUIUtility.systemCopyBuffer = CopyToClipboard();
    


private string CopyToClipboard()

    string response = null;
    for (int i = Utilities.logs.Count - 1; i > 0; i--)
    
        response += Utilities.logs[i] + "\n";
    

    return response;

// 你将如何在你的代码中使用它

public void OnExtensionResponse(BaseEvent evt)         
        string cmd = (string)evt.Params["cmd"];
        SFSObject dataObject = (SFSObject)evt.Params["params"];
        Utilities.Text.DebugMessage("normal","Got response from server: " + cmd + " " + dataObject.GetUtfString("gameStatus"));
        switch ( cmd ) 


        

对于多次调用的消息,您应该检查您没有在其他类中实现 OnExtensionResponse 方法,或者该类没有附加到层次结构中的更多对象。

【讨论】:

以上是关于SmartFoxServer 与 Unity 日志记录问题的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:无法在 smartFoxServer 中创建日志文件

登录时区分注册用户和访客

我无法更新我的扩展 - SmartFoxServer

使用 SmartFoxServer 实现 Hazelcast

如何使用 SmartFoxServer 2X 连接 MySQL 数据库?

SmartFoxServer 无法连接到服务器