Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save RisingInIris2017/3f5b0cee8d8d17d20e6931f56ab8e395 to your computer and use it in GitHub Desktop.
Save RisingInIris2017/3f5b0cee8d8d17d20e6931f56ab8e395 to your computer and use it in GitHub Desktop.

为什么你学不会Minecraft模组开发

这篇阅读时长五分钟的文章可能是目前最有价值的模组开发入门指南。

为什么要写这篇文章

笔者经常刷到所谓的“教你开发模组”系列视频。它们通常雄心勃勃地向你介绍模组开发的具体步骤,例如如何创建项目;其中有些甚至花费大量时间,向你传授编程基础。可往下一划,你就会在推荐视频栏目里看到很多过去类似的教程,它们往往都不了了之,即使你真的耐着性子看完,也可能仅仅学了个皮毛,做不出自己真正想要的东西。

这些教程往往忽视了一个重要且基础的问题,那就是分析并解决问题的思路。下文将试图补足这一点,并对你的模组开发之路有所启发。

这篇文章到底是什么

这篇文章不是模组开发教程。相反地,我们避开一切技术细节、避开一切时效性内容,也不针对特定的平台。笔者将以六年的模组开发经验和一亿次作品下载量保证其可靠性,分析你的处境,给出分析并解决问题的思路,最后分享几个笔者认为最重要的实践。

不,你并不想学习模组开发

如果你被这句话吓到,那请你平复心情后思考两个问题:

  1. 你的“模组开发”计划必定是从你的一个创意开始的。如果这个创意本身就是模糊的,那如何把它开发成具体的模组,是否应当先将这个创意描摹得具体一点?
  2. 当你有了明确具体的创意之后,是否已经有现成的模组,或者其他比模组开发简单的手段来实现这个创意?

或许某个你未曾听说的模组正是你想要的。或许写起来更简单的 CraftTweaker/KubeJS 脚本就能满足你的要求。

如果你打定主意要制作一个模组了,不妨考虑使用 MCreator。放下那些对它不必要的偏见,因为它的官网,以及 CurseForge 等平台上,已经有相当数量的优质 MCreator 模组作品。你的目的是实现你的创意,没有什么工具是不可以使用的。

你甚至可以委托其他的模组开发者帮你完成模组的开发工作。毕竟学习模组开发对于零基础者而言并非一朝一夕,让专业的人做专业的事会更好;那么你就可以把更多的时间精力放在打磨、丰富、完善这个创意上,因为 拥有技术的人可能很多,但你闪光的创意独一无二

假如你真的希望利用 Minecraft 这款游戏庞大、成熟的玩家社群与模组开发社群,展示自己的作品、增长自己在游戏开发、产品设计、沟通协作等各方面的能力,而不是仅仅满足于实现你的创意,那么你的确具备了学习模组开发的条件,是时候放下所有的畏难情绪,开始逐渐了解 Minecraft 的模组开发了。

前置知识清单

在正式学习模组开发之前,你应当具备以下知识:

  • 基本的 Java 程序语法。
  • 基本的面向对象编程知识。 什么是对象、方法和类?
  • 了解基础的 Java 数据类型,这样你才知道如何以合适的方式存储数据。 避免写出 5 除以 4 等于 1 的语句。
  • 了解线程的概念,这样才不会在想要实现动画时卡死游戏。
  • 了解 Java 的垃圾回收概念。 免得你写的维度模组在玩家全部离开你的维度时还在加载那个维度。
  • 了解 Minecraft 的原版游戏本身。这样你才能在想要实现某样东西时,立刻联想到游戏中的某个内容或系统有可以利用之处。

此外,务必培养通过搜索引擎找答案的能力。就拿上面列举的这些知识条目来说,互联网上已有大量制作精良的 Java 编程教程,都是稍加搜索唾手可得的,远比那些模组开发教程讲得好,你不妨先从搜索它们开始,练习使用搜索引擎。

还有一些知识,虽然并不是必须的,但能够很有效地帮到你:

  • 玩其他模组的经验。
  • 设计模式。这会让你快速理解某个系统的工作原理,也让你在设计自己的系统时更加得心应手。
  • 游戏开发经验,最好是 RPG 网络游戏。这会让你更好地理解服务端和客户端的交互和通信。

模组开发迷思

到这里,笔者有必要反驳一些关于模组或是游戏本身的常见误区,秉持这样的观点对接下来的学习是有害的:

Minecraft 代码质量差

此观点的拥趸大多不具备完整开发一款软件的经验。事实上,今天的 Minecraft 代码质量已经得到相当程度的改善。作为数十名专业开发人员组成的团队,Mojang 会对其代码进行充分的审阅;假如把 Minecraft 这样复杂的项目交由一个或几个游戏开发者来维护,大部分的个人开发者都会因无法胜任其项目管理工作,导致项目管理灾难。相比之下,Mojang 已经做得很不错了。所以当我们学习模组开发时,Minecraft 的代码一直是最好的老师。

Minecraft 明明是个小游戏,性能还这么差

此观点混淆了游戏的文件大小与游戏复杂度之间的区别。传统电子游戏含有细节丰富的模型、贴图和高质量音频,而 Minecraft 并不大量包含这些东西,与那些游戏比较文件大小,自然是不合适的。Minecraft 的世界是无限且高度可变的,这决定了 Minecraft 无法高效利用多核处理器,这也是传统电子游戏无需面对的挑战。很难想象当《GTA》中的每处地面都能被炸出一个大坑时,它的性能可以和原来一样。

需要在 Forge 和 Fabric 中二选一

事实上 Forge 和 Fabric 之间的区别远没有想象中那样大,通过巧妙的方式可以使你的模组很快迁移到另一种平台。Minecraft 本身的代码才是你应该着重了解的。毕竟在最大的模组发布平台 CurseForge 上,两个平台目前处于分庭抗礼的关系,谁不喜欢更多的用户呢?

模组的通常模式

在这一部分中,笔者将介绍一个常见模组是如何完成其目标的。

一般来说,模组主要做两件事:添加新的内容,和修改原有内容。

要添加新内容,一般我们会继承或实现游戏对象(物品、方块、配方、实体等),然后将它们注册到游戏的注册表中。

要修改原有的较简单的内容,我们会监听 Forge、Fabric API 或其他模组提供的事件,然后在事件发生时加入我们的逻辑。对于小众的修改需求,平台永远也不可能面面俱到,这时候就需要使用Mixin直接修改游戏或其他模组的代码。

通过结合这些方法,一个完整的模组就诞生了。

从哪里开始

Minecraft Java 版现在已经有几十万行代码,这意味着你将永远不可能完全掌握它。幸运的是,你只需要掌握一些基础知识,然后在需要实现某个特定功能时学会相应的部分就可以了。事实上,学会一件事情的最好方法就是真正用到它。对于那些百科全书式的视频教程,完全没有必要细看。

那么,有哪些基础知识是需要了解的呢?笔者这里推荐阅读 Fabric官方文档,它简洁明了,并且提供中文翻译。首先你应该浏览一遍目录,在你搞不清楚某个条目的意思时读一下它的导言。然后,你应该阅读整个“基础”部分、“方块和方块实体”的前三个章节、以及“Mixin和ASM”的前四个章节。这些内容可以帮助你更好地理解游戏和模组的运行机制。

解决问题的方式

对于初学者而言,在面临一个需求时应当首先思考在原版和一些小型模组中是否已经有了类似的实现。一般来说对于初学者,很少出现前所未有的需求,你应当学习相似内容的写法,融会贯通,形成自己的内容。在这里笔者举一个简单的例子,希望能够帮助你理解思考流程,举一反三:

比如,要实现一个特殊的门,它会在开关时播放平滑的过渡动画。首先,门是方块,要为方块制作动画一般采用方块实体渲染器。那么,原版中有没有类似的方块实体,它的某个部分可以绕轴旋转呢?答案是肯定的,比如箱子的开盖动画,又比如钟的摇晃动画,它们都是最有价值的参考资料。

记住,不要吝啬你的想象力!再加上持续的模仿!

最后,不要忘记Minecraft有庞大的开发者社区,你可以通过搜索引擎或在群组中提问获取帮助。不过,最好提高一下自己的英语水平,至少选择一个好点的翻译软件。

我的实践

“最佳实践”是可以使开发活动达到最优结果的做法,但是接下来介绍的并非最佳实践。因为我们使用的模组开发工具链远非完美,制作模组就是一个不断妥协的过程。笔者在这里仅提供个人觉得舒服的做法,以供参考。

1. 使用官方映射表

使用官方映射表可以帮助你将模组更快移植到新的平台。的确,官方映射表的质量并不是最高的,也有一些奇技淫巧允许你通过非官方映射表移植,但官方映射表是无可争议使用最广泛的标准。

2. 你可以同时使用IntelliJ IDEA和Eclipse

笔者一般使用IntelliJ IDEA编写代码,用Eclipse进行调试。这是因为它们各有优点:

IntelliJ IDEA:

  • 更棒的编程体验
  • 使用Minecraft Development插件,尤其是编写mixin
  • 使用GitHub Copilot

Eclipse:

  • 几乎没有延迟的方法内热重载
  • 更好用的Minecraft代码搜索
  • Ctrl+Shift+O一键导入包

3. 避免随处使用非Minecraft类

笔者推荐将Forge和Fabric相关类的引用限制在几个固定的类中,通过引用这些类来完成你的目的。这样可以使你在迁移平台,合并代码时事半功倍。

限制仅客户端存在的注解也并非必需,可以通过编码技巧避免使用。

4. 远离TOML作为配置文件格式

TOML格式非常受一些模组开发者欢迎。然而根据笔者的经验表明,TOML这种格式存在设计缺陷,目前Java生态也没有任何一款足够好的TOML编码解码器。笔者目前使用的是YAML和JSON格式。

5. 远离Forge小众独家特性

历史表明,Forge的一些特性总是疏于维护,漏洞频出,最终被Forge自己抛弃。建议在看到这些特性时避免盲目乐观,而考虑转而使用多平台通用的解决方案。

结语

这是这篇文章的结尾。希望你有所收获,在模组开发过程中找到属于自己的乐趣。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment