c4sunyx 发表于 2020-5-20 14:27

【Mod制作】如何使用官方的传书接口扩展自己的战斗(更新基础教程)

本帖最后由 c4sunyx 于 2021-5-20 12:58 编辑

Mod制作基础教程:
①资源导出下载通用Unity资源工具AssetStudio (目前世界最好的、不依赖Unity编辑器的资源浏览和导出工具,由国人二刺猿大佬Perfare开发),地址 https://github.com/Perfare/AssetStudio ;使用其解包最新游戏的各种AssetBundle(即"资源包",下文简称xxx包,xxx为bundle名字)。教程很多,可参考各种b站教程和其他unity游戏mod贴(热门的包括戴森球计划、鬼谷八荒、太吾绘卷、修仙模拟器...等等)。导出后文件格式如下
②mod支持下载我的侠之道Mod支持插件(官方尚未正式开放创意工坊,之后会视情况修改),地址 https://github.com/Binarizer/Plugin-Pow ;在游戏目录下建立Mods文件夹,Mods里面放的文件夹即会被插件视作mod资源,可设置多个Mod一起加载。上图所示,共加载了4个Mod:好友切磋(Duel,插件自带),英文翻译(EnglishTranslate),剑击江湖(JJJH),贴吧语音包(TiebaVoice),可以视情况增删,用逗号隔开即可。在Mods文件夹下建立新文件夹,文件夹名称即mod名,再在插件中按上图格式加入你的mod,插件即会尝试使用mod来扩展原始游戏。
③资源替换河洛游戏通用的文本数据路径为assets/config/,里面就是剧情和战斗类的mod作者看重的各种脚本和配表,也就是河洛之前所谓的“纯净官方mod”;其他路径即为模型、贴图、动作、特效、Shader、音乐等美术资源。其中脚本(*.json, *.lua,...)、图片(*.png,*.jpeg...)、音乐(*.wav, *.ogg ...)这三项均可通过插件mod支持功能来外接,只要有mod的路径匹配,则会使用外部资源替换原资源,也可以新增资源。例1:assets/audio/music/In_Battle_21.wav(罡风破虏),是打包在audio包里面的。我们制作一个小mod,里面只存一个文件,路径为mods/[你的mod名]/audio/music/In_Battle_21.wav,改为其他音乐,重启游戏即可发现该音乐被替换。例2:assets/config/chs/battle/buffer/difficulty_buff04.json(绝境难度buff脚本),是打包在config包里的。同样制作小mod,只存一个文件,路径为mods/[你的mod名]/config/battle/buffer/difficulty_buff04.json(chs为语言路径,若省略则所有语言下均使用该资源),里面将数值做修改,则重启后即可观察到难度数值变化。
④数据库修改河洛的4款游戏均使用Excel来填写游戏数据(即策划配表),表现到资源文件则为assets/config/[语言]/textfiles/*.txt,正确的打开方式为编辑器打开->全选->复制到Excel中,开启插件调试器按P导出txt文档即可获悉每一列的意义。修改后保存也是全选所有列->复制粘贴回txt。官方对配表的mod支持弊端为同样将其看做资源,即必须整表替换——你的表中须包含原版游戏数据,才能保证原版游戏正确执行。插件支持另一种模式,即数据库增删查改,方法是将*.txt改名为*_modify.txt,这样就无需在里面填写原数据,且可以多个mod同时生效(也就是按加载顺序对原版配表增删查改)。例:assets/config/chs/textfiles/GameFormula.txt(lua公式表),5.1更新后刮痧是因为HP公式变化,将其全部内容复制到Excel中;
然后新建mods/[你的mod名]/config/textfiles/GameFormula_modify.txt,粘贴excel中这行:basic_max_hpstr*2.5+vit*4.25+dex*2+spi*3(从Excel粘贴回来数量一定是对的,但不用Excel就须保证键的数量要对上);请自行发挥修改其系数,再通过插件加载mod,即可发现所有人物HP计算变成了你的新公式,又不影响其他原版公式。⑤无法直接加载的资源增改除图片、文本、音乐外的其他资源(prefab)只能通过打包方式加载,所以若要替换/增加模型、动作、特效,都必须通过Unity编辑器进行制作并打包。如何制作并打包这些资源的教程同样非常多(等同自学Unity和游戏美术),过于进阶这里不解释。打包好的资源同样可以由插件来放入你的mod中。游戏的打包资源是通过一个名为AssetBundleSheet.sheet的json文件来定位的,插件支持mod扩展这个文件。例:由越南大佬制作的河群降龙十八掌特效包,我们将其重命名放在[你的mod]/effects_xianglong,然后添加[你的mod]/AssetBundleSheet.sheet,内容如下(例子里Mod名为MoreEffect):{
    "BundleList": {
      "effects_xianglong": {
            "AssetBundleName": "../Mods/MoreEffect/effects_xianglong",
            "Dependencies": [],
            "AssetBundleSizeMB": 68
      }
    },
    "FilesInfo": {
      "assets/resources_art/art3d/effects/effect_prefab/atk_effect/effect_rong1.prefab": "effects_xianglong",
      "assets/resources_art/art3d/effects/effect_prefab/atk_effect/effect_rong101.prefab": "effects_xianglong",
      "assets/resources_art/art3d/effects/effect_prefab/atk_effect/effect_rong2.prefab": "effects_xianglong",
      "assets/resources_art/art3d/effects/effect_prefab/atk_effect/effect_rong3.prefab": "effects_xianglong",
      "assets/resources_art/art3d/effects/effect_prefab/atk_effect/effect_rong4.prefab": "effects_xianglong",
      ......(枚举资源包里被用到的各个所需资源)
    }
}
然后在特效脚本里对其进行引用,即可添加加该资源包里的新特效了。
* 由于扩展资源的打包路径不太可能符合该游戏里的缺省路径,引用的地方需要使用插件提供的绝对路径标识功能 @[] ,类似这样
"prefabName": "@",


2021年更新:这游戏其实代码结构还是不错的,不过官方使用的自定义Action脚本系统,个人认为还是会给Mod制作造成不小障碍。比如他的自定义脚本这样的{ \"CharacterPropertyAbilityAction\" : 1, 300, 4020}实际上拿Json导出,会变成下面这样,我觉得更容易读懂,也更好编辑:{
    "$type": "CharacterPropertyAbilityAction",
    "property": "Max_HP",
    "method": "Add",
    "value": 300
}
每个值对应变量名都标示,4020变为Max_HP,1变为Add,很直白——角色最大血量增加300。而且Json导入导出都不慢,有现成的库,根本不用写几句代码。
所以在我后来更新的插件里面,就让游戏可以直接读取这种json格式,且能把游戏原始格式直接通过Json导出,如下所示
需要F1然后打开高级设置(advance)。开启调试后,游戏中刚刚执行到的剧本、战斗,鼠标放到的Buff等,都会被捕捉,点击相应按键就可以导出到设定的目录下面。剧本也可以勾选排序优化,不用再肉眼找ID,直接写字符串跳转即可,默认为顺序执行。没编辑器的情况下,这样已经算不错了吧。另外默认P键可以导出当前游戏内(包括插件)支持的所有表格和指令的说明文档,可以参考作为mod制作的工具。插件自带了我写好的一版和队友切磋的Mod,有示例性质的json格式的剧本、战斗、buff各1个。插件名为 Mod支持和多项功能v2.7z 地址 http://pathofwuxia.ys168.com/剑击江湖Mod默认自带。插件开源,地址 https://github.com/Binarizer/Plugin-Pow
2020原内容:先附上一个例子,该战斗是调的原版一场传书战,写好了最小化的入口和出口Cinematic文件,并在Quest和BattleArea中各添加一行数据。想替换具体战斗需要把其入口的Cinematic文件里面的场景和战斗一并换掉才可以。另外由于新加了文件,需要使用到支持外部读取Mod的dll。满足条件(如何改传书条件这我就不写了,很简单)就会发现这个任务,点击进入战斗,战斗完毕返回养成界面,胜利则时间不变,失败则时间推后半天。


下面是原理。该游戏本身是一套状态机,每个状态能转换到哪些状态都是事先编辑好的,而日常养成状态是没有连线到战斗状态的,无论怎么发进入战斗的事件,它都不会有任何反应。而官方所有的战斗事件,都是通过在过场动画(Cinematic)状态下触发的,也就是过场动画状态连线了战斗状态。所以不改代码下官方提供的做法是,先在养成状态的传书界面进入Cinematic状态,再通过Cinematic状态触发战斗。传书ID去掉最开始的t,就对应了其入口的Cinematic的文件名,这里我写的是modtest_00.json,路径是在config/cinematic下面。这种json过场动画文件的内容是让不少mod作者望而却步的一个难点,官方的打开大概如图所示。其实这就是一个典型的逻辑树,每个节点做一件事,然后通过其序号相互链接。EntryPoint是入口Node序号,然后找到这个Node开始执行。Next即执行完后顺序跳转到哪一个Node,Prallel拼错了应该是Parallel,顾名思义并行执行,也就是跳转同时也一起执行哪一个Node。每个节点的事件命名也都很直观,例如CameraTransformAction = 相机摆放,GroupTransformAction = 一大组人摆放,PlayerTransformAction = 玩家摆放,SetFlagAction设置旗标,RewardAction给奖励,ScreenFadeAction = 屏幕暗下来,TalkAction = 调对话,LoadScenesAction读取场景,BranchAction条件分支跳转,等等等等。当然,官方没有放出事件编辑器前,手动改这东西是非常反人类的,毕竟每个节点并没有标明其序号,你要肉眼自己去数,Node多了烦也烦死。不过,只为了进战斗,保留几个简单的还是没有问题的。比如我提供的传书入口,就做最简单的两件事:读场景(LoadScenesAction),载入战斗(BattleAction){"EntryIndex": 0,"Nodes": [    {      "Node": "{ \"LoadScenesAction\" : \"S0107\", { 0.00000, 0.00000, 0.00000} , { 0.00000, 0.00000, 0.00000} , 0, False, 0} ",      "Next": 1,      "Prallel": -1    },    {      "Node": "{ \"BattleAction\" : \"btmodtest_00\"} ",      "Next": -1,      "Prallel": -1    }],"Name": "mmodtest_00:瞎鸡掰修业"}我们修改这个读取的场景、玩家位置、战场ID,即可实现自定义战斗。当然,BattleArea里面对应的事件也要做相应修改。
战斗结束后还需要回到养成界面,需要在BattleArea.txt的胜利和失败这两栏里填写。
这里我提供的两个文件mmodtext_01和mmodtest_02,分别是过半天和时间不变,拿过半天的举例{"EntryIndex": 0,"Nodes": [    {      "Node": "{ \"NextOrEndQuestAction\" } ",      "Next": 3,      "Prallel": -1    },    {      "Node": "{ \"LoadScenesAction\" : \"S0202\", { 1499.94800, -0.00600, 758.87900} , { 0.00000, 0.00000, 0.00000} , 0, True, 0} ",      "Next": -1,      "Prallel": -1    },    {      "Node": "{ \"LoadScenesAction\" : \"S0202\", { 1499.94800, -0.00600, 758.87900} , { 0.00000, 0.00000, 0.00000} , 0, False, 1} ",      "Next": -1,      "Prallel": -1    },    {      "Node": "{ \"BranchAction\" : { \"LogicalNode\" : [ { \"CheckCurrentTime\" : 1}], 0} , 1, 2} ",      "Next": -1,      "Prallel": -1    }],"Name": "mmodtest_01:战斗後时间过半天"}入口后结束Quest(NextOrEndQuestAction),然后跳到节点3。节点3是一个BranchAction分支,判定如果时间是白天,则跳到节点1读取日常场景并设置为夜晚;如果是黑夜,则跳到节点2读取日常场景并设置为白天且时间推进1。另一个文件_02是时间不变的,其实就是跳转时不倒转日夜,且不推进时间。如果要扩展这个结束奖励,你还可以加入RewardAction,TalkAction,随便什么。不过就是要数好序号,把Next/Parallel、BranchAction里的跳转序号都改改对。这样,我们就能通过增添Quest来加入任意多的自定义战斗,整个把游戏改成一系列传书那种的都可以。

lys292 发表于 2020-5-20 14:30

大佬牛逼,

嘻哈99 发表于 2020-5-20 14:33

给菜虫哥递冰阔乐

c4sunyx 发表于 2020-5-20 15:00

lys292 发表于 2020-5-20 14:30
大佬牛逼,

很想吐槽,这玩意连代码都不需要懂,明明就是看一下官方怎么写的就搞定的事大概还是想自己做关卡战斗的Mod作者太少,大多数人关注点都在如何改良系统上

jingxiaolou 发表于 2020-5-20 15:21

c4sunyx 发表于 2020-5-20 15:00
很想吐槽,这玩意连代码都不需要懂,明明就是看一下官方怎么写的就搞定的事大概还是想自己做关卡战斗的Mo ...

我想是因为实用性不大吧,获得的奖励都能通过其他方式实现……{:3_98:}

lys292 发表于 2020-5-20 15:53

c4sunyx 发表于 2020-5-20 15:00
很想吐槽,这玩意连代码都不需要懂,明明就是看一下官方怎么写的就搞定的事大概还是想自己做关卡战斗的Mo ...

大佬,战斗中右键人物点开的那个UI界面应该搜啥关键词啊。

c4sunyx 发表于 2020-5-20 16:04

lys292 发表于 2020-5-20 15:53
大佬,战斗中右键人物点开的那个UI界面应该搜啥关键词啊。

盲猜一个WGBattleStatusTip

lys292 发表于 2020-5-20 16:19

c4sunyx 发表于 2020-5-20 16:04
盲猜一个WGBattleStatusTip

研究半天,还是找不出取消右键弹出这个UI的办法。

sabersl0016 发表于 2020-5-20 16:43

jingxiaolou 发表于 2020-5-20 15:21
我想是因为实用性不大吧,获得的奖励都能通过其他方式实现……
{:3_93:}应该不是想用来弄奖励吧,是想以后有MOD做成机战那样一关关的战斗的感觉吧,以前前传那个什么XX传就类似吧,当然如果这作有可能的话

c4sunyx 发表于 2020-5-20 17:03

sabersl0016 发表于 2020-5-20 16:43
应该不是想用来弄奖励吧,是想以后有MOD做成机战那样一关关的战斗的感觉吧,以前前传那个什么XX传 ...

对就是因为这个,做成一关一关那种,或者扩展支线战斗啥的

pk001 发表于 2020-5-20 17:05

6666666666666666

qq1797348673 发表于 2020-5-20 17:51

小白完全看不懂

buckfill789 发表于 2020-5-21 10:20

111111111111111111111111111

Lzjxk 发表于 2020-5-22 18:27

感谢分享

nethunter 发表于 2020-5-22 21:01

11111111111111111111111111111111111111111

liudongdong56 发表于 2020-5-24 03:06

谢谢分享

古剑玩家 发表于 2020-5-27 23:18

口扩展自己的

lzh1027415808 发表于 2020-5-29 10:38

666666666666666666

ky2014 发表于 2020-5-30 06:16

谢谢楼主的分享

2395681519 发表于 2020-6-6 11:08

看看帖子里藏了啥好东西~~~

wjzxhgj 发表于 2020-6-18 22:43

学习一下

拉多尔 发表于 2020-6-21 18:53


感谢分享

skyu0 发表于 2020-6-30 17:12

怎么改传书条件

skyu0 发表于 2020-6-30 17:16

哦哦,懂了,感谢大佬

kongyt 发表于 2020-8-1 22:59

111111111111111111111

longkingroad 发表于 2020-8-2 01:08

6666666666666666

浮沉/ツ飒 发表于 2020-8-13 06:21

谢谢大大

兀言一 发表于 2020-8-16 18:30

66666666666

tututu963 发表于 2020-9-22 21:31

感谢楼主无私分享

qwqq123@qw.12 发表于 2020-11-8 15:25

感谢感谢
页: [1] 2
查看完整版本: 【Mod制作】如何使用官方的传书接口扩展自己的战斗(更新基础教程)