如何在游戏引擎中集成游戏逻辑

本文关键字:游戏 集成 引擎 | 更新日期: 2023-09-27 18:25:32

最近我正在用C#在.Net中开发一个2d游戏引擎示例。我的主要问题是我不知道如何将游戏逻辑包含在游戏中。目前,我有一个基本引擎,它是一组类,它们运行子系统,如RenderSoundInputCore功能。有一个编辑器可以帮助用户添加资源、构建级别、编写脚本和其他内容。

我想出了一个主意,使用编辑器中的ReflectionCSharpCodeProvider来编译编写的代码,这样我也可以获得我的产品的可执行文件。这种方式很好,但我想知道,真正的解决方案和架构是什么。

谢谢。

如何在游戏引擎中集成游戏逻辑

真正取决于您如何设计引擎。它不能只是负责渲染、声音、输入等不同事务的库的一部分。你必须有一个将它们组合在一起的部分。主要的两种方法是场景图或组件模型。这是一个将所有内容结合在一起的模块。获取输入并将其传递给实体或组件,执行一些脚本,播放一些sfx,应用一些转换,将转换后的实体发送到渲染管道。在这个流中,执行一些脚本是您想要集成的。有很多方法可以做到这一点。最好的方法是这些脚本来自您的编辑器。它们将与实体模板、实体实例、触发器、UI元素、输入设备相关联。引擎不应该知道任何关于实体的具体信息。他们的模板应该在编辑器中定义,并使用编辑器再次放置在世界中。

编辑:更多详细信息

假设您完全想跳过应用程序部分,并且所有特定于游戏的内容都在编辑器中编写了脚本。然后你的引擎需要有一个主循环,并更新和绘制你的场景。一个简单的开始是更新然后以最快的速度绘制场景,而无需在循环中等待。

现在假设您有组件模型。。。每个组件都会有自己的更新,而更新就是您编写的代码。您必须创建一些组件可以从引擎访问的接口。例如,绘制组件模板将有一个特性模型,在它的更新中将调用引擎上的DrawModel并传递该模型。其他一些游戏板组件将需要从其更新中查询哪些按钮被按下或释放。还需要一些能够找到实体中的其他组件,以便修改物理组件的位置或速度。

您必须开始编写一个基本实体的基本组件,然后才能从脚本中找出您无法访问的内容。然后,您必须将它公开给您的脚本层。但在公开每一个函数之前要三思。API越简单越好。

编辑:如何在运行时编译脚本

如果你有JavaScript的.NET实现,IronPython可以在不编译的情况下评估代码。我敢打赌它也能做到。这里有一种C#编译脚本的方法。。。如果您的编辑器使用C#,我建议您在编辑器中编译单独的程序集。

    private Assembly Compile(string fileName)
    {
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        CompilerParameters cp = new CompilerParameters();
        cp.GenerateExecutable = false;
        cp.GenerateInMemory = true;
        cp.TreatWarningsAsErrors = false;
        CompilerResults cr = provider.CompileAssemblyFromFile(cp, fileName);
        return cr.CompiledAssembly;
    }