运行时关闭unity的Debug.Log

本文介绍如何在Unity游戏开发中,通过自定义Debuger类并将其编译为DLL,实现游戏发布时灵活控制Log输出,避免在用户设备上产生不必要的Log信息。

Debug.unityLogger.logEnabled = false(目前我在unity2018版本中用到)

在开发Unity的时候,在输出log的时候大家都会采用Debug.log()的方式来输出Log,但是游戏发布的时候这样的Log是不能关闭的,在用户手机运行产生一堆LOG也不是啥好事,一定要关闭才行、主要是unity官方也没有提供直接关闭的方法。

既然官方没提供方法,那么我们就得自己想办法。于是我写了一个类把Debug.log包了一层。

C#

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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

}

}

}

 这样我程序在输出Log的时候,我就不调用Debug.Log()了,我使用我新写的这个类。

C#

1

2

3

4

5

void Start ()

{

Debuger.EnableLog = true;

Debuger.Log("雨松MOMO");

}

 

 但是这样问题又来了,因为我如果直接这样写的话,如下图所示,当我输出Log以后,我在Console窗口中双击Log 这时候代码会定位在Debuger这个类的Log方法,这太麻烦了我需要定位在调用Debuger.log()的方法上。

 

为了解决这个问题,我们可以把Debuger类做成一个dll,在终端里面输入如下代码 。。

 

1

mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library ClassesForDLL.cs

 如果你要把多个.cs文件做成一个dll的话,那么在终端里用空格把你的.cs文件分开即可,于是我在终端里面输入,参数 就是我的cs的完整路径。

1

mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library /Users/MOMO/test13/Assets/Debuger.cs

执行完毕后,会自动的在你脚本的平级路径下生成一个同名的dll文件。 在把Debuger.cs文件删除,保留Debuger.dll就可以了。

 

 

如果你的版本正式发布, 你只需找一个合适的地方调用enableLog = true就可以。

 

C#

1

Debuger.EnableLog = true;

开始我想的是在Debuger类里面直接用 #if define这样的标签来做,后来我发现很多问题出现在正式版本里,一旦使用预定义标签编译那么除非重新打包不然是觉对看不到LOG。所以干脆就直接用一个静态变量来标记是否打开Log方便。这样可以让服务端做一个密令一类的东西, 正式版也能让客户端把LOG打开。。

如果你确定你的项目不会出问题,不需要运行时产生log.那么最好使用Conditional, 参数就是条件编译的预定义标签,下面的DEBUG 就是在unity projectsetting 里面 声明 预定义标签, 当然你也可以自己去定义这些标签。这样在调用方法的时候就不会去执行 方法体的内容。。 

需要引入头文件

using System.Diagnostics;
using System;

 

C#

1

2

3

4

5

[Conditional ("DEBUG")]

static public void Log(object message, Object context)

{

Debug.Log(message,context);

}

 

最后我把这个简单的DLL上传一下,大家下载下来就可以直接用了。。或者你也可以按照本文的方法自己来封装。

下载地址: http://pan.baidu.com/s/1ntyoEF3

<think>首先,用户的问题是:“我想查找使用UnityDebug.Log方法所需的命名空间 请问Unity中使用Debug.Log方法需要的命名空间”。用户明确想知道Debug.Log方法必须的命名空间。 从系统级指令来看: - 所有行内数学表达式使用$...$格式(但这个问题不涉及数学,所以可能不需要)。 - 独立公式使用$$...$$(同样不适用)。 - LaTeX语法正确(不涉及)。 - 使用中文回答。 - 生成相关问题(指令要求生成相关问题)。 - 回答中引用的段落末尾自然地添加引用标识(例如:[^1])。 用户提供了几个引用: - 引用[1]: 讨论print和Debug.Log的区别,但没有提到命名空间。 - 引用[2]: 提到一个命名空间namespace Exercise_4_21,里面有Debug.Log的使用,但这不是Unity的标准命名空间。 - 引用[3]: 列出了一些Unity的命名空间,包括using UnityEngine;,并提到它包含调试功能(如Debug.Log)。 - 引用[4]: 展示Debug.Log的使用示例,但没有指定命名空间。 关键点: - 引用[3]明确说:using UnityEngine; 包含调试功能,如Debug.Log。 - 在Unity的标准脚本中,Debug.LogUnityEngine命名空间下的方法。因此,所需的命名空间是UnityEngine。 用户的指令还说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 用户上一次的问题是这个查询本身,所以没有直接的上下文。但用户的问题是直接问命名空间。 回答结构: - 应该结构清晰,逐步解释。 - 提供正确答案:Debug.Log方法在UnityEngine命名空间中。 - 需要添加引用标识:例如,基于引用[3],因为它是直接相关的。 - 生成相关问题:指令要求在最后生成相关问题。 完整回答: 1. **直接回答问题**:Unity中使用Debug.Log方法所需的命名空间是UnityEngine。 2. **解释**:简要说明原因,并引用相关引用。 3. **添加引用**:在解释部分末尾添加引用标识。 4. **生成相关问题**:在最后一部分列出几个相关问题。 相关问题应该基于主题: - 例如: - 1. Debug.Log还有哪些常用方法? - 2. 如何在Unity中禁用调试日志输出? - 3. 为什么Unity中有print和Debug.Log两个方法? - 4. 命名空间在Unity中的作用是什么? 确保回答中文。 最终回答大纲: - 开头:明确回答问题。 - 中间:解释细节,引用参考。 - 结尾:生成相关问题。 </think>### Unity中使用Debug.Log方法所需的命名空间 在Unity中,使用`Debug.Log`方法输出调试信息,必须引用`UnityEngine`命名空间。以下是详细解释: - **核心答案**:`Debug.Log`方法属于`UnityEngine`命名空间下的`Debug`类。因此,在你的C#脚本中,需要在代码文件顶部添加`using UnityEngine;`语句来启用该方法: ```csharp using UnityEngine; // 引入所需的命名空间 public class ExampleScript : MonoBehaviour { void Start() { Debug.Log("Hello, Unity!"); // 正确使用Debug.Log } } ``` 如果不添加`using UnityEngine;`,编译器会报错提示`Debug`未定义。 - **原因分析**: - `UnityEngine`是Unity的核心命名空间,它包含了游戏引擎的基本功能,如调试工具、GameObject管理、物理系统等。`Debug.Log`作为调试输出的主要方法,正是在这个命名空间下定义的[^3]。 - 其他命名空间(如`UnityEngine.SceneManagement`或自定义命名空间)可能包含类似方法,但`Debug.Log`的标准用法始终依赖于`UnityEngine`。例如,引用[2]中的自定义命名空间`namespace Exercise_4_21`演示了`Debug.Log`的使用,但它实际上是间接引用了`UnityEngine`(因为脚本默认继承了Unity的上下文)[^2]。 - 相比之下,`print`方法是Unity的快捷方式(常用于`MonoBehaviour`子类),它内部也调用`Debug.Log`,但不需要显式引用命名空间;而`Debug.Log`提供了更灵活的调试控制,如日志级别过滤[^1]。 总之,确保在脚本开头添加`using UnityEngine;`即可使用`Debug.Log`。如果遇到错误,检查命名空间引用是否正确。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值