该项目的目的是同时测试和演示来自 Unity DOTS 技术堆栈的多个新包。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

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