Unity 实现Log实时输出到屏幕或控制台上<二>
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/49884507
作者:cartzhang
第一部分博客链接: http://blog.csdn.net/cartzhang/article/details/49818953
Github 地址:https://github.com/cartzhang/TestConsoleWindow github console window
一、你还是想要一个控制台来显示信息?
为什么呢?这样就不会占用Unity本身的GUI的显示,不去调用Unity的渲染,转而该为Windows的渲染了。
是不是很惬意,花费少了,还更灵活了。
好极了。
二、你都需要些什么?
using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.IO; namespace ConsoleTestWindows
{
public class ConsoleInput
{
//public delegate void InputText( string strInput );
public event System.Action<string> OnInputText;
public string inputString; public void ClearLine()
{
//System.Text.Encoding test = Console.InputEncoding;
Console.CursorLeft = 0;
Console.Write( new String( ' ', Console.BufferWidth ) );
Console.CursorTop--;
Console.CursorLeft = 0;
} public void RedrawInputLine()
{
if ( inputString.Length == 0 ) return; if ( Console.CursorLeft > 0 )
ClearLine(); System.Console.ForegroundColor = ConsoleColor.Green;
System.Console.Write( inputString );
} internal void OnBackspace()
{
if ( inputString.Length < 1 ) return; inputString = inputString.Substring( 0, inputString.Length - 1 );
RedrawInputLine();
} internal void OnEscape()
{
ClearLine();
inputString = "";
} internal void OnEnter()
{
ClearLine();
System.Console.ForegroundColor = ConsoleColor.Green;
System.Console.WriteLine( "> " + inputString ); var strtext = inputString;
inputString = ""; if ( OnInputText != null )
{
OnInputText( strtext );
}
} public void Update()
{
if ( !Console.KeyAvailable ) return;
var key = Console.ReadKey(); if ( key.Key == ConsoleKey.Enter )
{
OnEnter();
return;
} if ( key.Key == ConsoleKey.Backspace )
{
OnBackspace();
return;
} if ( key.Key == ConsoleKey.Escape )
{
OnEscape();
return;
} if ( key.KeyChar != '\u0000' )
{
inputString += key.KeyChar;
RedrawInputLine();
return;
}
}
}
}
然后,你还需要一个控制台窗口
using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.IO; namespace ConsoleTestWindows
{
/// <summary>
/// Creates a console window that actually works in Unity
/// You should add a script that redirects output using Console.Write to write to it.
/// </summary>
public class ConsoleWindow
{
TextWriter oldOutput; public void Initialize()
{
//
// Attach to any existing consoles we have
// failing that, create a new one.
//
if ( !AttachConsole( 0x0ffffffff ) )
{
AllocConsole();
} oldOutput = Console.Out; try
{
IntPtr stdHandle = GetStdHandle( STD_OUTPUT_HANDLE );
Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle( stdHandle, true );
FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
System.Text.Encoding encoding = System.Text.Encoding.ASCII;
StreamWriter standardOutput = new StreamWriter( fileStream, encoding );
standardOutput.AutoFlush = true;
Console.SetOut( standardOutput );
}
catch ( System.Exception e )
{
Debug.Log( "Couldn't redirect output: " + e.Message );
}
} public void Shutdown()
{
Console.SetOut( oldOutput );
FreeConsole();
} public void SetTitle( string strName )
{
SetConsoleTitle( strName );
} private const int STD_OUTPUT_HANDLE = -11; [DllImport( "kernel32.dll", SetLastError = true )]
static extern bool AttachConsole( uint dwProcessId ); [DllImport( "kernel32.dll", SetLastError = true )]
static extern bool AllocConsole(); [DllImport( "kernel32.dll", SetLastError = true )]
static extern bool FreeConsole(); [DllImport( "kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall )]
private static extern IntPtr GetStdHandle( int nStdHandle ); [DllImport( "kernel32.dll" )]
static extern bool SetConsoleTitle( string lpConsoleTitle );
}
}
三、输入和窗口准备齐全了,问题来了。
四、那么问题来了?怎么修改编译环境的目标框架呢?
//#define USE_UPGRADEVS
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Text.RegularExpressions; class UpgradeVSProject : AssetPostprocessor
{
#if USE_UPGRADEVS
private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
string currentDir = Directory.GetCurrentDirectory();
string[] slnFile = Directory.GetFiles(currentDir, "*.sln");
string[] csprojFile = Directory.GetFiles(currentDir, "*.csproj"); bool hasChanged = false;
if (slnFile != null)
{
for (int i = 0; i < slnFile.Length; i++)
{
if (ReplaceInFile(slnFile[i], "Format Version 10.00", "Format Version 11.00"))
hasChanged = true;
}
} if (csprojFile != null)
{
for (int i = 0; i < csprojFile.Length; i++)
{
if (ReplaceInFile(csprojFile[i], "ToolsVersion=\"3.5\"", "ToolsVersion=\"4.0\""))
hasChanged = true; if (ReplaceInFile(csprojFile[i], "<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>", "<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>"))
hasChanged = true;
}
} if (hasChanged)
{
Debug.LogWarning("Project is now upgraded to Visual Studio 2010 Solution!");
}
else
{
Debug.Log("Project-version has not changed...");
}
} static private bool ReplaceInFile(string filePath, string searchText, string replaceText)
{
StreamReader reader = new StreamReader(filePath);
string content = reader.ReadToEnd();
reader.Close(); if (content.IndexOf(searchText) != -1)
{
content = Regex.Replace(content, searchText, replaceText);
StreamWriter writer = new StreamWriter(filePath);
writer.Write(content);
writer.Close(); return true;
} return false;
}
#endif
}
同样,我写了代码屏蔽的宏定义。使用的时候启用就可以了。
五、测试结果
using UnityEngine;
using System.Collections; public class Tes : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update ()
{
if (Input.GetKey(KeyCode.A))
{
Debug.Log("this is debug log");
System.Console.WriteLine("this is system console write line");
} }
}
结果就出来了:
Unity 实现Log实时输出到屏幕或控制台上<二>的更多相关文章
- Unity 实现Log实时输出到屏幕或控制台上<一>
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/49818953 作者:car ...
- unity收集log工具
参考 yusong:http://www.xuanyusong.com/archives/2477 凉鞋 :https://www.cnblogs.com/liangxiegame/p/Uni ...
- [Linux]屏幕输出控制
专门的术语叫做ANSI Escape sequences(ANSI Escape codes),题目并不恰当,与其说是屏幕输出控制,不如说是通过bash在兼容VT100的终端上进行输出. 主要有以下类 ...
- .NET Core下的日志(3):如何将日志消息输出到控制台上
当我们利用LoggerFactory创建一个Logger对象并利用它来实现日志记录,这个过程会产生一个日志消息,日志消息的流向取决于注册到LoggerFactory之上的LoggerProvider. ...
- java 在控制台上输入密码时,密码不显示在控制台上
用下面的方法可以实现在控制台上输入密码时,密码不显示在控制台上:Console cons=System.console(); System.out.print(" 密码:"); c ...
- 大数据调错系列之hadoop在开发工具控制台上打印不出日志的解决方法
(1)在windows环境上配置HADOOP_HOME环境变量 (2)在eclipse上运行程序 (3)注意:如果eclipse打印不出日志,在控制台上只显示 1.log4j:WARN No appe ...
- eclipse:eclipse for java EE环境下如何配置tomcat服务器,并让tomcat服务器显示在控制台上,将Web应用部署到tomcat中
eclipse环境下如何配置tomcat 打开Eclipse,单击"Window"菜单,选择下方的"Preferences". 单击"Server& ...
- Ubuntu上运行Blender,在控制台上查看运行结果
1.首先在控制台打开Blender. 具体操作:找到Blender的安装路径,我的是:/home/lcx/下载/blender-2.78c-linux-glibc219-x86_64 $cd /hom ...
- Java:IO流的综合用法(从键盘录入数据并打印在控制台上)
import java.io.*; public class IOTestDouble { public static void main(String[] args)throws Exception ...
随机推荐
- img标签IE下有边距——2017/7/21
设置css 在全局变量的是和给img标签设置 img{ border:0;} 1,img{float:left}2,img{display:block}
- 复制excel表,往excel表中写入数据
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import jav ...
- kali(Ubuntu)右键添加idle打开方式
IDLE可以说是Unix平台下Python的第一个集成开发环境(IDE) 命名行输入idle看idle是否已安装,没有则先安装 安装idle:apt-get install idle 安装完成后,命名 ...
- CentOS7 安装 MySQL 5.7
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz yum -y ...
- python基础9 (迭代器、生成器)
1.可迭代对象 迭代:将某个数据集内的数据“一个挨着一个的取出来” 可迭代协议:可以被迭代要满足的要求,即内部含有__iter__()方法 可迭代的类型:字符串.列表.元组.字典.集合特点:惰性运算 ...
- 【BZOJ 1483】[HNOI2009]梦幻布丁
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 链表,启发式合并. 把x变成y,和y全都变成x. 不论是前者还是后者.连续段的个数都是相同的,不影响结果. 那么我们把x,y中出现次 ...
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- hadoop-02-关闭防火墙
hadoop-02-关闭防火墙 su root service iptables status #查看状态 即时关闭: service iptables stop #关闭 重启之后关闭: chkcon ...
- [MST] Derive Information from Models Using Views
Redundant data or caching data is a constant source of bugs. MST adheres to the philosophy that no d ...
- MySQL具体解释(9)----------索引具体解释
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点. 考虑例如以下情况.假设数据库中一个表有10^6条记录,DBMS的页面大小为4K.并存储100条记录.假设没有索引, ...