杀戮尖塔MOD制作入门:从零搭建Java环境到首个卡牌Mod
发布时间:2026/10/23 20:23:21 锦皓数字建站

简介这份PDF教程面向《杀戮尖塔》Mod开发零基础玩家从游戏本体安装、订阅modthespire、stslib、basemod三大支持库到搭建Java开发环境与Maven配置完整梳理了入门路径。教程以IntelliJ IDEA为例详细说明创建Maven项目、编辑pom.xml引入BaseMod等依赖、利用${steam.path}指定Steam路径并给出可运行的构建步骤。目录从准备工作、支持库订阅、IDE与Maven环境配置延伸到构建项目、语法基础和监听继承设置小作业便于边学边练。包内共1个PDF文件压缩后约1.5MB篇幅紧凑、章节清晰适合作为手边查阅的入门手册。目前已有2121人学习下载尤其适合首次接触Java或Steam创意工坊模组开发的玩家。读者跟随示例完成首个MOD项目后会接触到控制台输出调试、变量与函数、类作用域、监听函数和继承等Java核心机制能进一步理解杀戮尖塔的Mod结构为自制卡牌、角色或新机制打下扎实基础。1. 杀戮尖塔MOD制作入门先别急着搜代码先把这件事想明白很多新手第一次接触杀戮尖塔MOD制作入门都是因为同一个冲动想让游戏里多一张自己设计的卡或者想把某个角色改得更有趣。于是打开创意工坊找到一堆看起来很厉害的MOD订阅之后玩了两天又开始想“别人能做我是不是也能做”。可等你真正去搜资料时看到的全是Java工程、依赖库、编译打包这类词瞬间就劝退了。这就像你站在餐厅后厨门口想学做一道菜结果看到的是整面墙的锅具和调料不知道从哪个瓶子开始拿。其实MOD这件事没有想象中那么玄学。MOD的本质并不复杂游戏本体是用Java写成的MOD就是另外一小段Java代码通过一个叫ModTheSpire的“加载器”塞进游戏里让游戏在运行时多出一些行为。你不需要先成为编程高手只需要弄懂几个基础概念、把环境搭好、跑通一个最简陋的示例就完成了入门的一大半。这套教程就是给你这条路的适合完全零基础、从没碰过Java、甚至不知道Maven是什么的玩家。别怕先把概念理清我们再一步一步往下走。2. 动手前先备齐三样东西游戏本体、三个支持库和Java环境很多人一想到“开发MOD”第一反应是直接打开编辑器写代码。但杀戮尖塔的MOD开发和“新建一个文本文件”完全不同它需要在已有游戏工程的基础上做扩展。所以动手之前你要先确认三件事都齐了游戏本体、三个创意工坊支持库、一套能写Java代码的环境。这三样缺一样后面都会卡住。2.1 为什么所有MOD都绕不开“三个支持库”杀戮尖塔的MOD几乎都依赖三个支持库ModTheSpire、BaseMod、stslib。它们的用处不太一样但缺一个都不行。你可以把它们想象成装修房子的流程ModTheSpire是“施工队入场证”游戏启动时它会先启动一个MOD选择界面告诉游戏这次要加载哪些外部代码BaseMod是“物业给的施工规范”它提供了一批接口让你能把新卡牌、新遗物、新角色“登记”进游戏里stslib则是一箱常用工具很多MOD会调用它封装好的通用机制避免重复造轮子。第一次接触这些名词记不住全称很正常你只需要记住这三个库是MOD的根基。它们负责把游戏本体和你的代码连接起来游戏本体不会主动去读你写的代码而是靠这三个库在中间牵线。顺带一提如果你想玩别人做的MOD同样得先把这三个库装上它们也是运行一切MOD的先决条件。2.2 在创意工坊订阅支持库不到五分钟就能搞定具体操作很简单。打开Steam客户端进入杀戮尖塔的商店页面找到创意工坊入口然后依次搜索以下三个名字ModTheSpire、BaseMod、stslib。搜到之后点击订阅即可订阅后Steam会自动把它们下载到本地的创意工坊目录。这里有个新手容易忽略的点订阅完之后请确认它们真的下载完成了。有些玩家进游戏发现MOD没生效回头一看三个库根本没下载成功只是订阅列表里多了三个名字。你可以在Steam的“下载”页面确认一下或者直接去本地的创意工坊文件夹看看有没有对应的jar文件。下一步搭建开发环境时我们要在配置文件里引用这些jar的真实路径如果文件不存在后面编译会直接报错这是新手开场最容易翻车的地方。2.3 IDE你的Java“写字台”写Java代码和写记事本完全是两回事尤其对于零基础的新手强烈建议从第一分钟就使用IDE集成开发环境。IDE可以理解成一张功能齐全的写字台它帮你自动补全代码、用红波浪线标出写错的地方、一键运行Maven命令还能让你看到项目里所有文件的树状结构。目前主流的Java IDE主要是Eclipse和IntelliJ IDEA。这套教程以IntelliJ IDEA为例你直接去官网下载社区版即可社区版免费对学习完全够用。第一次打开IDEA时它会问你选哪个主题、要不要装插件这些都不重要一路默认就好。新手不要在这里纠结太久工具只是工具重点是后面能把项目跑起来。Eclipse其实也完全可以但为了避免教程中“在IDEA里点哪里”和你的界面对不上干脆从开始就统一用同一个。2.4 Maven把源码“打包成成品”的流水线如果你从没接触过Java听到Maven这个词多半是一头雾水。简单说Maven是一个项目管理和构建工具。它负责三件事第一管理你的代码依赖了哪些外部库第二按照固定的流程编译代码第三把编译好的内容打包成一个jar文件——也就是MOD最终的发布格式。可以把它想象成一条食品加工流水线你准备好原料Java源码Maven负责清洗编译、装盒打包、贴标签复制到游戏MOD目录最后产出一个可以直接吃的成品。杀戮尖塔的MOD本质上就是一个jar包游戏加载时把它读进去所以Maven是整套流程里少不了的环节。2.5 Windows下配置Maven环境变量这里我们只讲Windows的配置方法其他操作系统可以类比操作。首先去Maven官网下载二进制压缩包解压到一个你记得住的位置比如E:\Maven\apache-maven-3.3.9。接下来要告诉系统“mvn命令住在哪里”这就需要设置环境变量。按下快捷键Win Pause打开系统属性点击“高级系统设置”再点“环境变量”。然后在系统变量里新建一个变量变量名填MAVEN_HOME变量值填你刚才解压的路径。接着在系统变量里找到Path选中它点“编辑”新建一行写入;%MAVEN_HOME%\bin。保存之后打开一个新的命令行窗口输入mvn -v如果能看到版本信息说明配置成功。mvn -v这里有一点要注意环境变量设置完后必须重新打开一个新的终端窗口才生效在你已经开着的窗口里输入命令是没反应的。我第一次学的时候就卡在这一步以为配置写错了后来才发现只是窗口没刷新。这个坑很典型先记下来后面避坑章节还会再提。3. 迈出第一步从新建工程到跑出一个能被加载的MOD环境搭好之后信心最重要的一步来了把第一个MOD工程建起来哪怕它还没有任何功能只要能出现在游戏的MOD列表里你就已经击败了绝大多数“只下载不制作”的围观群众。这一章我们一步一步走不要跳。3.1 在IntelliJ IDEA里新建Maven项目打开IDEA选择“New Project”。在左侧找到Maven选项直接点下一步不需要勾选任何模板。填项目名的时候可以起一个你喜欢的名字比如tutorial然后选择项目存放位置。IDEA会帮你生成一个标准的Maven工程目录结构你不需要手动去创建那些文件夹。创建完成后你会看到左侧的文件树里面有几个自动生成的目录。其中.idea是IDEA自己的配置文件跟MOD没有关系不用碰src是代码的家它又分成main和test两部分test是Maven自动生成的测试目录暂时不用管main下面还有java和resources两个文件夹java里放代码resources里放图片、JSON配置文件这类素材。记住这个大框架后面写代码、放卡牌图片都会用到这两个目录。3.2 编辑pom.xml告诉Maven“去哪找游戏”项目里有一个名为pom.xml的文件它是整个Maven工程的中枢配置。第一次打开它会看到一堆初始内容不用管直接把它替换成下面这样?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdorg.example/groupId artifactIdtutorial/artifactId version0.1/version packagingjar/packaging nametutorialMod/name descriptiontutorial/description properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding steam.pathE:\SteamLibrary\steamapps/steam.path /properties dependencies dependency groupIdbin/groupId artifactIdBaseMod/artifactId scopesystem/scope version1.0/version systemPath${steam.path}/workshop/content/646570/1605833019/BaseMod.jar/systemPath /dependency dependency groupIdbin/groupId artifactIdSlayTheSpire/artifactId scopesystem/scope version1.0/version systemPath${steam.path}/common/SlayTheSpire/desktop-1.0.jar/systemPath /dependency dependency groupIdbin/groupId artifactIdModTheSpire/artifactId scopesystem/scope version1.0/version systemPath${steam.path}/workshop/content/646570/1605060445/ModTheSpire.jar/systemPath /dependency /dependencies build finalNametutorialMod/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.7.0/version configuration source1.8/source target1.8/target /configuration /plugin plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-antrun-plugin/artifactId version1.8/version executions execution phasepackage/phase configuration target copy filetarget/tutorialMod.jar tofile${steam.path}/workshop/content/646570/你的MOD文件夹/tutorialMod.jar/ /target /configuration goals goalrun/goal /goals /execution /executions /plugin /plugins /build /project输入完这段内容后IDEA右下角会弹出提示说Maven配置发生了更改这时选择Import Changes导入更改让IDEA重新读取配置。下面把这些关键参数逐一说清楚steam.path这一项填的是你的Steam库路径每个电脑可能不一样。如果你不知道自己的Steam库在哪打开Steam设置找到“下载”里的“Steam库文件夹”照抄路径即可。后面所有依赖路径都以这里的值为基础。dependency声明了三个依赖分别是游戏本体desktop-1.0.jar、BaseMod.jar和ModTheSpire.jar它们都是支持库章节里提到的关键文件。注意这里的scope是system表示直接从本地路径读取jar文件这也是为什么必须先把支持库下载好。finalName决定最终打出的jar包叫什么名字。这里叫tutorialMod你可以换成自己的MOD名。最后一个插件的作用是每次打包完成后自动把生成的jar文件复制到创意工坊对应的MOD目录里省得你手动拷贝。3.3 添加ModTheSpire.json给MOD办一张“身份证”光有jar包还不够ModTheSpire在加载MOD时需要一个JSON文件来识别它的身份信息。这个文件必须放在src/main/resources目录下。右键点击resources目录选择新建文件文件名输入ModTheSpire.json然后写入以下内容{ modid: tutorial, name: tutorialMod, author_list: [A, B], description: 新手教程mod, version: 0.0.1, sts_version: 03-29-2018, mts_version: 2.6.0, dependencies: [basemod] }逐个字段说一下modid是MOD的唯一标识建议用全小写name是显示在MOD列表里的名字author_list是作者列表可以写多个description是描述会显示给玩家看version是版本号随便写sts_version和mts_version分别表示这个MOD对应哪个游戏版本和ModTheSpire版本dependencies声明这个MOD依赖哪些库这里写了basemod。写JSON时最容易犯的错就是括号不配对。JSON里{}表示一个对象块[]表示一个数组两者都必须成对出现。建议写完以后看一眼结构每个左花括号都有对应的右花括号每个字段后面用英文逗号分隔最后一个字段后面不要加逗号。这一步出错游戏里就会看不到这个MOD。3.4 执行package见证第一个jar诞生所有配置文件就位后开始测试构建效果。在IDEA右侧找到Maven面板展开Lifecycle双击package。Maven会按照生命周期依次执行编译、测试、打包最后在target目录下生成tutorialMod.jar同时自动复制到创意工坊MOD目录。如果你更习惯命令行也可以打开终端进入项目目录直接执行mvn package看到BUILD SUCCESS就说明打包成功了。这时候去Steam启动杀戮尖塔注意不是直接点“开始游戏”而是要选择使用ModTheSpire的启动方式。打开后会先进入一个MOD选择界面勾选BaseMod、ModTheSpire以及你刚打出来的tutorialMod然后点运行。进游戏后在MOD菜单里就能看到你自己写的名字。这时的MOD还没写任何功能但它已经是一条合法的MOD了。天天玩的游戏里突然出现“自己做的MOD”这种成就感就是继续学下去最好的燃料。4. 第一段代码变量、函数、类和作用域练熟这四样就能起步项目框架已经搭好接下来要往里面填真正的代码。这一章内容稍多一些但每一样都是后续开发随时要用到的地基。不懂Java也没关系跟着读一遍再亲手敲一遍感觉立刻就不一样了。4.1 第一个Java类让ModTheSpire知道“新MOD来了”在src/main/java目录下先新建一个包包名建议用你的MOD小写名称比如tutorial。包可以理解成文件夹用来把同类代码放在一起。然后在包里新建一个类文件命名为Tutorial。Java的类名有个不成文的规矩首字母大写多个单词之间大小写交错比如TutorialHook、MyCharacter。在这个类里写入以下代码package tutorial; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; SpireInitializer public class Tutorial { public Tutorial() { } public static void initialize() { new Tutorial(); } }一行一行解释。package tutorial;表示这个文件属于tutorial这个包import ...表示引用ModTheSpire里的类也就是要用到别人写好的代码SpireInitializer是Java里的一种注解它告诉ModTheSpire“这个类里有初始化内容加载MOD时请务必执行它”public class Tutorial定义了一个名为Tutorial的类下面的Tutorial()是构造函数负责创建一个类的对象initialize()方法就是ModTheSpire会调用的初始化入口。这段代码的作用就一句话让ModTheSpire知道你创建了一个新的MOD。每一行都有自己的职责先混个眼熟后面几节会让这些概念活起来。4.2 控制台输出让log里出现你的第一句话在开发过程中你会经常看到ModTheSpire的log框不断滚动信息。那些内容就是游戏和MOD运行时输出的日志。现在你也可以让log主动说出你想说的话。在initialize()方法里加上一行System.out.print(hello world!);Java里每个语句用英文分号结尾分号表示“这句话说完了”。System.out.print的意思是往控制台输出一段文字括号里可以是字符串也可以是数字甚至是表达式System.out.print(hello world! 5*630); System.out.print(5 * 6 30); System.out.print(end of line!\n22 4);这里的在字符串和数字之间表示拼接比如22 4会输出“224”\n是一个特殊字符表示换行。修改完成后重新打包启动游戏在控制台就能看到这行输出。别小看这一招以后写代码发现某功能没生效第一件事就是在这里加输出语句看它有没有被执行的痕迹。LOG是你和游戏之间唯一的沟通窗口学会看它等于给游戏装了对讲机。4.3 变量四种常用类型够你开局了变量就好比附了名字的箱子用来存放值。箱子类型不同能装的东西也不一样。杀戮尖塔MOD开发中最常打交道的变量有以下四类。整型用int表示存的是整数比如卡牌的攻击力、费用数值。浮点型用float或double表示存的是小数比如遗物触发的概率数字后面加f表示float否则默认是double。布尔型用boolean表示它只存两个值true和false好比电灯开关不是开就是关常用于逻辑判断。字符串用String表示存的是文本比如卡牌名字、描述文字。看一下几种典型的声明方式public int number; private float dot 2.4f; public static boolean judge true; public final String HELLO Hello world!;声明变量时public表示外部代码能访问private表示只有类内部能用static表示这个变量归整个类所有而不是某个具体对象final表示值一旦确定就不能改也就是常量。常量的命名习惯是全大写加下划线比如MAX_HEALTH。新手常犯的错是声明了变量不赋值就直接用Java不允许这么做。任何变量都要先初始化再访问常量更是一开始就必须赋值。4.4 函数处理输入、给出输出的小黑盒函数可以理解成一台小型加工机你从一头扔进原料它从另一头吐出成品。函数负责把一系列操作封装起来以后需要时只用喊一声它的名字不必每次都重复写一遍逻辑。private int print(String string, int num) { System.out.print(string); return num; } private void hello() { System.out.print(Hello world!); return; }第一个函数接收一个字符串和一个整数然后把字符串打印出来再把整数作为结果返回。括号里的string和num叫形式参数调用时真正传入的值叫实际参数两个名字互不相干。如果函数不需要返回任何值就用void声明return可以省略等所有语句执行完函数自然结束。函数命名一般和变量一样小写开头。这一节不用背后续几乎每个功能都要写函数写着写着就熟了。4.5 类与对象图纸和按图纸造出来的东西Java是一门面向对象的语言这句话对新手很不友好换成“类与对象”就亲切多了。类是一张图纸对象是按图纸造出来的实物。你玩的每张打击卡运行时都是一张“图纸”造出来的对象一个电球、一个敌人同理。A a new A();这行代码干了三件事A表示某个类的名字a是给这个对象起的代号new是“造新对象”的动作。类里面既有描述状态的变量比如打击卡的伤害值、玩家的生命值也有描述行为的函数比如电球攻击敌人的方法。在之前的入门类里构造函数负责在最开始时执行一些操作它没有类型标识符因为它不能像普通函数那样被直接调用并返回结果。这也是类最朴素的理解方式把状态和行为绑定在一起。4.6 作用域public、private和static到底在管什么很多新手刚开始写代码时总喜欢全部用public static图省事结果到后面就分不清谁是谁了。其实这几个关键字并不难。public表示任何人都能访问private表示只有类内部能碰。IDE为了项目结构整齐会把公开类单独放在一个文件里其他类可以通过import语句引入这个类。import的完整路径读起来像文件路径最后一个单词是类名前面的单词是包名。static则换了一种归属逻辑。普通成员归对象所有一张打击卡的费用被改不影响另一张打击卡但静态成员归整个类所有所有对象共享同一个值。比如记录“游戏里一共生成过多少张打击卡”的计数器就应该用static。访问时也不需要通过对象直接用类名即可strike a new strike(); int dam a.damage; int summary strike.sum;这段代码里a.damage拿到的是某张打击卡的伤害strike.sum拿到的是所有打击卡共享的统计值。区分对象与类是初学Java最容易绕晕的坎但只要脑子里始终记着“图纸与实物”这对比喻遇到问题就不容易慌。5. 新手避坑手册配置、路径、依赖与打包的常见问题走完前四章的路你基本已经把开发流程从头到尾跑了一遍。但第一次跑通这件事几乎不可能不踩坑。这一章我把新手最常见的五个坑集中列出来每个都按“现象→原因→解决”来讲遇到问题时直接对号入座。5.1 现象pom.xml中依赖全部标红或者提示找不到BaseMod.jar原因是steam.path写错了或者三个支持库根本没下载成功又或者IDEA还没导入更改。最常见的是玩家把steam.path想当然地写成了安装Steam的目录而实际上它应该指向Steam库文件夹也就是包含common和workshop的那一层。解决办法是打开Steam设置查看“Steam库文件夹”把路径完全复制过去确认对应的jar文件真实存在于创意工坊目录下。另外修改pom.xml后记得点击右下角的Import Changes不然IDEA一直在用旧配置。5.2 现象在命令行输入mvn -v提示“不是内部或外部命令”原因是环境变量没配好。常见情况有三MAVEN_HOME的变量值写错了位置、没有在Path里追加%MAVEN_HOME%\bin、或者环境变量设置完没有重开终端。解决方法是重新检查系统变量确认两个位置都正确然后务必新开一个命令行窗口再执行命令。如果还不行直接在命令行里输入echo %MAVEN_HOME%看系统认不认这个变量。5.3 现象打包成功但游戏里的MOD选择界面看不到自己的MOD原因通常是ModTheSpire.json没放对位置或者文件内容格式有误。有些新手把JSON文件放到了src/main/java目录下但正确位置是src/main/resources。另外JSON里的括号配不齐、字段名拼错、编码不是UTF-8都会导致识别失败。解决方法是先确认文件位置再用一个JSON校验工具检查格式并留意IDEA右下角是否提示了编码问题。5.4 现象勾选了MOD并运行但游戏加载时提示版本不匹配原因是sts_version和mts_version与本地游戏版本、ModTheSpire版本对不上。这两个字段的作用是提前声明兼容性如果数值写得太旧或太新加载器都会抛出异常。解决方法是去确认你当前安装的杀戮尖塔版本和ModTheSpire版本。如果你拿不准先把sts_version写成你游戏的更新日期mts_version写成ModTheSpire的当前版本再调整到一致为止。5.5 现象游戏可以用但MOD加载后log里有异常或者界面没变化原因是代码里可能有运行时错误或者你忘记在游戏里把MOD勾选上。很多新手改完代码、打包完成、进入游戏却发现一切照旧最后发现MOD列表里那些库根本没勾。还有一种情况代码写完后没有重新打包运行的都是旧jar。解决方法是养成固定习惯每次改代码后先执行package再进入游戏并确认勾选了BaseMod、ModTheSpire和你自己的MOD这三项。这个组合拳虽然机械但能帮你躲开八成的假故障。6. 让代码真正影响游戏从监听函数起步然后照着这条路继续走到这一步你已经能创建一个MOD、打包、加载还能写出简单代码。但说到底这些功能除了在log里打印文字还没真正触碰到游戏的玩法。现在就来补上最关键的一环让MOD“听到”游戏里发生的事情并对这些事件做出反应。6.1 监听函数游戏里每抽一张卡你的代码都会知道ModTheSpire和BaseMod提供了一种叫“订阅”的机制。你先把你的MOD注册成某个事件的订阅者之后游戏里一旦发生这个事件你的代码就会被自动通知。利用这个机制写一个监听抽卡事件的MOD代码极短package tutorial; import basemod.BaseMod; import basemod.interfaces.PostDrawSubscriber; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.cards.AbstractCard; SpireInitializer public class Tutorial implements PostDrawSubscriber { public Tutorial() { BaseMod.subscribe(this); } public static void initialize() { new Tutorial(); } Override public void receivePostDraw(AbstractCard abstractCard) { System.out.println(abstractCard.name); abstractCard.name NULL; } }这十几行代码里藏着两个重要的新知识点。第一个是implements PostDrawSubscriber它表示“我这个类承诺实现抽卡事件的回调函数”。构造函数里的BaseMod.subscribe(this)就是在向BaseMod注册自己让它以后每抽一张卡就通知我。第二个知识点藏在最后两行abstractCard是这次抽到的卡牌对象System.out.println(abstractCard.name)把卡名打到log里紧接着把它改成NULL。你可能会好奇为什么改的名字真正生效了这就要提到Java里一个关键机制public static void swap(int a, int b) { int temp a; a b; b temp; }如果把两个整数传进swap函数结束后原变量数值不会变因为基本类型传的是值。但对象不一样函数拿到的是对象的“引用”相当于一把钥匙用钥匙能直接打开门里的东西改掉。修改引用指向的对象本身修改就会永久生效。所以abstractCard.name NULL能真正把牌改名这就是引用传递和值传递的区别。新手一开始不需要记术语只要理解这个现象基本类型传的是复印件对象传的是钥匙。同理继承也是杀戮尖塔MOD里绕不开的玩法。游戏里的能量球有很多种它们的行为各不相同但都有共同的区域、都能被激发、每回合都会做一些操作。把这些共性抽到一个父类里再由各种能量球去继承父类就省去了重复写相同代码的麻烦。做卡牌时也是同一个思路所有卡牌都继承自AbstractCard你只需在自己类的构造方法里填上卡名、费用、伤害再实现想要的效果即可。6.2 下一步的三个台阶到这里你已经走完了“环境搭建→项目配置→基础语法→监听函数”这条入门主线。接下来的路建议不要盲目啃大部头的Java书而是直接围绕杀戮尖塔本身学。第一阶打开BaseMod的官方Wiki和示例Mod逐行阅读别人写的类不懂的函数去查查完再回来读。第二阶自己动手做一张最简单的自定义卡牌哪怕只是把一张打击改成伤害1也要坚持自己写完整个流程这能把你之前学的所有知识点串起来。第三阶试着做一个新的遗物或药水它会逼你去查游戏里事件触发的更多接口比任何教程都学得快。我到现在还记得第一次把自己的卡做进游戏时的那个夜晚看着仓库里那坨粗糙代码打包成功打开游戏自己设计的卡静静躺在卡池里那种感觉不是“我学会了编程”而是“我真的动了一个游戏”。但从那以后我每次改完pom.xml都会强制自己复查一遍steam.path每次打包进游戏前都会重新走一遍勾选MOD的流程。这些看似繁琐的习惯让我少走了很多弯路。希望这篇杀戮尖塔MOD制作入门能帮你迈过那道最难的坎。希望帮到你接下来就等你的第一张卡问世了。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。