Unity中的顏色轉換,讓Log信息更炫酷,在屏幕上打印——最白話,手把手教你做系列。

這個應該屬於擼一個適合自己的小遊戲框架的第二篇。上一篇是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();
    }
}

以上。

發佈了27 篇原創文章 · 獲贊 29 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章