第四章:模组接口
1、 第四章:定制化API接口解析
2、 API,全称Application Programming Interface(应用程序编程接口),是一套程序对外开放的函数集合。通过调用这些函数,我们可以实现对程序功能的操作或数据读取。在开发《饥荒》游戏模组或进行代码修改时,本质上就是借助游戏提供的API接口,扩展或调整主程序的功能,从而达成个性化的玩法效果。
3、 在《饥荒》的模组架构中,所有安装的模组均运行于独立的沙盒环境之中,系统通过隔离机制确保各模组无法直接干预核心程序,保障了游戏整体的稳定性与安全性。
4、 系统向模组开发者开放了一系列可调用的函数和表结构。
5、 举例来说,像IO表和OS表这类基础Lua模块,在游戏主程序中存储于全局表_G内,而mods目录下的模组则可以引用甚至修改其中的内容。
6、 每个模组的脚本文件都在相对隔离的环境中执行。

7、 将各个mod置于独立的沙盒中运行,能够有效实现彼此间的隔离,避免相互干扰。

8、 mods系统内置了丰富的功能支持,其中模组加载的核心函数定义在mods.lua文件中,便于实现模块的注册、调用与统一管理。


9、 在mods.lua、modindex.lua以及modutil.lua这三个关键文件中,modapi实际上就是env表所承载的内容,而env本身由多个函数和键值对组成。
10、 这构成了模组运行的基础环境,其中最关键的代码是蓝色那一行:GLOBAL=_G。
11、 env表中还封装了大量的实用函数。

12、 若逐一介绍这些函数,篇幅将极为庞大,难以详尽覆盖。因此本章仅聚焦于其中几个核心部分进行讲解。

13、 让斧头拥有点火能力——这种简单的模组,相信很多人都尝试做过。
14、 那么你们通常是怎么实现的呢?
15、 打开axe.lua,在合适的位置插入代码:inst:AddComponent("lighter")。
16、 然后打包发布,一个基本的模组就算完成了。
17、 但假设现在存在两个模组:Amod 和 Bmod
18、 Amod 让斧头具备点燃物品的能力,就像一个打火机。
Android文档-开发者指南-第一部分:入门-中英文对照版 Android提供了丰富的应用程序框架,它允许您在Java语言环境中构建移动设备的创新应用程序和游戏。在左侧导航中列出的文档提供了有关如何使用Android的各种API来构建应用程序的详细信息。第一部分:Introduction(入门) 0、Introduction to Android(引进到Android) 1、Application Fundamentals(应用程序基础) 2、Device Compatibility(设备兼容性) 3、
19、 Bmod 则让斧头能作为燃料被燃烧。
20、 如果这两个模组都采用上述直接替换文件的方式制作,当它们同时启用时会发生什么?是否会产生冲突?
21、 斧子不可能既当火源又当燃料,二者只能取其一。
22、 游戏启动时会读取一个名为PREFABFILES的配置表来加载原始内容。每个MOD也维护一个类似的PrefabFiles表。系统首先加载主程序中的PREFABFILES,然后按顺序载入各个MOD中的对应条目。若某个MOD的PrefabFiles包含与主程序同名的项,则该MOD的版本将覆盖原始文件;当多个MOD提供了相同的条目时,后加载的MOD会覆盖之前的所有定义。因此,MOD的加载顺序决定了最终生效的是哪一个版本,直接影响游戏表现。这一机制形成了MOD冲突时的优先级判定规则。
23、 上述说明应该已经足够清晰了。
24、 先:

25、 加载模组时

26、 当两个模组包含同名文件(尤其是PrefabFiles)时,通常只有最后一个加载的有效,其余都会被覆盖或忽略。
27、 使用此类模组时,因共用同一资源文件容易引发冲突,轻则功能失效,重则导致游戏崩溃。
28、 出现系统报错或崩溃现象
29、 若A、B两个模组均采用文件替换方式修改相同内容,则这种开发模式显然不可持续。
30、 非必要情况下不应直接修改原始文件,以免造成不可恢复的影响。
31、 是否存在一种方法,可以让斧头具备点火功能,如同打火机一般使用,同时又不改动原有文件?
32、 当然有办法,否则我写这章的意义何在。
33、 我们可以通过调用mods系统所提供的API来实现所需功能。

34、 在预制体对象中注入特定的功能函数。
35、 例如:

36、 即便多个模组同时对axe进行修改,也能保证各自功能正常运作,互不冲突。
37、 类似的API函数还包括:










