diff --git a/Assets/Scripts/Framework/EditiorContent/ProjectCreateHelper.cs b/Assets/Scripts/Framework/EditiorContent/ProjectCreateHelper.cs index 8665e46..4d2907d 100644 --- a/Assets/Scripts/Framework/EditiorContent/ProjectCreateHelper.cs +++ b/Assets/Scripts/Framework/EditiorContent/ProjectCreateHelper.cs @@ -10,6 +10,14 @@ namespace Demo.Editor { public static class ProjectCreateHelper { + private static string GetTypename(Type type) + { + string result = type.Name; + if (result.Contains('`')) + return result[..result.LastIndexOf('`')]; + return result; + } + private static void WritePythonStyleFunction(StreamWriter stream, string name, IEnumerable paramList, string description) { stream.Write($"def {name}({string.Join(',', paramList)}):\n"); @@ -17,68 +25,87 @@ namespace Demo.Editor } private static void WriteCPPClassBase(StreamWriter stream, Type currentType) - { - if (currentType == typeof(ScriptableObject)) - { + { + string currentTypeName = GetTypename(currentType); + string baseTypeName = GetTypename(currentType.BaseType); + if (currentType == typeof(ScriptableObject)) + { // 绘制工具宏 - stream.WriteLine("#define __build_in_pragma #"); - stream.WriteLine("#define __build_in_to_text(x) #x"); + stream.WriteLine("#define __build_in_pragma #"); + stream.WriteLine("#define __build_in_to_text(x) #x"); stream.WriteLine("#define this"); - // 绘制类定义标识符 - foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) + // 绘制类定义标识符 + foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var type in asm.GetTypes()) { // Functions if (typeof(ScriptableObject).IsAssignableFrom(type)) { - string typeName = type.Name; - if (typeName.Contains('`')) - { - typeName = typeName[..typeName.LastIndexOf('`')]; - } - stream.WriteLine($"#define {typeName}"); + string typeName = GetTypename(type); + stream.WriteLine($"#define {typeName} \"{typeName}\""); } } } // 绘制Mathf foreach (var method in typeof(Mathf).GetMethods()) - { + { stream.WriteLine($"#define {method.Name}({string.Join(',', from param in method.GetParameters() select param.Name)})"); - } + } foreach (var curveType in Enum.GetNames(typeof(MathExtension.EaseCurveType))) { stream.WriteLine($"#define {curveType}"); - } - // 绘制label与goto - stream.Write(@" + } + // 绘制RScript关键词 + { + stream.Write(@" /* 控制流标签 */ "); - stream.Write($"#define label(label_name) __build_in_pragma define label_name\n\n"); - stream.Write(@" + stream.Write($"#define label(label_name) __build_in_pragma define label_name\n\n"); + } + { + stream.Write(@" /* -控制流, 当a>b时跳转到指定的label处 +控制流, 当pr为真时跳转到指定的label处 */ "); - stream.Write($"#define goto(a,b,label_name)\n\n"); - // 绘制工具 - stream.Write(@" + stream.Write($"#define goto(pr,label_name)\n\n"); + } + { + stream.Write(@" /* -临时设置上下文变量, 在运行完语句后将还原 -e.g: LoadSubScript(SplineCore, ""SplineCore.h"") with(r = 1, g = 1, b = 1); +控制流, 当pr为真时返回上一次调用goto的位置, 栈模式 */ "); - stream.Write($"#define with(...)\n\n"); - return; - } - string baseTypeName = currentType.BaseType.Name; - if (baseTypeName.Contains('`')) - { - baseTypeName = baseTypeName[..baseTypeName.LastIndexOf('`')]; + stream.Write($"#define back(pr)\n\n"); + } + { + stream.Write(@" +/* +控制流, 当pr为真时退出当前命名空间 +*/ +"); + stream.Write($"#define break(pr)\n\n"); + } + { + stream.Write(@" +/* +赋名命名空间, 具有名称的命名空间将不会自动运行, 需要使用goto到达 +*/ +"); + stream.Write($"#define namespace(name)\n\n"); + } + stream.WriteLine($"struct {currentTypeName}"); + stream.WriteLine("{"); + } + else + { + stream.Write($"#include \"{baseTypeName}.helper.h\"\n\n"); + stream.WriteLine($"struct {currentTypeName}:public {baseTypeName}"); + stream.WriteLine("{"); } - stream.Write($"#include \"{baseTypeName}.helper.h\"\n\n"); } private static void WriteCPPStyleFunction(StreamWriter stream, string name, IEnumerable paramList, string description) @@ -96,7 +123,13 @@ e.g: LoadSubScript(SplineCore, ""SplineCore.h"") with(r = 1, g = 1, b = 1); } } - public static void CreateHelperFiles(string dir, ProjectDefaultFileStyle style = ProjectDefaultFileStyle.CPP) + private static void WriteCPPClassEnd(StreamWriter stream, Type currentType) + { + stream.WriteLine("};"); + } + + + public static void CreateHelperFiles(string dir, ProjectDefaultFileStyle style = ProjectDefaultFileStyle.CPP) { var toolDir = new ToolFile(dir); if (toolDir.IsDir() == false) @@ -115,12 +148,8 @@ e.g: LoadSubScript(SplineCore, ""SplineCore.h"") with(r = 1, g = 1, b = 1); where info is MethodInfo where info.GetCustomAttribute(false) != null select info as MethodInfo).ToList(); - var typeName = type.Name; - if (typeName.Contains('`')) - { - typeName = typeName[..typeName.LastIndexOf('`')]; - } - string fileHeader = $"{typeName}.helper" + style switch + var typeName = GetTypename(type); + string fileHeader = $"{typeName}.helper" + style switch { ProjectDefaultFileStyle.PY => ",py", _ => ".h" @@ -146,8 +175,16 @@ e.g: LoadSubScript(SplineCore, ""SplineCore.h"") with(r = 1, g = 1, b = 1); WriteCPPStyleFunction(fs, methodInfo.Name, from param in methodInfo.GetParameters() select param.Name, data.Description); break; } - } - } + } + switch (style) + { + case ProjectDefaultFileStyle.CPP: + WriteCPPClassEnd(fs, type); + break; + case ProjectDefaultFileStyle.PY: + break; + } + } // Enums if (typeof(Enum).IsAssignableFrom(type)&& type.GetCustomAttribute(false) != null) { diff --git a/Assets/Scripts/Framework/ScriptableObject.cs b/Assets/Scripts/Framework/ScriptableObject.cs index e8463e2..bd8031d 100644 --- a/Assets/Scripts/Framework/ScriptableObject.cs +++ b/Assets/Scripts/Framework/ScriptableObject.cs @@ -853,6 +853,10 @@ namespace Demo { "this", new() { data = this, type = this.GetType() } }, { "self", new() { data = this, type = this.GetType() } } }; + foreach (var type in DefaultInstantiate.GetScriptableObjectInstantiate().Keys) + { + variables.Add(type, new(type.GetType(), type)); + } return engine.RunAsync(script, importClass, variables); } diff --git a/Assets/Scripts/Framework/[RScript] b/Assets/Scripts/Framework/[RScript] index 7b48066..58f3d10 160000 --- a/Assets/Scripts/Framework/[RScript] +++ b/Assets/Scripts/Framework/[RScript] @@ -1 +1 @@ -Subproject commit 7b48066aafbbb9479715961873fe2938b225daec +Subproject commit 58f3d1067cfdd19f8c4c7f3934ce7102b3685397