为Unity开发冒险游戏框架

叙事游戏的朋友们,大家好,2019年!

最近几个月对我们来说很忙。 我们一直在进行一些较小的委托工作,但主要为即将到来的标题Resort实施了基本框架。 这将是一篇相当技术性的文章,将介绍我们新框架的基本结构。

我们将Unity用作游戏的游戏引擎。 鉴于我们的团队很小,我们愿意使用Unity Asset Store中的插件来节省时间和资源。 对于不可预见的事件,我们使用了Adventure Creator,这是开发经典样式的指向和点击冒险的重要资产。

然而,事实证明,依靠插件提供非常基本的功能也会使人感到沮丧,并导致我们为新项目和未来项目开发自己的核心框架。

为了编写故事和对话,我们决定切换到Ink(Inkle的一种脚本语言)Ink,它允许非常自由和富有创造力的写作过程。 整个游戏的脚本是用一个简单的纯文本编辑器编写的。 基本上,故事流的整个逻辑可以直接在Ink中实现。

在过去的几周中,我们开发了一个系统,该系统使我们能够使用Ink故事在Unity内创建一个探索性,叙事性3D游戏。 这是系统工作原理的草图:

为了避免分配内存,所有故事文件都会在运行时之前进行解析。 然后,我们的解析器将创建游戏中使用的路线数据库。 方向是墨水故事中的命令,看起来像这样:

>>> TIMELINE介绍runinbackground:true

上面的命令告诉Unity运行一个名为intro的时间轴,不要等到它完成后再运行下一个Ink命令或显示脚本的下一个对话框行。 我们不想将方向解析并创建为运行时,因为随着时间的流逝会产生大量垃圾。 我们将字符串命令解析为Directions。 方向是ScriptableObjects,其中包含对故事元素,场景中GameObjects的引用以及将在运行时执行的逻辑。

该游戏包含多个场景,因此“故事元素”分布在不同的场景中。 为了不丢失参考,我们使用William Armstrong出色的“交叉场景参考”脚本。 方向使用跨场景引用而不是直接引用游戏对象。

解析器还为对话框创建一个数据库,使我们可以将脚本翻译成其他语言,并为配音演员创建脚本(使用不同的语言)。 Ink文件中的对话框行如下所示:

劳拉:你在那里做什么?

使用Ink语法,整个游戏都写在纯文本文件中。 游戏运行时,Ink文件由导演按照故事中的逻辑执行。 Director使用预先创建的数据库,并负责执行对话框的方向和行。 故事的整个逻辑位于Ink文件中,而所有故事元素均放置在Unity场景中。

现在已经实现了基本系统,我们可以开始获取游戏中的所有Ink文件,3D模型和动画了! 我们将向您发布有关此过程的信息。

加入我们的Discord,不要错过未来的更新!