unity中Debug输出控制

1 需求:

(1)选择在界面、console中输出,并且能够设置保存到文档

(2)控制debug是否输出,可以在debug模式下输出,release模式下不输出

2 参考:

谢谢雨松同学的博客:http://www.xuanyusong.com/archives/2782 , 雨松飞天般的想法实在太奇妙了,虽然我现在还没有理解里面的原理。雨松把debug类常用函数封装在debuger类中,然后通过封装DLL的方式解决Log输出后的定位的问题。

3 方案:

  3.1  Dll生成

Debug输出控制类Debuger,通过EnableLog 控制书否输出Log。

using UnityEngine;
using System.Collections;

public class Debuger
{
    static public bool EnableLog = false;
    static public void Log(object message)
    {
        Log(message, null);
    }
    static public void Log(object message, Object context)
    {
        if (EnableLog)
        {
            Debug.Log(message, context);
        }
    }
    static public void LogError(object message)
    {
        LogError(message, null);
    }
    static public void LogError(object message, Object context)
    {
        if (EnableLog)
        {
            Debug.LogError(message, context);
        }
    }
    static public void LogWarning(object message)
    {
        LogWarning(message, null);
    }
    static public void LogWarning(object message, Object context)
    {
        if (EnableLog)
        {
            Debug.LogWarning(message, context);
        }
    }
}

 雨松提供下载的Dll,使用MonoDevelop编译器生成,在VS下可以用,但是会提示Debuger错误。在VS模式下,

(1)可以建议一个C# dll工程,.Net版本设置为3.5(4.0也会提示不兼容,如果MonoDevelop生成,则提示的.Net版本更低)

(2)引入unityEngine.dll库,不然你编译不过,OK ,然后编译一下就好了。

3.2 Unity中的使用

为了实现是否输出、输出位置、输出参数控制以及在界面中不同输出类型的效果、重复代码的检测等等,我顶层有重新进行封装了一下,不过文件的save,没仔细实现,直接代码吧:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;

public class strLog
{
    public string log;
    public LogType type;
    public uint num;

    public strLog(string _str, LogType _type, uint _num)
    {
        log = _str;
        type = _type;
        num = _num;
    }

    public void AddNum(uint _num)
    {
        Debug.Log(num);
        num += _num;
    }
}

public class DebuggerManager : MonoBehaviour
{
    //打开Debug信息输出
    public bool m_isEnableDebugOut = true;

    //打开界面调试信息输出
    public bool m_isEnableShowLogInGui = true;

    //打开调试堆栈信息输出
    public bool m_isEnableShowTraceInfoInGui = false ;

    //打开调试信息文件记录
    public bool m_isEnableSaveInText = false;

    void Start()
    {
        if (false == m_isEnableDebugOut)
        {
            Debuger.EnableLog = false;
            return;
        }

        Debuger.EnableLog = true;
        Application.RegisterLogCallback(HandleLog);

        if (false == m_isEnableSaveInText)
            return;

        m_DebugTextPath = Application.persistentDataPath + "/outLog.txt";
        if (System.IO.File.Exists(m_DebugTextPath))
        {
            File.Delete(m_DebugTextPath);
        }
    }

    void Update()
    {
        WriteLogToFile();
    }

    void HandleLog(string logString, string stackTrace, LogType type)
    {
        if (m_isEnableShowLogInGui)
        {
            AddToShowList(type,logString);
        }

        if (m_isEnableShowTraceInfoInGui)
        {
            AddToShowList(type,stackTrace);
        }

        if (m_isEnableSaveInText)
        {
            AddToSaveList(logString);
        }
    }

    void OnGUI()
    {
        if (!m_isEnableShowLogInGui && !m_isEnableShowTraceInfoInGui)
            return;

        foreach(strLog log in m_GuiTextLines)
        {
            Color showClr = new Color(0.0f, 0.0f, 0.0f, 1.0f);
            if (log.type == LogType.Error)
            {
                showClr.r = 1.0f;
            }
            else if (log.type == LogType.Warning)
            {
                showClr.r = 1.0f;
                showClr.g = 1.0f;
            }
            else if (log.type == LogType.Log)
            {
                showClr.g = 1.0f;
            }

            GUI.skin.label.normal.textColor = showClr;
            GUI.skin.label.fontSize = 12;
            GUI.skin.label.alignment = TextAnchor.UpperLeft;
            GUILayout.Label("【" + log.num.ToString() + "】 -->" + log.log);
        }
    }

   public  static void AddToShowList(LogType type , params object[] objs)
    {
        if (!Application.isPlaying)
        {
            return;
        }

        string strShowInGui = " ";

        for (int i = 0; i < objs.Length; ++i)
        {
            if (i == 0)
            {
                strShowInGui += objs[i].ToString();
            }
            else
            {
                strShowInGui += ", " + objs[i].ToString();
            }
        }

       for (int i = 0; i < m_GuiTextLines.Count; ++i)
       {
           if (m_GuiTextLines[i].log == strShowInGui)
           {
               m_GuiTextLines[i].AddNum(1);
               return;
           }
       }

       if (m_GuiTextLines.Count > constMaxNum_ShowInGui)
       {
            m_GuiTextLines.RemoveAt(0);
       }

       m_GuiTextLines.Add(new strLog(strShowInGui,type,0));
    }

    void WriteLogToFile()
    {
       if (false == m_isEnableDebugOut)
       {
           return;
       }

       if (m_TxtSavetoFile.Count > 0)
       {
           string[] temp = m_TxtSavetoFile.ToArray();
           foreach (string t in temp)
           {
               using (StreamWriter writer = new StreamWriter(m_DebugTextPath, true, Encoding.UTF8))
               {
                   writer.WriteLine(t);
               }
               m_TxtSavetoFile.Remove(t);
           }
       }
    }

    public static void AddToSaveList(string strLog)
    {
        m_TxtSavetoFile.Add(strLog);
    }

    static List<strLog> m_GuiTextLines = new List<strLog>();
    static List<string> m_TxtSavetoFile   = new List<string>();
    private string m_DebugTextPath;
    private const int constMaxNum_ShowInGui = 20;
}

4 效果

 

 

 

 

 

Demo下载:http://pan.baidu.com/s/1jGBUK3G

转载请注明:细雨淅淅

时间: 2024-11-04 20:57:00

unity中Debug输出控制的相关文章

unity中camera摄像头控制详解

目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品是使用unity开发水利BIM(水利建筑信息模型),项目中需要控制摄像 头对模型进行360度查看,请注意所有操作都是移动摄像头,不是移动模型.摄 像头能进行移动.旋转.改变焦距操作,类似于SketchUp的控制操作: 摄像头移动时,根据当前旋转方向(Rotation)进行移动 摄像头距离模型越远,摄

Unity 中Debug打印的全局注释方式和重写

我们在做项目的时候经常会遇到这样的一种情况,进行打印输出特别多,用来调试错误,但是我们往往会遇到这种情况,项目后期我们往往会去取消那些打印,但是当我们一个一个去取消的话就会显得相对较为麻烦, 现在我告诉大家快速取消注释和打开注释的两种方法: 第一种方法:(重写Debug类) using System; using UnityEngine; public class Debug { public static bool EnableLog = true; public static void Dr

unity中摄像机的控制---调整摄像机,不让他摔倒

摄像机大部分人都会控制,最明显的就是让他旋转,随着鼠标的左右上下移动而旋转,但是总是会遇到一个问题,就是转着转着就仿佛他自己摔倒了似的,其实就是它本身绕着Z轴旋转了 这样就不是我们想要的结果了 要想解决也简单,就是最后修正一下就好 this.transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0); 我这段代码是直接给了相机了,所以用的是this,这样摄像机就不会自己乱转了

重新定制 Unity引擎的Debug 输出

孙广东  2015.8.31 之前 写过定制 Unity引擎的Debug 输出 的文章如下: http://blog.csdn.net/u010019717/article/details/43582737 但是存在 先天的点,  当我们 双击 Debug 输出的时候, Visual Studio 并不能 自动 跳转到  指定的 错误行,  而是跳转到 Log 的输出行(就是之前的 MyDebug 脚本的函数内). 这就带来了很大的不方便. 所以为了解决这个问题, 今天发表 文章: 项目的输入如

思科命令配置小技巧四:用ACL控制debug 输出

使用debug命令可以帮助我们TS,但是使用debug命令往往会输出一大堆信息,很多是我们不需要用的,也会造成CPU高负荷,这种情况下我们可以限制debug的输出 可以应用ACL到debug以限定仅输出要求的debug信息. 如仅查看从1.1.1.1到1.1.1.2的ICMP包: Router(config)# access-list 100 permit icmp host 1.1.1.1 host 1.1.1.2 Router# debug ip packet detail 100 思科命令

iOS中debug调试输出日志

在.pch中写: #ifdef DEBUG  // 调试阶段 #define CXSLog(...) NSLog(__VA_ARGS__) #else // 发布阶段 #define CXSLog (...) #endif iOS中debug调试输出日志,布布扣,bubuko.com

用Unity实现Minecraft中的镜头控制

在学习Unity的过程中,最基本而又最重要的一部分就是镜头控制(Camera Control). 镜头控制就是通过鼠标.键盘等输入设备的操作,来实现在游戏中的导航.在Unity中的本质是通过接收鼠标的移动和键盘的按键,来变换相机对象(Camera)的位置(position)和旋转(rotation),这两个值位于camera的transform组件(conponent)中. 在这里我们通过实现<我的世界>中创造模式的镜头控制方式来学习第一人称的镜头控制. 在我的世界中,镜头的朝向(旋转)是通过

SD--如何在输出控制中增加自定义字段

在sap的输出控制中,我们有时需要增加系统未定义的字段作为条件表的字段,为了实现该需求我们就需要修改增强. 输出控制用到的通讯结构 KOMKBK1 (Output Determination Communication Area CAS Appl. K1) KOMKBV1 (Output Determination Communication Area Header Appl. V1) KOMKBV2 (Output Determination Communication Area Header

(Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目,选择类库,取名为JefferyChan,具体步骤如下图: 3.因为要调用Unity中的相关文件,所以这里要引入外部文件.首先在Unity的安装文件夹中找到UnityEngine.dll,我的路径是:D:\Program Files (x86)\Unity\Editor\Data\Managed 如