您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
177 行
4.6 KiB
177 行
4.6 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
using System.Threading;
|
|
|
|
#if UNITY_STANDALONE_LINUX
|
|
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
|
|
public class ConsoleTextLinux : IConsoleUI
|
|
{
|
|
bool IsDumb()
|
|
{
|
|
return System.Console.BufferWidth == 0 || System.Console.IsInputRedirected || System.Console.IsOutputRedirected;
|
|
}
|
|
|
|
void ReaderThread()
|
|
{
|
|
}
|
|
|
|
char[] buf = new char[1024];
|
|
public void Init(string buildId, string buildUnityVersion)
|
|
{
|
|
System.Console.WriteLine("Dumb console: " + IsDumb());
|
|
if (IsDumb())
|
|
{
|
|
m_ReaderThread = new Thread(() =>
|
|
{
|
|
Thread.CurrentThread.IsBackground = true;
|
|
while (true)
|
|
{
|
|
var read = System.Console.In.Read(buf, 0, buf.Length);
|
|
if (read > 0)
|
|
{
|
|
m_CurrentLine += new string(buf, 0, read);
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
});
|
|
m_ReaderThread.Start();
|
|
}
|
|
System.Console.Clear();
|
|
m_CurrentLine = "";
|
|
DrawInputline();
|
|
}
|
|
|
|
public void Shutdown()
|
|
{
|
|
OutputString("Console shutdown");
|
|
}
|
|
|
|
public void ConsoleUpdate()
|
|
{
|
|
// Handling for cases where the terminal is 'dumb', i.e. cursor etc.
|
|
// and no individual keys fired
|
|
if (IsDumb())
|
|
{
|
|
var lines = m_CurrentLine.Split('\n');
|
|
if (lines.Length > 1)
|
|
{
|
|
for (int i = 0; i < lines.Length - 1; i++)
|
|
Console.EnqueueCommand(lines[i]);
|
|
m_CurrentLine = lines[lines.Length - 1];
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!System.Console.KeyAvailable)
|
|
return;
|
|
|
|
var keyInfo = System.Console.ReadKey();
|
|
|
|
switch (keyInfo.Key)
|
|
{
|
|
case ConsoleKey.Enter:
|
|
Console.EnqueueCommand(m_CurrentLine);
|
|
m_CurrentLine = "";
|
|
DrawInputline();
|
|
break;
|
|
case ConsoleKey.Escape:
|
|
m_CurrentLine = "";
|
|
DrawInputline();
|
|
break;
|
|
case ConsoleKey.Backspace:
|
|
if (m_CurrentLine.Length > 0)
|
|
m_CurrentLine = m_CurrentLine.Substring(0, m_CurrentLine.Length - 1);
|
|
DrawInputline();
|
|
break;
|
|
case ConsoleKey.UpArrow:
|
|
m_CurrentLine = Console.HistoryUp(m_CurrentLine);
|
|
DrawInputline();
|
|
break;
|
|
case ConsoleKey.DownArrow:
|
|
m_CurrentLine = Console.HistoryDown();
|
|
DrawInputline();
|
|
break;
|
|
case ConsoleKey.Tab:
|
|
m_CurrentLine = Console.TabComplete(m_CurrentLine);
|
|
DrawInputline();
|
|
break;
|
|
default:
|
|
{
|
|
if (keyInfo.KeyChar != '\u0000')
|
|
{
|
|
m_CurrentLine += keyInfo.KeyChar;
|
|
DrawInputline();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void ConsoleLateUpdate()
|
|
{
|
|
}
|
|
|
|
public bool IsOpen()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public void OutputString(string message)
|
|
{
|
|
ClearInputLine();
|
|
|
|
if (!IsDumb() && message.Length > 0 && message[0] == '>')
|
|
{
|
|
var oldColor = System.Console.ForegroundColor;
|
|
System.Console.ForegroundColor = System.ConsoleColor.Green;
|
|
System.Console.WriteLine(message);
|
|
System.Console.ForegroundColor = oldColor;
|
|
}
|
|
else
|
|
System.Console.WriteLine(message);
|
|
|
|
DrawInputline();
|
|
}
|
|
|
|
public void SetOpen(bool open)
|
|
{
|
|
}
|
|
|
|
public void SetPrompt(string prompt)
|
|
{
|
|
}
|
|
|
|
void ClearInputLine()
|
|
{
|
|
if (IsDumb())
|
|
return;
|
|
|
|
System.Console.CursorLeft = 0;
|
|
System.Console.CursorTop = System.Console.BufferHeight - 1;
|
|
System.Console.Write(new string(' ', System.Console.BufferWidth - 1));
|
|
System.Console.CursorLeft = 0;
|
|
}
|
|
|
|
void DrawInputline()
|
|
{
|
|
if (IsDumb())
|
|
return;
|
|
|
|
System.Console.CursorLeft = 0;
|
|
System.Console.CursorTop = System.Console.BufferHeight - 1;
|
|
System.Console.Write(m_CurrentLine + new string(' ', System.Console.BufferWidth - m_CurrentLine.Length - 1));
|
|
System.Console.CursorLeft = m_CurrentLine.Length;
|
|
}
|
|
|
|
string m_CurrentLine;
|
|
private Thread m_ReaderThread;
|
|
//TextWriter m_PreviousOutput;
|
|
}
|
|
#endif
|