明绍宗朱聿键鼻 发表于 2020-12-20 10:53

输出Log到手机屏幕

一、需求

unity在电脑上运行的时候可以通过console的打印了解到程序的运行信息,而打包成apk包之后,就无法知道在安卓机内的运行情况了。我们在打包运行的时候,常常会遇到在电脑上运行没有问题,但是在手机上运行不正常的问题,这个时候,我们就需要一种简单直接的方式,能够看到我们加的打印以获取更多的调试信息了。
另外说明一点,使用Unity Romote的时候,手机只是作为一个控制输入端存在的,而程序真正运行的地方其实是在电脑上,所以不能通过这种方式获取真机运行信息。
IOS真机运行的时候,可以通过XCode看打印结果。


二、原理

主要用到的接口是Application.logMessageReceived
每当一次Log输出的时候logMessageReceived添加的函数就会被触发一次,只在主线程触发,不过一般情况不用考虑这个。
此外,我们还需要一些其他的功能,例如Log打印的开关、打印的行数、字体大小、字体颜色等等。


三、实现

在场景中添加一个空物体名为Logger,然后在上面附加代码组件,具体代码如下:
using UnityEngine;
using System.Collections;
using LuaFramework;
using UnityEngine.UI;
using System.Collections.Generic;
public class ShowLogTool : MonoBehaviour
{
    public bool showFlag = true;
    public int logCount = 100;
    private string m_ShowLog = string.Empty;
    private Queue<string> logQueue = new Queue<string>();

    void Start()
    {
      Application.logMessageReceived += WriteUnityLog;
    }


    void WriteUnityLog(string log, string stackTrace, LogType type)
    {
      if (!showFlag) return;
      WriteInLogQueue(log);
    }

    void WriteInLogQueue(string log)
    {
      logQueue.Enqueue(log);
      while (logQueue.Count > logCount)
      {
            logQueue.Dequeue();
      }
      m_ShowLog = string.Empty;
      foreach (string onelog in logQueue)
      {
            m_ShowLog = m_ShowLog + "\r\n" + onelog;
      }
    }

    void OnGUI()
    {
      if (showFlag)
      {
            GUIStyle style = new GUIStyle();
            <span class="n">style.fontSize = 20;
            style.normal.textColor = Color.red;

            //GUI.color = Color.red;
            GUI.Label(new Rect(0, 0, 1000, 1000), m_ShowLog, style);
      }
    }


}


四、效果
页: [1]
查看完整版本: 输出Log到手机屏幕