游戏引擎:在架构上实现脚本支持的一种不错的方式?


17

我正在开发一个简单的游戏引擎(如果重要的话,请使用C#),但我想不出足够好的体面的方法来实现架构方面的脚本。

这是一种简单的基于回合的策略,带有用于战斗的自定义,独立于逻辑的动画。它具有用于系统/低级内容的全局体系结构层,最重要的是,两个主要模块-逻辑和游戏视图物-使用事件管理器进行通信。

事实是,我真的很想让脚本同时影响与游戏逻辑相关的内容(更改单位参数等)和与游戏视图相关的内容,例如用于战斗的特殊动画/对话可能取决于某些脚本触发器。

(说实话,理想情况下,我希望脚本控制游戏流程,只将核心机制/图形留给逻辑/视图,但是我对此并不陌生,所以我不确定现在是否可以这样做)

我一直在想三个选择:

  • 只是让脚本保留在逻辑中,但让它了解游戏的图形方面。但这会使逻辑/视图划分非常模糊,不是吗?

  • 将脚本编写为一个单独的模块,该模块将使用同一事件管理器与其他模块交换事件。但是,我想这需要非常小心事件同步,并且还要向管理器中添加大量事件类型。(仍然,个人最爱)

  • 首先将脚本编写为模块,这样它就可以直接影响/调用逻辑/视图的功能。这允许固有地更广泛的功能,但要以某种方式破坏整个事件交换方案的代价,并且担心脚本即使在实际上不应该破坏的情况下也可能破坏东西。

因此,我既无法决定其中之一,也无法想出插入脚本模块的更好方法...有任何建议或有用的链接吗?

谢谢!

ps感谢您移植问题,不知道有专门针对gamedev的部分


引入脚本语言会解决什么问题?
优厚

Answers:


3

我相信您想要第三种选择,但是您会发现您认为正确的想法是,可能在两个位置发生逻辑事件是一件坏事。您会发现您希望引擎的逻辑模块最终成为一个更新滴答,询问两个问题“我现在要做什么?”。和“我该怎么做?” 然后可以将其绑定到脚本以处理回答这些问题。

将其与公开包含数据的对象和用于访问所需逻辑组件的API结合使用(我的意思是您可以编写AI Path查找脚本,但是由于这是一段通用代码,很可能会被使用和重用,所以为什么不这样做?嵌入到模块中,然后将其添加到脚本语言公开的API中?)。这应该为您提供可访问性以及明确定义发生事情的位置。

同样,我用我经常做的同样的声明来警告这一点。在编程中,完成的产品总是比好的理论更有价值:)

希望这可以帮助!


2

许多人倾向于低估动态语言的功能,认为这种灵活性是以速度为代价的。的确如此,但是成本通常可以忽略不计。

就个人而言,我倾向于使用动态语言尽可能多地开发表达能力,然后对原型进行概要分析,以了解在何处以及是否需要优化。

在您的情况下,这意味着您应该尝试转向第三个选项,使用合适的动态语言开发“较高”部分,您也可以将其用作脚本语言。

在将动态效果放置在正确的深度后,可以使用很多模式。您的自定义脚本可以作为回调系统集成到基于事件的系统中,当核心进行回调时,它可以提供合适的环境,因此脚本可以更改全局状态或仅更改整个系统子集的状态。

您可以使用Façade模式封装脚本可以交互的界面。在门面方法,你可以把逻辑定义如何何时如果脚本可以使用的功能,并从抽象的核心执行脚本互动。

您的脚本接口应提供相关的工厂方法,以便脚本可以生成元素而无需直接实例化它们。这些实例可以是真实对象的包装,因此可以实现进一步的控制访问逻辑。


1

脚本对象需要访问将为其提供数据的其他对象。注意不要将那些其他对象直接传递到脚本对象中。这样做会创建脆弱的界面。您可能想要类似中介类的东西,该类管理那些对象引用并提供对脚本对象的数据访问。


1

Lua是通用脚本语言的流行选择。您可以使用Lex和Yacc创建自己的脚本语言(请查阅Game Programming Gems 3中的文章),但是我想说无论大小,Lua都可以满足您的大部分需求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.