unity一种日志过滤的思路

unity打印日志的函数Debug.Log

但是这样会有一个问题,某些c#打印过于频繁 ,我作为一个开发者不关心他的模块日志。但是我没办法去给他把日志删除了,这样没有道德。于是想着写这样个工具,它不太完美 ,它只能指定我们需要那些cs文件的日志 整体它长这样

比如我现在调试角色的跳跃,角色的跳跃是个很复杂的过程,有起跳阶段,上升阶段1 2 3 ,最高阶段 ,下落阶段123 落体阶段等等等等 这里面相关的参数很多,需要很多判定,需要看日志

如下图就是看移动组件的日志 。上面filter是一个list 我们可以加内容进去 加了之后需要显示的日志模块就会出现这个模块,然后选中它就是看它所属的一些cs日志了。

LogHelper.cs代码如下

using UnityEngine;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
public interface ILog
{
    public void Log(string str);
    
}


[System.Serializable]
public class LogCS
{

    [SerializeField] public int index;

    [SerializeField] public List<string> csNameList = new List<string>();
}

public class LogHelper : MonoBehaviour
{
    public static LogHelper Instance;
    private void Awake()
    {
        GameObject.DontDestroyOnLoad(this.gameObject);
    }
    void Start()
    {
        Instance = this;

    }
    public void Init()
    {
        runtimeMap.Clear();
       
        for (int i = 0; i < map.Count; i++)
        {
            if (!runtimeMap.ContainsKey(map[i].index))
            {
                runtimeMap.Add(map[i].index, new List<string>());
            }
            runtimeMap[map[i].index] = map[i].csNameList;
            
        }
    }

    [Label("过滤标签集合")] public string[] filter = new string[] { };
    [HideInInspector]
    public int currentIndex = 0;
    [HideInInspector]
    public List<string> filterCs = new List<string>();
    [HideInInspector]
    [SerializeField]
    public List<LogCS> map = new List<LogCS>();
    [HideInInspector]
    public Dictionary<int, List<string>> runtimeMap = new Dictionary<int, List<string>>();
}

#if UNITY_EDITOR
[CustomEditor(typeof(LogHelper))]
public class LogHelperEditor : Editor
{
    
    private int lastIndex = 0;

    public LogHelper self
    {
        get
        {
            return target as LogHelper;
        }
    }
    SerializedProperty filterCs;

    public void OnEnable()
    {
        filterCs = serializedObject.FindProperty("filterCs");

    }
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        serializedObject.Update();
        EditorGUI.BeginChangeCheck();
        lastIndex = self.currentIndex;
        self.currentIndex = EditorGUILayout.Popup("需要显示的日志模块", self.currentIndex, self.filter);
        if (EditorGUI.EndChangeCheck())
        {
            Save(lastIndex);
          
            self.filterCs.Clear();
            Debug.Log((self.currentIndex < self.map.Count).ToString());
            if (self.currentIndex < self.map.Count)
            {
                Debug.Log(self.map[self.currentIndex].index);
                for (int i = 0; i < self.map[self.currentIndex].csNameList.Count; i++)
                {
                    self.filterCs.Add(self.map[self.currentIndex].csNameList[i]);
                    
                }

            }
           

        }
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(filterCs, new GUIContent("过滤脚本名(不带后缀)"));
        if (EditorGUI.EndChangeCheck())
        {
           
            Save(self.currentIndex);
        }
        serializedObject.ApplyModifiedProperties();
        

    }
    void Save(int index)
    {
        if (self.map.Count > (index))
        {
            Debug.Log("self.map.Count > (index) " + self.map.Count + "--" + index);
            self.map[index].csNameList.Clear();
            for (int i = 0; i < self.filterCs.Count; i++)
            {
                self.map[index].csNameList.Add(self.filterCs[i]);
                Debug.Log("self.map add" + index + " Count == " + self.map[index].csNameList.Count);
            }
        }
        else
        {
            Debug.Log("self.filterCs.Count ==  " + self.filterCs.Count);
            var ls = new LogCS();
            self.map.Add(ls);
            ls.index = index;
            for (int i = 0; i < self.filterCs.Count; i++)
            {
                ls.csNameList.Add(self.filterCs[i]);
            }
        }
        self.Init();
    }
}

#endif

然后具体日志答应在一个静态类中 我叫DLog方法 。建议就是在所有的cs文件中 实现ILog接口 这个接口就一个方法 Log 然后实现类的Log方法 

 

 public static class CommonUtils
 {

        

public static void DLog(this ILog log, object str)
        {
            string fileName = log.GetType().Name;
            var ins = LogHelper.Instance;
            bool showLog = false;
            var index = LogHelper.Instance.currentIndex;
            if (LogHelper.Instance.runtimeMap.ContainsKey(index))
            {
                var list = LogHelper.Instance.runtimeMap[index];
                for (int i = 0; i < list.Count; i++)
                {

                    if (fileName.ToLowerInvariant() == list[i].ToLowerInvariant())
                    {
                        showLog = true;
                        break;
                    }
                }
            }
            else
            {
                showLog = true;
            }

            if (showLog)
                Debug.Log(str);
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值