Unity游戏内显示报错信息

忙碌的五月份开始咯~最近刚好做了一个Unity的显示报错工具,就分享出来吧~

工具起源

Unity游戏导出的PC版本,默认情况下是看不到报错信息的,为了方便测试人员查看报错信息,定位Bug的归属,于是有了下边这个小工具。

先看效果图吧。

可以设置开始监听,停止监听,清空记录。

可以查看到报错的详细堆栈信息。

实现原理

简单来说,是这样的~

  • Unity提供了一个事件,Application.logMessageReceived,可以在接收到log信息的时候触发自定义log处理函数。

  • 在log处理函数里边,将log存储起来。

  • 制作一个窗口,负责显示已经存储的log信息。

直接上代码吧~

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System.Collections.Generic;
using UnityEngine;
namespace TestCenter.Utils {
public class ShowError : MonoBehaviour {
static List<string> ErrorMsgs = new List<string>();
bool ShowWindow = false;
bool Record = false;
Rect UIRect = new Rect(0, Screen.height / 2, Screen.width, Screen.height / 2);
Vector2 ScrollPosition = Vector2.zero;
void Start() {
}
void OnGUI() {
if (ShowWindow) {
if (GUI.Button(new Rect(0, (Screen.height / 3 + 90), 50, 30), "隐藏")) {
ShowWindow = false;
}
} else {
if (GUI.Button(new Rect(0, (Screen.height / 3 + 90), 50, 30), "显示")) {
ShowWindow = true;
}
}
if (ShowWindow) {
UIRect = GUI.Window(1, UIRect, ErrorWindowFunc, "Log监听");
}
}
void ErrorWindowFunc(int windowID) {
GUI.DragWindow(new Rect(0, 0, UIRect.width, 30));
GUI.Box(new Rect(0, 0, UIRect.width, UIRect.height), "");
GUILayout.BeginArea(new Rect(5, 20, UIRect.width - 10, UIRect.height));
ScrollPosition = GUILayout.BeginScrollView(ScrollPosition, GUILayout.Width(UIRect.width - 10), GUILayout.Height(UIRect.height - 60));
GUILayout.BeginVertical();
foreach (var Log in ErrorMsgs) {
GUILayout.Label(Log);
}
GUILayout.EndVertical();
GUILayout.EndScrollView();
GUILayout.BeginHorizontal();
if (Record) {
if (GUILayout.Button("停止监听")) {
Application.logMessageReceived -= HandleLog;
Record = false;
}
} else {
if (GUILayout.Button("监听Log")) {
Application.logMessageReceived += HandleLog;
Record = true;
}
}
if (GUILayout.Button("清空记录")) {
ErrorMsgs.Clear();
}
GUILayout.EndHorizontal();
GUILayout.EndArea();
}
void Update() {
}
void HandleLog(string log, string trace, LogType type) {
if (type.Equals(LogType.Error) || type.Equals(LogType.Exception)) {
ErrorMsgs.Add(log);
ErrorMsgs.Add(trace);
}
}
}
}

将脚本直接挂在主场景的Main Camera即可使用,源码已在Github