Files
ichni_Creator_Studio/Assets/Scripts/Console/EditorConsole.cs

244 lines
8.6 KiB
C#
Raw Normal View History

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DynamicExpresso;
2025-02-04 15:05:05 +08:00
using UnityEngine.UI;
2025-02-04 15:05:05 +08:00
using Dreamteck;
using System.Text.RegularExpressions;
using DynamicExpresso.Exceptions;
using UnityEngine.UIElements;
using System.Linq;
using Unity.VisualScripting;
using Ichni.RhythmGame;
using Sirenix.Utilities;
2025-02-14 22:04:21 -05:00
using UnityEngine.InputSystem;
using TMPro;
2025-02-22 00:05:36 +08:00
using MoreMountains.Tools;
2025-05-04 16:41:23 +08:00
using System.Reflection;
using System.Linq.Expressions;
2025-02-14 22:04:21 -05:00
//又在写大粪 ——神币
namespace Ichni.Editor
{
public partial class EditorConsole : MonoBehaviour
{
public Interpreter functionInterpreter;
public TMP_InputField InputCommand;
2025-02-22 00:05:36 +08:00
private Dictionary<int, string> historyCommand = new Dictionary<int, string>();
private int historycount = 0;
2025-02-04 15:05:05 +08:00
public GameObject ConsoleUI;
2025-02-22 00:05:36 +08:00
bool isHide = true;
public void GetChange(string change)
{
}
public void GetCommand(string Command)//当提交命令时
2025-02-04 15:05:05 +08:00
{
2025-02-22 00:05:36 +08:00
try
{
functionInterpreter.Eval(Command);
}
catch (Exception e)
{
Debug.LogWarning("WTF Command! " + e);
LogWindow.Log("Unknow Command!", Color.red);
}
2025-02-04 15:05:05 +08:00
}
2025-02-22 00:05:36 +08:00
private void Update()
{
UIscale();
2025-02-22 00:05:36 +08:00
if (InputCommand.isFocused) InputDect();
}
2025-02-22 00:05:36 +08:00
private void UIscale()
{
if (Keyboard.current.backquoteKey.wasPressedThisFrame)
{
ConsoleUI.SetActive(isHide);
2025-02-22 00:05:36 +08:00
isHide = !isHide;
2025-02-28 20:08:00 +08:00
if (!isHide) StartCoroutine(WindowAnim.ShowPanelOnScale(InputCommand.gameObject));
}
}
2025-02-22 00:05:36 +08:00
//这是史,不要看
private void InputDect()
{
2025-06-07 15:09:22 +08:00
// 向下翻历史命令
2025-02-22 00:05:36 +08:00
if (Keyboard.current.downArrowKey.wasPressedThisFrame)
{
if (historyCommand.Count - 1 > historycount)
{
historycount++;
InputCommand.text = historyCommand[historycount];
}
2025-02-22 00:05:36 +08:00
else
{
InputCommand.text = "";
historycount = historyCommand.Count;
}
2025-06-07 15:09:22 +08:00
return;
2025-02-22 00:05:36 +08:00
}
2025-06-07 15:09:22 +08:00
// 向上翻历史命令
2025-02-22 00:05:36 +08:00
if (Keyboard.current.upArrowKey.wasPressedThisFrame && historycount != 0)
{
historycount--;
InputCommand.text = historyCommand[historycount];
2025-06-07 15:09:22 +08:00
return;
2025-02-22 00:05:36 +08:00
}
2025-06-07 15:09:22 +08:00
// 提交命令
2025-02-22 00:05:36 +08:00
if (Keyboard.current.enterKey.wasPressedThisFrame)
{
2025-06-07 15:09:22 +08:00
string input = InputCommand.text;
if (string.IsNullOrWhiteSpace(input))
2025-02-22 00:05:36 +08:00
{
2025-06-07 15:09:22 +08:00
InputCommand.text = "";
return;
2025-02-22 00:05:36 +08:00
}
2025-06-07 15:09:22 +08:00
// 处理命令格式
// 使用正则表达式将首个单词作为函数名,后续以逗号分隔参数
var match = Regex.Match(input.Trim(), @"^(\w+)\s*(.*)$");
string ExpoCommand = input;
if (match.Success)
{
string func = match.Groups[1].Value;
string args = match.Groups[2].Value.Trim();
// 用正则将所有空白分隔的参数替换为逗号
args = Regex.Replace(args, @"\s+", ",");
ExpoCommand = string.IsNullOrEmpty(args) ? $"{func}()" : $"{func}({args})";
}
2025-02-22 00:05:36 +08:00
print(ExpoCommand);
GetCommand(ExpoCommand);
2025-06-07 15:09:22 +08:00
// 记录历史命令
if (historyCommand.ContainsKey(historycount))
historyCommand[historycount] = input;
else
historyCommand.Add(historycount, input);
2025-02-22 00:05:36 +08:00
historycount++;
InputCommand.text = "";
}
}
2025-02-22 00:05:36 +08:00
private void Start()
{
2025-02-22 00:05:36 +08:00
SetUpFunctions();
2025-02-22 00:05:36 +08:00
//Test
// functionInterpreter.Eval("print(\"Hello World!\")");
// functionInterpreter.Eval("log(\"Hello World but debug!\")");
}
}
2025-02-22 00:05:36 +08:00
public partial class EditorConsole
{
2025-05-04 16:41:23 +08:00
public Inspector inspector => EditorManager.instance.uiManager.inspector;
public Hierarchy hierarchy => EditorManager.instance.uiManager.hierarchy;
public LogWindow logWindow => EditorManager.instance.uiManager.mainPage.logWindow;
2025-02-22 00:05:36 +08:00
2025-05-04 16:41:23 +08:00
public List<string> commandList = new List<string>();
public void SetUpFunctions()
{
2025-05-04 16:41:23 +08:00
functionInterpreter = new Interpreter();//这是AI给的东西
foreach (MethodInfo i in typeof(EditorConsoleMethods).GetMethods().
ToList().Where(i => i.IsStatic && i.IsPublic && i.ReturnType == typeof(void)))
{
var parameters = i.GetParameters().Select(p => p.ParameterType).ToArray();
var delegateType = Expression.GetDelegateType(parameters.Concat(new[] { i.ReturnType }).ToArray());
functionInterpreter.SetFunction(i.Name, i.CreateDelegate(delegateType));
commandList.Add(i.Name);
}
// functionInterpreter.SetFunction("test", (Action)Test);
2025-02-22 00:05:36 +08:00
2025-05-04 16:41:23 +08:00
// functionInterpreter.SetFunction("kill", (Action)Kill);
// functionInterpreter.SetFunction("lgp", (Action<int, float, float, float, float, float, float>)LGenPathNodes);
// functionInterpreter.SetFunction("print", (Action<object>)print);
// functionInterpreter.SetFunction("log", (Action<object>)Debug.Log);
// functionInterpreter.SetFunction("tp", (Action<float, float, float>)Tp);
// functionInterpreter.SetFunction("tp", (Action)Tp);
2025-02-22 00:05:36 +08:00
}
2025-05-04 16:41:23 +08:00
}
public static class EditorConsoleMethods
{
public static Inspector inspector => EditorManager.instance.uiManager.inspector;
public static Hierarchy hierarchy => EditorManager.instance.uiManager.hierarchy;
public static LogWindow logWindow => EditorManager.instance.uiManager.mainPage.logWindow;
public static void kill()
2025-02-22 00:05:36 +08:00
{
if (inspector.connectedGameElement == null)
{
LogWindow.Log("Please select a GameElement first!");
return;
}
for (int i = inspector.connectedGameElement.childElementList.Count - 1; i <= 0; i--)
{
2025-02-22 00:30:08 +08:00
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(
inspector.connectedGameElement.childElementList[i]
);
inspector.connectedGameElement.childElementList.RemoveAt(i);
2025-02-22 00:05:36 +08:00
}
}
2025-05-04 16:41:23 +08:00
public static void test()
{
2025-02-22 00:05:36 +08:00
var f0 = ElementFolder.GenerateElement("Folder", Guid.NewGuid(), new List<string>(), true, null);
}
2025-05-04 16:41:23 +08:00
public static void tp(float x, float y, float z)
2025-04-13 14:04:17 +08:00
{
if (EditorManager.instance.cameraManager.isSceneCameraActive)
{
EditorManager.instance.cameraManager.sceneCamera.sceneCamera.transform.position =
new Vector3(x, y, z);
}
}
2025-05-04 16:41:23 +08:00
public static void tp()
2025-04-13 14:04:17 +08:00
{
if (EditorManager.instance.cameraManager.isSceneCameraActive)
{
EditorManager.instance.cameraManager.sceneCamera.sceneCamera.transform.position =
inspector.connectedGameElement.transform.position;
}
}
2025-02-22 00:05:36 +08:00
2025-05-04 16:41:23 +08:00
public static void lgp(int loop, float xs, float xe, float ys, float ye, float zs, float ze)
2025-02-22 00:05:36 +08:00
{
if (inspector.connectedGameElement == null || inspector.connectedGameElement.GetType() != typeof(Track))
{
LogWindow.Log("Please select a Track first!");
return;
}
Track track = (Track)inspector.connectedGameElement;
for (int i = 0; i < loop; i++)
{
float x = xs + (xe - xs) / loop * i;
float y = ys + (ye - ys) / loop * i;
float z = zs + (ze - zs) / loop * i;
PathNode j = PathNode.GenerateElement("PathNode" + i.ToString(), Guid.NewGuid(), new List<string>(), true, track, true);
2025-02-22 00:05:36 +08:00
j.transformSubmodule.originalPosition = new Vector3(x, y, z);
}
2025-02-04 15:05:05 +08:00
}
}
}