最近,我们在 Patreon 上发表了一篇文章,说明我们正在改变我们添加新建筑到游戏中的流程。我们决定引入模组(Mods),以加快开发速度,同时为玩家提供额外的价值。 我想花点时间解释这意味着什么,以及我们目前是如何实现的。所有这些都可能随着游戏的开发而变化,但这里是当前的流程概述。 # 什么是模组? 模组是一种让玩家在游戏中添加内容的方式,以便他们可以从游戏中获得更多价值。有时这涉及让玩家能够注入代码,有时它比那更简单。无论如何,结果都是玩家创建的内容可以添加到游戏中以增强它,并且可以与其他玩家共享。 # 包定义 每个模组都是一个包,其中包含不同的实体。在实际意义上,它只是一个目录,其中每个实体都有一个子目录。定义它为包的则是一个 JSON 文件,它指定了包格式版本、名称以及唯一标识符。 json { "format_version": 1, "id": "ctr", "name": "CTR" } # 实体定义 实体在本例中指的是建筑,但同样的原理也将应用于岛上行走的海盗。我们将每个实体定义为一组组件,每个组件定义了该实体的行为。所有这些都定义在一个 JSON 文件中,我们还列出了实体的资产(图像、声音等)和变体。变体是指在某些位置或满足某些标准时实体的不同行为。想象一下,它是定义从主“默认”继承的定义,并添加或更改组件。例如,码头有水平和垂直的外观,取决于它们在岛上的哪个侧面。 json { "format_version": 1, "identifier": "ctr:dock", "kind": "building", "name_key": "building.ctr.dock.name", "assets": [ { "type": "image", "id": "dock", "image": "dock.png" } ], "clips": { "idle": { "source": "dock", "frame_duration": 4, "frames": [ { "layer": "body", "rects": [[0, 0, 32, 48]] } ] } }, "components": { "core:footprint": { "cells": [{ "x": 0, "y": 0 }] }, "core:placement": { "on": ["Shallows"] }, "core:build_cost": { "Gold": 20 }, "core:appearance": { "clips": [{ "clip": "idle" }], "anchor": { "x": 8, "y": 32 } } } } # 加载包 游戏启动时,我们会在游戏内容目录和指定的用户目录中查找所有文件夹和相关包文件。一旦我们有了这些,我们就会将实体文件中的所有资产加载到游戏中。我们解码实体并从中构建一个对象,它包含实体本身、组件和变体。 # 游戏 游戏中就持有实体列表,并在建筑被放置时,持有一个单独的对象,包含该建筑独有的属性。更新建筑意味着查询实体的组件以获取任何属性更新,查看该建筑意味着仅查询活动变体的外观组件。这意味着我们只需要保存建筑的状态,而不是所有组件的列表,因此保存文件保持较小,每次查询建筑都变成了对单个实体对象的查询。 # 最后一些想法 到目前为止,我们对结果非常满意。这意味着我们可以获得更快的流水线(添加建筑到游戏中变得更容易了,而不需要额外的代码),我们的玩家可以改变游戏的方式,我们尚未发现的方式。它也证明了它本身,因为整个游戏现在都是基于一个模组包本身,这很好。它意味着我们不得不暂时停止开发图形和建筑,但我们认为最终的时间将是值得的。 # TL;DR * 我们使用 JSON 来定义一个实体及其组件 * JSON 被我们的游戏读取,并创建了一个实体及其组件 * 每次更新运行时,组件被用来更新属性 * 属性然后定义了建筑的外观和状态等
我们如何规划模组
评论 (0)