IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 如何在Unity控制台中输出第三方C# dll中的Console.Writeline日志信息 -> 正文阅读

[游戏开发]如何在Unity控制台中输出第三方C# dll中的Console.Writeline日志信息

最近在做项目的时候有一个功能需要调用第三方C#库中的方法,虽然执行起来也都没有什么问题,

但是某些情况下,为了调试需要,希望能够输出C#库中的Log信息,方便排查。

但是C# dll中输出日志时都是使用Console.WriteLine之类的方法,而这个方法在Unity控制台中是无法显示日志信息的。因此找了下相关的方法,现整理如下:

1.在查阅了一些资料后发现Console有一个很重要的方法“Console.SetOut”可以设置当前输出流

如下:

在VS Studio中新建一个C#控制台应用程序,运行以下代码:

using System;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            TextWriter tw = Console.Out;      //获取当前Console的标准输出流,暂时存储起来

            FileStream fs = new FileStream("e:\\hello.txt", FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            Console.SetOut(sw);       //设置Console当前的输出流为“sw”, “StreamWriter”继承于“TextWriter”
            Console.WriteLine("Monday is a good day!");

            Console.SetOut(tw);       //重新设置当前的输出流
            Console.WriteLine("Tuesday is a good day too.");

            Console.SetOut(sw);       //这里又重新设置成“sw”来和之前结果进行比对
            Console.WriteLine("Wednesday is a good day haha.");

            Console.SetOut(tw);
            Console.WriteLine("Thursday is a good day yoyo.");

            sw.Close();  //关闭流

            Console.ReadLine();
        }
    }
}

运行结果如下:

控制台输出结果:

在磁盘E中找到文件"Hello.txt",打开如下:

?以上则是通过“Console.SetOut”来改变当前输出流,从而实现将log日志显示在不同地方的效果

2.基于以上"Console.SetOut”的特性,是否可以在Unity中更改输出流,于是来尝试以下:

由于“Console.SetOut”需要借助参数“TextWriter"来实现,但是又不想用“StreamWriter”,所以这里就需要新建一个自定义的Class来继承TextWriter,借助StringBuilder来实现string直接的拼接

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

public class UnityTextWriter : TextWriter
{
    public override Encoding Encoding
    {
        get { return Encoding.Default; }
    }

	private StringBuilder buffer = new StringBuilder();      

	public override void Flush()
	{
		Debug.Log(buffer.ToString());       //由于在Unity中这里依然借助“Debug.Log”来输出日志到控制台
		buffer.Length = 0;                  //清空本“StringBuilder”中的内容
	}

    public override void Write(char value)
    {
        buffer.Append(value);
        if (value == '\n')              //由于在C#中,并不会用'\0'来表示string的结尾,因此这里无法使用'\0'作为判断条件
        {
            Flush();
        }

        //以上判断“Flush”的条件并不是完全适用的,当string = "hello\nyou!".此时string为一个完整的句子,不宜分成两次“Flush”来输出
        //当使用Debug.Log则不会存在此问题。
        //但是以上的方法用来实现Console.WriteLine输出日志到Unity控制台已经是可以满足了
    }
}

在Unity中调用该类中的方法:

public class NewBehaviourScript : MonoBehaviour
{
    void Start()
    {
        Console.SetOut(new UnityTextWriter());         //设置当前Console输出流

        Console.WriteLine("Today is a good day.");     //输出日志
    }
}

运行结果如下:

?如此当第三方C# dll中包含有“Console.WriteLine”语句时则可以直接输出该dll中的日志语句以方便调试

以上就是这些了,大家有问题可以留言交流哈,呵呵呵

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 11:04:24  更:2021-09-08 11:05:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 20:04:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码