Unity 扩展Log日志

Unity 扩展Log 类输出自定义日志

前言

Unity 里面在进行Android Hololens ios等平台进行测试的时候,如果不借助别的工具,没办法看到控制台输出的日志,给测试带来很多麻烦,如果我们能够将输出的Log输出到UI上就方便我们自己的调试,接下来就是做这么一件事情。
使用反编译软件打开UnityEngine.CoreModule.dll文件,会发现Debug类里面的方法和属性如下图:
在这里插入图片描述
在这里插入图片描述
它是使用unityLogger进行输出,unityLogger=>s_Logger,然而s_Logger是一个接口,也就是说我们只需要用反射去自定义这个s_Logger就能使用自己定义的Log输出了。

首先先准备一个实现ILogger接口的类ILoggerExtension。要输出的信息全部在这些实现的接口里面。可以统一输出,代码如下。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public  class ILoggerExtension : ILogger
{

    public static string logString;
    public ILogHandler logHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    public bool logEnabled { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    public LogType filterLogType { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

    public bool IsLogTypeAllowed(LogType logType)
    {
        throw new NotImplementedException();
    }

    public void Log(LogType logType, object message)
    {
        logString = message.ToString();
    }

    public void Log(LogType logType, object message, UnityEngine.Object context)
    {
        logString = message.ToString();

    }

    public void Log(LogType logType, string tag, object message)
    {
        logString = message.ToString();

    }

    public void Log(LogType logType, string tag, object message, UnityEngine.Object context)
    {
        logString = message.ToString();

    }

    public void Log(object message)
    {
        logString = message.ToString();

    }

    public void Log(string tag, object message)
    {
        logString = message.ToString();

    }

    public void Log(string tag, object message, UnityEngine.Object context)
    {
        logString = message.ToString();

    }

    public void LogError(string tag, object message)
    {
        logString = message.ToString();

    }

    public void LogError(string tag, object message, UnityEngine.Object context)
    {
                logString = message.ToString();

    }

    public void LogException(Exception exception)
    {
        throw new NotImplementedException();
    }

    public void LogException(Exception exception, UnityEngine.Object context)
    {
        throw new NotImplementedException();
    }

    public void LogFormat(LogType logType, string format, params object[] args)
    {
        throw new NotImplementedException();
    }

    public void LogFormat(LogType logType, UnityEngine.Object context, string format, params object[] args)
    {
        throw new NotImplementedException();
    }

    public void LogWarning(string tag, object message)
    {
        throw new NotImplementedException();
    }

    public void LogWarning(string tag, object message, UnityEngine.Object context)
    {
        throw new NotImplementedException();
    }

    
}

然后使用反射去设置自定义的s_Logger,也是需要定义一个类LogExtension,代码如下
下面展示一些 内联代码片

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Reflection;
public static class LogExtension
{
    public static void SetILogger() {
        if (Debug.unityLogger is ILoggerExtension) return;
        FieldInfo fieldInfo = typeof(Debug).GetField("s_Logger", BindingFlags.Static | BindingFlags.NonPublic);
        if (fieldInfo!=null) fieldInfo.SetValue(null, new ILoggerExtension()); 
    }

}

后面就可以进行测试了,定义一个测试类Log,我们就可以将自定义的日志输出到text了,就不用关心在哪里调用输出,直接使用Unity Debug类就行了。
下面展示一些 内联代码片

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Log : MonoBehaviour
{
    public Text text;
    private void Awake()
    {
        LogExtension.SetILogger();
    }

    void Update()
    {
        text.text = ILoggerExtension.logString;

        if (Input.GetKeyDown(KeyCode.Space)) {
            Debug.Log("按下Log"+Time.deltaTime);
        
        }
    }
}

项目参考链接:https://download.csdn.net/download/qq_33547099/13683493

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值