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

C# 如何在游戏引擎中集成游戏逻辑,c#,.net,game-engine,C#,.net,Game Engine,最近,我正在使用C在.Net中开发一个2d游戏引擎示例。我的主要问题是,我不知道如何在游戏中包含游戏逻辑。目前我有一个基本引擎,它是一组类,它们运行子系统,如渲染、声音、输入和核心功能。有一个编辑器可以帮助用户添加资源、构建级别、编写脚本和其他内容 我想出了一个主意,使用我的编辑器中的反射和CSharpCodeProvider来编译编写的代码,这样我也可以得到我的产品的可执行文件。这种方式很好,但我想知道,真正的解决方案和体系结构是什么 谢谢。这取决于你是如何设计引擎的。它不能只是负责渲染、声音

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

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


谢谢。

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

编辑:更多细节

假设您完全希望跳过应用程序部分,并且所有特定于游戏的内容都在编辑器中编写。然后,引擎需要有一个主循环,并更新和绘制场景。一个简单的开始是更新,然后尽可能快地绘制场景,无需在循环中等待

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

您必须开始编写一个基本实体的基本组件,然后才能从脚本中找出您无法访问的内容。然后您必须将其公开到脚本层。但是,在公开每个函数之前,请三思。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;
    }

这太依赖于游戏的类型了——其中一些可以包含在主循环中,但RPG可能需要完全的规则引擎……假设它是在2d平台上。顺便说一句,我对事件没有任何问题。例如,主循环可以运行步骤事件或每个帧。这一点都没有问题。你的用户用C指定游戏逻辑吗?我会试着问这个问题。是的,脚本语言现在是用C编写的,因为我现在还不能编写任何其他可嵌入的语言。游戏需要编译,而CSharpCodeProvider是我在此期间唯一的方法。你说得对。实际上,我知道引擎的流程,但我不知道应该如何在引擎中实现这部分流程。即使有你的演讲,我也不知道该怎么办!谢谢你的详细介绍。我现在正在我的引擎里做这个。正如我之前所说的,执行脚本的时间和地点没有问题,而我不知道如何将脚本交给我的引擎并说:‘嘿,为我运行它!’。我尝试了IronPython和JavaScript包装器之类的东西,但每次运行脚本时,它们都需要编译代码。这样一来,它就像一个应用程序,一开始它没有编译,应该在运行时编译它的代码。谢谢@Aleks。我在我的第一篇文章中说过,我现在正在做这件事。正如其他人所说,编译精确的C代码是危险的。