我正在写一个粒子系统。 (对于游戏和粒子编辑器) 在该系统中,存在0到n个修饰符。 它们每帧都会修改粒子系统中的粒子。
例如,你可以有一个名为“GravityModifier”的预定义修饰符,它只对每帧的每个粒子执行以下操作:“particle.Velocity.Y + = 9.81”或类似的东西。
现在我希望用户能够在运行时(在编辑器中)编写其他修饰符。 我希望能够只使用C#。 由于粒子系统是写入JSON文件的,因此自定义修饰符脚本应该作为源代码(可能是base64编码)写入文件。
-
我的问题是: 假设游戏想要加载这样的粒子系统文件。如何将自定义修饰符编译为可执行代码?
回答这个问题时要考虑的另一个非常重要的事情:请注意,这将是游戏的粒子系统。编译的代码每帧调用超过3000次。 (大多数是60fps) 因此,编译代码执行所需的时间比其他游戏功能要长得非常重要。 将修饰符脚本编译到表单的委托中会很好: 委托void ModifyParticle(ref Particle p);
这可能吗?如果是这样,怎么样?
答案 0 :(得分:6)
有'Roslyn' C# compiler as a service API的CTP,您可以在其中执行在运行时定义的C#代码,例如REPL等。这是一篇涵盖它的MSDN文章
http://visualstudiomagazine.com/articles/2011/11/16/the-roslyn-scripting-api.aspx
Mono在Mono.CSharp library中已经有一段时间使用此功能,因此可以作为替代方案使用。
答案 1 :(得分:5)
是的,
使用CSScript library可以很简单。
答案 2 :(得分:2)
查看Roslyn,这是下一个.NET Framework中C#编译器即服务功能即将推出(但仍处于早期测试版)的预览。
答案 3 :(得分:0)
答案 4 :(得分:0)
使用.NET中的Microsoft内置编译器CSharpCodeProvider
:
如何使用C#编译器以编程方式编译代码:
.NET Framework公开允许您以编程方式进行的类 访问C#语言编译器。如果您愿意,这可能很有用 编写自己的代码编译实用程序。本文提供了示例 使您能够从文本源编译代码的代码。该 应用程序允许您只是构建可执行文件或构建 可执行文件并运行它。在期间发生的任何错误 编译过程显示在表格上。
http://support.microsoft.com/kb/304655
只需在开始游戏时编译并加载二进制文件。
有关如何编译dll并直接加载/执行它的更多示例,请参阅 http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx 及其社区增加了内容。