From 2f24d94db2826691ca2e465a5f70ef4c3c9e437a Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Tue, 25 Nov 2025 17:03:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EEnum=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PublicTypes/InjectVariable/CStyle.cs | 2 +- PublicTypes/RScriptInjectVariableGenerater.cs | 122 ++++++++++++------ RScriptContext.cs | 3 + 3 files changed, 90 insertions(+), 37 deletions(-) diff --git a/PublicTypes/InjectVariable/CStyle.cs b/PublicTypes/InjectVariable/CStyle.cs index 0b4efee..5989ceb 100644 --- a/PublicTypes/InjectVariable/CStyle.cs +++ b/PublicTypes/InjectVariable/CStyle.cs @@ -116,7 +116,7 @@ namespace Convention.RScript.Variable.CStyle protected override string WritePageHead(Type currentType) { - return $"#include\"{GetFilename(currentType)}\""; + return $"#include\"{GetFilename(currentType.BaseType)}\""; } public override string GetFilename(Type currentType) diff --git a/PublicTypes/RScriptInjectVariableGenerater.cs b/PublicTypes/RScriptInjectVariableGenerater.cs index f1f23d1..7d0e349 100644 --- a/PublicTypes/RScriptInjectVariableGenerater.cs +++ b/PublicTypes/RScriptInjectVariableGenerater.cs @@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Text; +using UnityEditor; namespace Convention.RScript.Variable { @@ -115,44 +116,59 @@ namespace Convention.RScript.Variable StringBuilder builder = new(); builder.AppendLine(this.WritePageHead(targetType)); - builder.AppendLine(this.WriteClassHead(targetType)); - builder.AppendLine(this.WriteClassBodyEnter(targetType)); - // 绘制枚举 + if (targetType.IsEnum) { - var scriptEnums = from enumItem in targetType.GetNestedTypes(BindingFlags.NonPublic | BindingFlags.Public) - where enumItem.GetCustomAttribute() != null - select enumItem; - foreach (var enumItem in scriptEnums) + // 绘制枚举 + builder.AppendLine(this.WriteEnumHead(targetType)); + builder.AppendLine(this.WriteEnumBodyEnter(targetType)); + foreach (var enumName in targetType.GetEnumNames()) { - var attr = enumItem.GetCustomAttribute(); - this.WriteEnumHead(targetType); - this.WriteEnumBodyEnter(targetType); - foreach (var enumName in enumItem.GetEnumNames()) + builder.AppendLine(this.WriteEnumName(enumName)); + } + builder.AppendLine(this.WriteEnumBodyExit(targetType)); + builder.AppendLine(this.WriteEnumTail(targetType)); + } + else + { + builder.AppendLine(this.WriteClassHead(targetType)); + builder.AppendLine(this.WriteClassBodyEnter(targetType)); + // 绘制枚举 + { + var scriptEnums = from enumItem in targetType.GetNestedTypes(BindingFlags.NonPublic | BindingFlags.Public) + where enumItem.GetCustomAttribute() != null + select enumItem; + foreach (var enumItem in scriptEnums) { - this.WriteEnumName(enumName); + var attr = enumItem.GetCustomAttribute(); + this.WriteEnumHead(targetType); + this.WriteEnumBodyEnter(targetType); + foreach (var enumName in enumItem.GetEnumNames()) + { + this.WriteEnumName(enumName); + } + this.WriteEnumBodyExit(targetType); + this.WriteEnumTail(targetType); } - this.WriteEnumBodyExit(targetType); - this.WriteEnumTail(targetType); } - } - // 绘制方法 - { - var scriptMethods = from method in targetType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) - where method.GetCustomAttribute() != null - select method; - foreach (var method in scriptMethods) + // 绘制方法 { - var attr = method.GetCustomAttribute(); - var returnType = method.ReturnType; - var methodName = method.Name; - var parameters = method.GetParameters(); - var parameterNames = from item in parameters select item.Name; - var parameterTypes = from item in parameters select item.ParameterType; - builder.AppendLine(this.WriteClassMethod(returnType, methodName, parameterNames.ToArray(), parameterTypes.ToArray())); + var scriptMethods = from method in targetType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) + where method.GetCustomAttribute() != null + select method; + foreach (var method in scriptMethods) + { + var attr = method.GetCustomAttribute(); + var returnType = method.ReturnType; + var methodName = method.Name; + var parameters = method.GetParameters(); + var parameterNames = from item in parameters select item.Name; + var parameterTypes = from item in parameters select item.ParameterType; + builder.AppendLine(this.WriteClassMethod(returnType, methodName, parameterNames.ToArray(), parameterTypes.ToArray())); + } } + builder.AppendLine(this.WriteClassBodyExit(targetType)); + builder.AppendLine(this.WriteClassTail(targetType)); } - builder.AppendLine(this.WriteClassBodyExit(targetType)); - builder.AppendLine(this.WriteClassTail(targetType)); builder.AppendLine(this.WritePageEnd(targetType)); this.scriptIndicator = builder.ToString(); } @@ -173,20 +189,54 @@ namespace Convention.RScript.Variable return AllRScriptInjectVariables.Remove(name); } + public class EnumGetter + { + public Type enumType; + public EnumGetter(Type enumType) + { + this.enumType = enumType; + } + public object Get(string name) + { + return Enum.Parse(enumType, name); + } + } + public static object GenerateRScriptVariable(string name) { if (AllRScriptInjectVariables.TryGetValue(name, out var variable)) { - if (variable.MyGenerater != null) + if (variable.targetType.IsEnum) { - var result = variable.Generate(); - if (result.GetType().IsSubclassOf(variable.targetType) || result.GetType() == variable.targetType) + if (variable.MyGenerater != null) { - variable.GenerateObjects.Add(result); - return result; + var result = variable.Generate(); + if (result.GetType().IsSubclassOf(variable.targetType) || result.GetType() == variable.targetType) + { + variable.GenerateObjects.Add(result); + return result; + } + else + throw new InvalidOperationException($"{name} target is not sub-class of it's target type"); } else - throw new InvalidOperationException($"{name} target is not sub-class of it's target type"); + { + return variable.targetType; + } + } + else + { + if (variable.MyGenerater != null) + { + var result = variable.Generate(); + if (result.GetType().IsSubclassOf(variable.targetType) || result.GetType() == variable.targetType) + { + variable.GenerateObjects.Add(result); + return result; + } + else + throw new InvalidOperationException($"{name} target is not sub-class of it's target type"); + } } } throw new InvalidOperationException($"{name} target is not exist or abstract"); diff --git a/RScriptContext.cs b/RScriptContext.cs index 3669965..a2c217f 100644 --- a/RScriptContext.cs +++ b/RScriptContext.cs @@ -6,6 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using UnityEngine; using static Convention.RScript.RScriptContext; namespace Convention.RScript @@ -276,10 +277,12 @@ namespace Convention.RScript } catch (RScriptException) { + Debug.LogError($"current sentence: {sentence}"); throw; } catch (Exception ex) { + Debug.LogError($"current sentence: {sentence}"); throw new RScriptRuntimeException($"Runtime error: {ex.Message}", CurrentRuntimePointer, ex); } }