如何通过拆包定向查找素材? ——炉石传说拆包教学(1)

  • # 炉石传说

炉石传说的拆包教程其实不少,但想要定向找素材的多少还是有点费力,而这也是多数拆包玩家最关心的内容。

本期拆包教学内容是如何定向查找素材。后续如果有时间,再给大家介绍一些别的拆包内容。下面直接开始。

 

一、工具准备

  • 拆包用的软件:AssetStudioGUI v0.16.47 或更高版本
  • 一个json2excel工具,可以找在线的,或者如果你会任意编程语言,应该都有现成的代码,直接拿过来用就行主要用于帮助我们查看json文件。

 

二、读取文件 load file

  找到炉石文件夹里存放数据的文件夹 Hearthstone - Data - Win

 

选择待解包的unity3d文件

到此为止就算是成功拆包了,但文件繁多,想要找到需要的内容不太容易,所以有了后面的内容——如何优雅地定向寻找想要的素材

 

三、定向查找素材

1. 获取卡牌idcardId

在炉石传说中,标记一张卡牌有三种方法:

  • 数据库iddbfid),这是一个数字,设计师每在数据库内生成一张卡牌,就会有一个dbfiddbfid只增不减,现在dbfid的数值已经超过10w了,但其实在用的卡牌总数才2w多,而且相当一部分是都不是严格意义上的“卡牌”。
  • 卡牌idcardId),这是设计师给卡牌的代号,通常由版本缩写+编号+后缀构成,有时也简称为ID
  • 卡牌名(name),卡牌名是我们通常称呼卡牌的方法,比如“克苏恩”,但卡牌名会根据语言的不同而变化。

 

获取卡牌id的方法有很多,比如可以去FBIgame数据库https://hs.fbigame.com/查找,也可以去下载hearthsim(做HDT记牌器的开发者)整理好的apihttps://api.hearthstonejson.com/v1/latest/)。

FBI数据库中,点开任意卡牌的详情页面,就能看到卡牌id,比如下面这张“尤格-萨隆的监狱”,卡牌id就是TTN_090

 

另外也可以通过拆包手动获取:

找到炉石文件夹内的dbf压缩包文件

通常来说,如果你选择的游戏语言是简体中文,就会有dbf_zhcn;是英语就会有dbf_enus,别的语言也会有对应的dbf_xxyy文件,选择一个拆包就行。

我们直捣黄龙,找到炉石传说最为关键的部分——卡牌,就是dbf拆包文件里CARD,点开后直接导出。

 在上面这张图里,我们可以看到卡牌名(霍弗),dbfidm_ID, 100)和卡牌idm_noteMiniGuid, NEW1_034),如果你有能力把导出的json文件转成excel,那就可以轻松根据卡牌名得到卡牌id了。

放一个我自己直接编程导出的excel截图在这 

这样你就能用卡牌名轻松找到对应的卡牌id了。

2. asset_manifest

asset_manifest里面一系列资源文件目录/映射

 1 cards_map

asset_manifest中能找到这个cards_map,这是所有卡牌的定义文件(cardDef索引。cards_map也分为两部分,一是key,这里记录的是每张卡的卡牌idcardId

 

然后是values部分,记录了卡牌的prefab(预设文件)对应的唯一标识码guid

唯一标识码是一串32位的16进制数,即下图中prefab冒号后的那一串数。

通过这个guid就能找到卡牌的定义文件。相关处理还是建议导出json转为excel后操作。

 假如我们想找上面那张中立地标“尤格-萨隆的监狱”的原画资源,通过最开始学到的查找卡牌ID,我们可知是TTN_090搜索后就能找到其guidf151d38b8feb47eba90cc23f95780016

 (这里使用了excel的分列功能,以英文的冒号为分隔符,将guid分离出来了)

 

2base_assets_catalog

在得到guid后,需要通过base_assets_catalog查找guid所指向的文件存储在哪个压缩包(bundle)内。

打开base_assets_catalog后,无视上面的文件头,这个文件主要存储了两部分内容,一是m_assets,记录了所有资源文件存放位置(但是是以压缩编号bundleId的形式存储的);

二是m_bundleNames,这个是按压缩包编号递增排列的压缩包名bundleNames):

 base_assets_catalog导出后,将其中的m_assets转成excel表格如下

省略几十万行)

表里左边是资源文件的guid,右边是其所在的压缩包编号(bundleId

m_bundleNames也放入excel表格,在其左侧插入一列,用于编号bundleId,注意bundleId编号从0开始

这样就能用VLOOKUP函数,或者手动查找,根据guid查找到其所在的bundleNames了。

本文将得到的映射关系成为guid-bundle

通过guid-bundle表,我们就能根据文件的guid找到压缩包名,然后再去拆指定的压缩包就能找到想要的文件了。

 

延续之前的例子,上面我们已知了guidf151d38b8feb47eba90cc23f95780016,在guid-bundle查找,可以找到

 

这样就能找到其cardDef所在的压缩包名,现在我们直接去拆carddef_base_global-8e3e520f-prefab-0.unity3d

然后找到guid

 

点开后就是“尤格-萨隆的监狱”这张牌的相关资源文件的信息。

 

很明显能看到这张牌的m_PortraitTexturePathm_PremiumPortraitMaterialPath都有和上面类似的文件名和guid,再次查找guid-bundle就能获得对应文件所在的压缩包

 

现在再去拆cardtexture_base_global-8e3e520f-texture-0.unity3d就能找到对应的原画文件了。

点击Export - Selected assets就能导出资源了。

找语音也是类似的,你需要能看懂以驼峰法命名的变量名,就能找到对应的文件。

四、总结

定向拆包的总体流程就是

  • 找到目标卡牌的卡牌id
  • asset_manifest文件中的cards_map找到卡牌id对应的cardDef文件的guid
  • 通过asset_manifest文件中的base_assets_catalog获取guid-bundle表,此表可以找到guid所在的cardDef压缩包
  • 找到对应的cardDef压缩包,根据guid找到卡牌对应的cardDef文件
  • 在卡牌对应的cardDef文件里查找各类资源的guid,如原画、动画效果、语音等
  • 根据所需资源的guidguid-bundle表,找到存放资源的压缩包文件

因为有些名词不太好用中文描述,所以请对照着步骤来做,基本就能明白每一步的意思。祝君成功。

这里是THorougH,感谢阅览,我们下次再见。

 

 

2023年7月17日 发布于四川
全部评论 19条
按时间排序

还没有评论

80 19