C# Unity3D可视化编程第三方工具背后的机制

C# Unity3D可视化编程第三方工具背后的机制,c#,unity3d,C#,Unity3d,首先很抱歉在这里发布。我只是没有得到关于“Unity Answers”这个问题的答案。我一直在研究诸如或编辑器之类的工具,它们是基于节点的可视化编程工具,如Unreal Kismet或3DsMax particle flow system。我一直在研究这些工具实际上是如何在Unity中生成源代码的。因此我假设在节点逻辑组装期间,代码应该动态生成并编译为DLL(在Unity中,所有源代码都编译为DLL)。我开始研究像反射这样的C#程序集,Microsoft.CSharp和System.CodeDo

首先很抱歉在这里发布。我只是没有得到关于“Unity Answers”这个问题的答案。我一直在研究诸如或编辑器之类的工具,它们是基于节点的可视化编程工具,如Unreal Kismet或3DsMax particle flow system。我一直在研究这些工具实际上是如何在Unity中生成源代码的。因此我假设在节点逻辑组装期间,代码应该动态生成并编译为DLL(在Unity中,所有源代码都编译为DLL)。我开始研究像反射这样的C#程序集,Microsoft.CSharp和System.CodeDom.Compiler;我甚至试图通过编辑器以文本的形式在Unity中编写一个C#类,然后使用上述工具将其解析并编译成DLL(这还可以,但DLL仅在运行时临时存在),因此我想知道这些工具可能会使用这种方法吗?还是有更好更干净的方法呢?谢谢。

我实际上也在做同样的事情。。我认为您使用编译器类的路径是正确的。我不认为你可以在移动设备上动态地发出IL作为安全沙箱问题,但我正在动态地创建c#代码,并将其编译成如下的持久dll

CompilerParameters compilerParameter = new CompilerParameters();
compilerParameter.OutputAssembly = "/Your/Path/Here.dll";
CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp");

StringBuilder code = new StringBuilder();
code.AppendLine("public static class Test {");
//More code here...
code.AppendLine("}");
var compilerResult = codeDomProvider.CompileAssemblyFromSource(compilerParameter, code.ToString());

希望这有帮助。

退出应用程序后,此程序集是否继续存在?在我的例子中,它是暂时的。我使用这段代码从Unity内部的EditorApplication生成一个持久的.dll。创建的.dll是永久的,可以与最终应用程序一起发布。如果对输出组件使用相对路径,如“Assets/MyDLL.dll”,则在运行位于项目中的编译器后将看到它。将它移动到Assets/DLL,您就可以使用它了。