# 构建开发环境
类似于 fabric, architectury plugin 也提供了相对应的 example-mod 来方便我们搭建环境。
首先来到 Architectury-Templates 的 Releases 页面,选择合适的版本
目前 Architectury 仅支持 1.16 + 的版本
Architectury 提供下面这几种 Templates 可供选择
- 1.18.2-forge.zip: 1.18.2 的基于 Forge-Loom 的 Forge 开发环境
- 1.18.2-architectury.zip: 1.18.2 跨加载器的开发环境
- 1.18.2-architectury-mixin.zip: 1.18.2 使用 Mixin 的跨加载器开发环境
相信阅读过初识 Architectury 章节的读者已经明白自己需要下载的版本了
这里我们不着重介绍 Mixin, 感兴趣的读者可以阅读笔者先前的文章
本文基于 Minecraft 1.18.2 版本,并且我们不需要 Mixin, 所以我们下载 1.18.2-architectury.zip
将下载到的文件进行解压,直接使用 Intellij IDEA 来导入文件夹中的 build.gradle 文件
类似于 Fabric 和 Forge 的环境构建,这里 Gradle 会帮助我们下载必要的文件,并且自动使用 Loom 进行反混淆,读者需要稍加等待
build.gradle 中的一些常量现在移动到了 gradle.properties 中
<img src="https://s2.loli.net/2022/04/01/iaMLz2vOkusrQoB.png" alt="image.png" data-size="original">
构建完成后,Gradle 会自动为我们生成针对两个平台的运行配置
在 Architectury 项目创建完成后,请尽量避免移动项目的位置或者给项目的目录改名。可能会产生找不到 architectury-transformer-agent.jar 的问题
如果产生了这个问题,可以自行修改启动配置中 - javaagent 的路径
恭喜你,你已经构建好了一个完整的开发环境
# 简析目录结构
重新审视我们构建好的开发环境,我们的目录结构类似这样
- common
- src/main/java/net.examplemod
- ExampleMod.java
- ExampleExpectPlatform.java
- src/main/java/net.examplemod
- forge
- src/main/java/net.examplemod.forge
- ExampleModForge.java
- ExampleExpectPlatformImpl.java
- src/main/java/net.examplemod.forge
- fabric
- src/main/java/net.examplemod.fabric
- ExampleModFabric.java
- ExampleExpectPlatformImpl.java
- src/main/java/net.examplemod.fabric
经过简单的观察,我们发现
- 实例代码在主类 ExampleMod 中进行了物品的注册和一些基本操作
- ExampleModForge 中添加了 @Mod 注解,并调用 ExampleMod 中的 init
- ExampleModFabric 类实现了 ModInitializer 方法,并调用 ExampleMod 中的 init
- 实例代码在 ExampleExpectPlatform 中写了一个 **"没有方法体"** 的方法 getConfigDirectory
- common 模块中的某些代码调用了 getConfigDirectory
- forge 模块中的 ExampleExpectPlatformImpl 用 forge 独有的方式补全了方法体
- fabric 模块中的 ExampleExpectPlatformImpl 用 fabric 独有的方式补全了方法体
可以发现,我们模组的共性部分在 common 模块中,而非共性部分则分别在 forge 和 fabric 包中展现.
针对一个需要考虑兼容性的方法,我们往往先定义 "接口", 然后为接口写不同的实现 (Impl), 这是 Architechtury 以及大部分跨平台程序设计中所共有的思想
实际上 ExampleExpectPlatform 在这里类似于接口.
# 开始旅程
实例代码已经为我们提供了一个清晰的思路,现在我们已经可以删除掉他们,开始我们自己的旅途了.
在 common, forge, fabric 三个模块中分别建立 trou.arch (.forge/.fabric) 包,并创建对应的 Arch, ArchForge, ArchFabric 类.
位于common: trou/arch/Arch.java | |
public static final String MOD_ID = "arch"; | |
public class Arch { | |
public static void init() { | |
System.out.println("Hello Architectury!"); | |
} | |
} |
位于forge: trou/arch/forge/ArchForge.java | |
@Mod(Arch.MOD_ID) | |
public class ArchForge { | |
public ArchForge() { | |
Arch.init(); | |
} | |
} |
位于fabric: trou/arch/fabric/ArchFabric.java | |
public class ArchFabric implements ModInitializer { | |
@Override | |
public void onInitialize() { | |
Arch.init(); | |
} | |
} |
根据读者以往开发 Forge 或 Fabric 的经验修改必要的文件名和参数变量,分别启动游戏,应该可以看到 Hello Architectury! 消息输出在控制台中
# 可能出现的问题
因为涉及到很多 transform 和黑科技,对规范性的要求比较高,读者可能会出现一些疏忽,下面是一些可能出现的常见问题 (笔者搭建环境的时候出现的问题)
# 开发中出现错误,其中有 examplemod 字样
检查是否有遗漏的 examplemod 没有修改,请主要检查
- fabric.mod.json
- gradle.properties
- mods.toml
- (accesswidener)
- (mixins.json)
# 运行 Fabric 调试,模组没有加载
请检查自己是否修改了 fabric.mod.json, 其中定义了 Mod 主类入口
打开 fabric 模块中的 resources/fabric.mod.json, 修改 entrypoints
"entrypoints": {
"main": [
"trou.arch.fabric.ArchFabric"
]
},
# 运行 Forge 调试,抛出 Modules generated 错误
请检查自己的 Forge 主类是否放在了 forge 模块的对应 forge 包下
我们项目的 ArchForge 应位于 forge\src\main\java\trou\arch**\forge\**ArchForge.java
# 实验性内容:使用 Parchment
此项内容读者可以选择性阅读. Architectury 并未主动支持 Parchment. 以下内容均出自笔者尝试,不能保证是否出现问题,如果读者想要使用,出现了编译类问题,请首先尝试移除 Parchment
众所周知,现在 Forge 和 Fabric 默认使用 Mojang 官方混淆表,但官方混淆表并没有放出参数的混淆信息,这导致高版本默认反编译的参数表是很难阅读的,Parchment 解决了这一问题,Parchment 提供了参数表的反混淆方式。这里笔者不过多赘述 Parchment 本身,国内也有相关的介绍和使用教程,读者可以自行翻阅查看.
这里我们尝试在 Architectury 中引入 Parchment
首先打开项目根目录的 build.gradle, 在 subprojects 中按需添加如下内容
subprojects {
repositories {
maven { url = 'https://maven.parchmentmc.org' }
}
dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
mappings loom.layered() {
officialMojangMappings()
parchment("org.parchmentmc.data:parchment-1.18.2:2022.03.13@zip")
}
// mappings loom.officialMojangMappings()
}
}
之后刷新 Gradle 项目,等待 Parchment 下载并自动部署后,再次查看参数表,已经反混淆过了.