封装系统自带的Debug

  Unity3d的Debug.Log函数用于打印日志,一般项目中都会对其作如下两件事情:

  (1)希望有一个总的开关来控制整个游戏中日志的打印与否;

  (2)有的系统会将Log封一层并添加统一的标记,比如Skill模块希望打印的日志格式为[Skill]***。

  对于第一个问题,Unity没有统一的开关用于控制日志的输出。对于第二个问题,将Log用一个函数封一层,那么在调试的时候双击Console里面的堆栈时将不能跳转到相应的逻辑块,很麻烦。

  怎么解决呢,有一个办法,就是将Debug.Log封装进一个DLL,话不多说代码如下所示:

using System;
using UnityEngine;

namespace MyDebug
{
    public class Debug
    {
        static public bool Enable = false;
        static public void Log(object message)
        {
            Log(message, null);
        }
        static public void Log(object message, UnityEngine.Object context)
        {
            if (Enable)
            {
                UnityEngine.Debug.Log(message, context);
            }
        }
        static public void LogWarning(object message)
        {
            LogWarning(message, null);
        }
        static public void LogWarning(object message, UnityEngine.Object context)
        {
            if (Enable)
            {
                UnityEngine.Debug.LogWarning(message, context);
            }
        }
        static public void LogError(object message)
        {
            LogError(message, null);
        }
        static public void LogError(object message, UnityEngine.Object context)
        {
            if (Enable)
            {
                UnityEngine.Debug.LogError(message, context);
            }
        }
        public static void LogException(Exception exception)
        {
            UnityEngine.Debug.LogException(exception);
        }
        public static void LogException(Exception exception, UnityEngine.Object context)
        {
            UnityEngine.Debug.LogException(exception, context);
        }
        public static void DrawLine(Vector3 start, Vector3 end)
        {
            UnityEngine.Debug.DrawLine(start, end);
        }
        public static void DrawLine(Vector3 start, Vector3 end, Color color)
        {
            UnityEngine.Debug.DrawLine(start, end, color);
        }
        public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration)
        {
            UnityEngine.Debug.DrawLine(start, end, color, duration);
        }
        public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration, bool depthTest)
        {
            UnityEngine.Debug.DrawLine(start, end, color, duration, depthTest);
        }
        public static void DrawRay(Vector3 start, Vector3 dir)
        {
            UnityEngine.Debug.DrawRay(start, dir);
        }
        public static void DrawRay(Vector3 start, Vector3 dir, Color color)
        {
            UnityEngine.Debug.DrawRay(start, dir, color);
        }
        public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration)
        {
            UnityEngine.Debug.DrawRay(start, dir, color, duration);
        }
        public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration, bool depthTest)
        {
            UnityEngine.Debug.DrawRay(start, dir, color, duration, depthTest);
        }
        public static void Break()
        {
            UnityEngine.Debug.Break();
        }
        public static void ClearDeveloperConsole()
        {
            UnityEngine.Debug.ClearDeveloperConsole();
        }
        public static void DebugBreak()
        {
            UnityEngine.Debug.DebugBreak();
        }
    }
}

  在游戏中有两种用法:

using Debug = MyDebug.Debug;

  然后用法和默认的一样,或者直接使用:

MyDebug.Debug.Log("something");

  同样的,对于第二个问题,可以将Skill系统的Log进行类似的封装:

using System;
using System.Collections.Generic;
using System.Text;

namespace MyDebug
{
    public class SkillDebug
    {
        public static bool Enable = true;

        static public void Log(object message)
        {
           Log(message, null);
        }
        static public void Log(object message, UnityEngine.Object context)
        {
            if (Enable)
            {
                Debug.Log("<color=green>[SKILL]</color>---" + message, context);
            }
        }
        static public void LogWarning(object message)
        {
            LogWarning(message, null);
        }
        static public void LogWarning(object message, UnityEngine.Object context)
        {
            if (Enable)
            {
                Debug.LogWarning("<color=blue>[SKILL]</color>---" + message, context);
            }
        }
        static public void LogError(object message)
        {
            LogError(message, null);
        }
        static public void LogError(object message, UnityEngine.Object context)
        {
            if (Enable)
            {
                Debug.LogError("<color=red>[SKILL]</color>---" + message, context);
            }
        }

    }
}

  注意,在编译库文件的时候,需要手动地设置工程属性中的目标框架,如下图所示:

  将上述代码编译到MyDebug.dll中,并将此dll放入到游戏工程,那么就可以在游戏中自由使用Log功能,并且有统一开关来控制是否打印日志,而且可以进行直接的堆栈跳转了。

时间: 2024-10-26 05:39:24

封装系统自带的Debug的相关文章

tabBar切换不同控制器的封装(自定义导航+自定义uiviewcontroler+系统自带tabbar+自定义tabbarController)

首先,一个app的搭建环境非常重要.既要实现基本功能,又要考虑后期优化的性能. 现在很多应用不仅仅是系统自带的控制器,由于需求复杂,基本上需要自定义多控制器来管理. 新建一个BasicNavigationViewController,继承UINavigationController 在这里实现导航外观,方法什么的. 示例代码如下: 接着自定义一个BasicTabbarViewController,继承UITabBarController 代码如下: #import <UIKit/UIKit.h>

替换Windows系统自带记事本

Windows自带的记事本打开一些简单的短小文本不错,但自带的这个记事本相应的也很残.比如查找替换功能,比如编码格式兼容问题- 为了使记事本使用更方便,我们有不少替代方案,比如 notepad2,notepad++,ultraedit- 个人比较喜欢notepad2-mod,替换分两种,一种直接改名为notepad.exe替换文件,另一种则是使用映像劫持,将名称为notepad.exe的进程劫持到我们指定的程序,以此实现启动记事本时打开我们要的notepad2.exe. 替换文件 Windows

提取了Windows 10 Build 9901 系统自带 高清分辨率壁纸

提取了Windows 10 Build 9901  系统自带 高清分辨率壁纸 下载地址为:http://www.400gb.com/file/81555894

Mac系统自带的Python版本切换

由于需要安装各种python包,所以需要在Mac中端输入各种pip install xxxxxx的命令. 问题:直接运行pip install xxxxxx后,包会安装到系统自带的2.7版本的Python中,而在用高级版本的Python时会出现仍然缺失这个包的现象. 解决:不用删除系统自带的Python2.7的版本(有文章说删除以后系统中由该版本支持的部分会出错),只要在安装时输入pip3 install xxxxx就行了,同理使用python3代替python指令,这样一来,python代表系

Dynamics 2015 数据管理 之 如何批量导入数据到 正式区(二)系统自带示例数据 安装及教学

Dynamics 2015系统自带了一些示例数据,大家可以导入后,用于模拟测试,省得大家输入的时间了, 现分享一下导入的方法,很简单的技巧. 进入方式: 在 设置 ---- 数据管理 菜单进入后,第4行,第二个. 可以在导入中看要导入的交易. 好了,是不是方便大家测试了啊,谢谢.

(八十一)利用系统自带App来实现导航

利用系统的地图App进行导航,只需要传入起点和终点.启动参数,调用MKMapItem的类方法openMapWithItems:launchOptions:来实现定位,调用此方法后会打开系统的地图App. 下面我们来看看这个方法: + (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions; ①第一个参数是一个MapItem数组,每个MapItem中可以包含一个地标,用两个Map

Ios二维码扫描(系统自带的二维码扫描)

Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你当前的控制器中导入 #import <AVFoundation/AVFoundation.h> <AVCaptureMetadataOutputObjectsDelegate>代理 3).在@interface中定义 @property (nonatomic,strong)AVCapt

PB调用系统自带的DLL 实现MD5

适用环境:powerbuilder 10.0以后的版本  window server2003以后的测试可用 PB也可以调用系统自带的DLL 实现MD5 其中md5file对大附件的处理速度也比第三方组件快一些 这里可以去下载附件 //调用样例: u_derek_md5 lu_md5 lu_md5=create u_derek_md5 string ls_text="123" string ls_result,ls_ret string ls_filepath="C:\1.tx

Ecmall系统自带的分页功能

在Ecmall的二次开发中,分页是必不可少的.这个系统已经自带了分页功能,下面来看看如何使用这个分页. 下面是一个自定义的类,用于查看订单的详细情况.关键在于get_order_data()这个方法,分页的使用也在这个方法的内部了.应该有的注释都有了,应该会比较容易懂,我不就多说了. <?php define('NUM_PER_PAGE', 15); // 每页显示数量 class NowaMagicApp extends MallbaseApp { public function index(