這個應該屬於擼一個適合自己的小遊戲框架的第二篇。上一篇是Ui腳本自動生成。
在完成Ui自動生成後,想到了一個問題。就是log信息的顯示,因爲log是開發中的重要部分。所以就準備重新整理一下適合自己的log信息部分。
需求1:編輯環境Log信息打開,正式版本log信息關閉。因爲log信息也是程序執行的一部分,大量log信息也會消耗性能。
然後很簡單解決。
正式發包前,在腳本中添加 Debug.unityLogger.logEnabled = false即可。據說是某個Untiy版本後才能用。
需求2:添加標籤。方便查找Bug時進行過濾搜索。
很簡單,自定義一個logtag,在需要加標記的地方加上即可。
需求3:打印不同顏色的log
網上有很多類似這種的方法。
Debug.Log("-><color=#FF6A6A>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#FFFFFF>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#FFFF00>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#EE6A50>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#CDC5BF>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#8E388E>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#7A7A7A>" + "我是控制檯帶顏色的字體" + "</color>");
Debug.Log("-><color=#00EEEE>" + "我是控制檯帶顏色的字體" + "</color>");
那麼,我換顏色還要分顏色來封裝方法嗎?那就特麼要類死了。
於是我們就要依託Unity的顏色庫來封裝這個方法了。
那麼如何把Unity中的color轉換成FFFFFF這種格式呢?我又找到了這種方法。
public static string ColorToHex(Color color)
{
int r = Mathf.RoundToInt(color.r * 255.0f);
int g = Mathf.RoundToInt(color.g * 255.0f);
int b = Mathf.RoundToInt(color.b * 255.0f);
string hex = string.Format("{0:X2}{1:X2}{2:X2}", r, g, b);
return hex;
}
完美解決問題了。我們現在可以把字符設置成任意顏色了。
我本來以爲完結了,但當我重新整理方法時突然發現另一個類
//
// 摘要:
// A collection of common color functions.
[NativeHeader("Runtime/Export/ColorUtility.bindings.h")]
public class ColorUtility
{
public ColorUtility();
//
// 摘要:
// Returns the color as a hexadecimal string in the format "RRGGBB".
//
// 參數:
// color:
// The color to be converted.
//
// 返回結果:
// Hexadecimal string representing the color.
public static string ToHtmlStringRGB(Color color);
//
// 摘要:
// Returns the color as a hexadecimal string in the format "RRGGBBAA".
//
// 參數:
// color:
// The color to be converted.
//
// 返回結果:
// Hexadecimal string representing the color.
public static string ToHtmlStringRGBA(Color color);
public static bool TryParseHtmlString(string htmlString, out Color color);
這個類不僅提供了Unity顏色和HTMI格式互相轉換的方法,還提供了Unity顏色轉帶alpha通道的HTMI格式的顏色的方法。
HTMI格式轉UnityColor的用法。
public static Color HtmlStringRGB(string htmlString)
{
Color color;
ColorUtility.TryParseHtmlString(htmlString,out color);
return color;
}
下面附上我的log代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyLog{
public static void Log(string info)
{
Debug.Log(info);
}
public static void LogError(string info)
{
Debug.LogError(info);
}
public static void LogWarning(string info)
{
Debug.LogWarning(info);
}
public static void LogWithTag(string info, LogTag logTag)
{
string temp = logTag.ToString();
Debug.Log(temp + ":" + info);
}
public static void LogWithColor(string info,Color color)
{
string MyColor = ColorUtility.ToHtmlStringRGB(color);
Debug.Log("-><color=#"+MyColor+">" + info + "</color>");
}
}
public enum LogTag
{
UnityTag_Info,
UnityTag_Sdk,
UnityTag_Ads,
UnityTag_Editor,
}
只是把Unity的log重新封裝了一層,仍然可以通過 Debug.unityLogger.logEnabled = false 關閉。只封裝了我常用的一些,這裏只是拋磚引玉,其它的log方法都可以繼續組合封裝。當然,可以控制顏色自然也能控制大小之類的。不做贅述。
另外,有的人不喜歡通過編輯器看log,想通過屏幕看log信息的話。
也很簡單,思路就是獲得log信息,顯示到屏幕上。至於怎麼顯示,不要遮擋Ui就行了。
public class LogComponent : MonoBehaviour
{
private bool IsDevelopment;
private Vector2 m_scroll = new Vector2(0, 180);
List<string> mLogs = new List<string>();
void Start()
{
GameObject.DontDestroyOnLoad(gameObject);
}
void OnEnable()
{
Application.logMessageReceived += HandleLog;
}
void OnDisable()
{
Application.logMessageReceived -= HandleLog;
}
void HandleLog(string logString, string stackTrace, LogType type)
{
string str = logString + "\r\n" + stackTrace;
string logMsg = string.Format("[{0:u}][{1}]\r\n{2}", System.DateTime.Now, "tag", str);
mLogs.Add(logMsg);
}
void ClearLog()
{
mLogs.Clear();
}
void OnGUI()
{
GUILayout.BeginArea(new Rect(0, 0, 180, 160));
if (GUILayout.Button("Show Log", GUILayout.Width(180f), GUILayout.Height(80f)))
{
IsDevelopment = IsDevelopment ? false : true;
}
GUILayout.EndArea();
GUILayout.BeginArea(new Rect(180, 0, 180, 160));
if (GUILayout.Button("Clear Log", GUILayout.Width(180f), GUILayout.Height(80f)))
{
ClearLog();
}
GUILayout.EndArea();
if (!IsDevelopment)
return;
GUILayout.BeginArea(new Rect(0, 180, Screen.width, Screen.height - 180));
m_scroll = GUILayout.BeginScrollView(m_scroll, GUILayout.Width(Screen.width), GUILayout.Height(Screen.height - 280));
GUIStyle style = new GUIStyle();
style.fontSize = 20;
GUIStyleState ss = new GUIStyleState();
ss.textColor = Color.red;
style.normal = ss;
foreach (var v in mLogs)
{
GUILayout.Label(v, style);
}
GUILayout.EndScrollView();
GUILayout.EndArea();
}
}
以上。