在我的游戏(也是用 C# 编写的)中,我想包含某种自定义支持。速度是一个很大的问题,因为我计划将游戏的主要部分卸载到脚本中。因此,我选择使用 C# 编写游戏内事件和内容的脚本。用户还应该能够使用 C# 为游戏编写脚本和插件。(我知道 C# 不是脚本语言。)
我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能。用户还可以提供代码作为源代码(在这种情况下游戏将编译它)。 在某些情况下,编译的用户“脚本”可以/也可以传输给其他玩家。例如,用户可以在家中或其他任何地方构建脚本陷阱。
以下是我的问题:
安全
如何确保提供的代码被迫只调用提供的 API(类)的东西?为了防止脚本作弊,恶意活动......
有没有办法在某种 VM 或低信任环境中运行已编译的代码?
速度
这种方法是否足够快?(每隔一帧或每隔一帧调用多达 100 个自定义程序集的函数)。对此有什么建议吗?
也许可以通过将所有用户内容编译成一个大程序集或其他什么来获得速度优势?
尺寸
我怎样才能使编译后的代码变小(除了压缩它)?因为玩家可能需要下载数十个脚本......
有没有办法去除不是绝对必要的东西?像调试信息或类名之类的......
运行时编译对我来说相当新(这就是我在这里问的原因)。因此,指出一些主要的初学者错误和/或安全问题会很好。
编辑:
只是为了澄清:用户插件/脚本或任何你想调用的东西都是一个类(也是用 C# 编写的),它必须实现特定的功能,如“GetAddonInfo”、“Init”、“Update”......就像一个从我的抽象“插件”类派生的普通 C# 类。