Unity3D-游戏-通用MOD制作方法-修改游戏资源-打包游戏资源修改-静态图片
本文最后更新于:2021年4月13日 上午
引言
上次修改游戏的外部资源,算是一种特例。绝大部分游戏的游戏资源并不会这样直接“裸露在外”
u3d的游戏资源保存在.asset
文件中,游戏代码则主要在 Assembly-CSharp.dll
中(复读)
此处假定你已经阅读了前文,并且下载好了工具,明白了制作MOD的基本思路与流程
关于游戏中的图片
对于游戏的图片的内容,除非程序员特地设计,它几乎百分百只存在于游戏资源之中
为什么说几乎只百分百只存在于游戏资源中?
因为使用其他方式保存大多会影响游戏的加载速度,或者造成游戏程序代码编写的不方便
这么说,还能将图片保存到游戏程序中?
是的,可以。
对于过分简单的图片(比如一张纯色的图),是可以使用代码来保存的,而且在获取的效率上甚至比保存在游戏资源中更快。但对于复杂的图片,保存在代码中就会比较的麻烦(如 BASE64 ),速度上也不见得会快
这是不是意味着可能找不到那些过分简单的图片?
但实际上,如果没有这样的需求,几乎没人会特地这么做。
还记得前面篇章中写过的吗?程序员(乃至于普通人)将文件按照其层级意义进行分类存放
所以哪怕是一张 用代码生成 比 保存到资源文件 中读取要快100倍的图片,程序员都会倾向于将它保存到资源文件中
在游戏中,图片的作用多种多样
有的可能是一张人物立绘或者游戏CG,有的可能是游戏菜单上的一个按钮,有的可能是某个模型的贴图
在这里,我会根据图片特点,将图片分为三个种类
静态图片
指那些图片本身看起来是怎么样,在游戏里看到就是怎么样的图片,典型的是游戏CG图
可动图片
指那些可以通过对图片进行形变/位移/叠加之类的操作达到一定表现效果的图片。典型的例子是Live2D 的人物模型贴图
指那些用于保存模型材质信息的贴图
确定基本MOD制作思路(复读)
- 找一位 没有加密资源的 U3D制作的 幸运儿游戏
- 大致观察其内容
- 进入游戏,确认目标
- 搜索目标所在
- 对目标内容进行修改
- 保存修改后的内容到游戏中
- 重启游戏,观察是否修改成功
操作
寻找幸运儿游戏
关于如何寻找U3D游戏,见 Unity3D-游戏-通用MOD制作方法-修改游戏资源-文本
这次我选择的游戏是:霓虹深渊
(来自老菊玩啥我玩啥系列)
大致观察内容
进入游戏的过程中并没有发现有U3D的广告图
进入游戏根目录
观察到有 Unity 字样,但并不能确认什么
在游戏找到.assets
文件,那么基本确认是U3D制作的游戏了
确认目标
这次的话,我选择替换这个任务的立绘好了
搜索目标所在
搜索方法
此处使用对于已经打包好的U3D游戏资源文件.assets
使用AssetStudio
这个软件来进行浏览和搜索目标资源
在观察目录的时候,就发现了有好几个.assets
文件
目标在哪个
.assets
文件里呢?
每个游戏各有不同,没有人能回答你,你只能自己寻找
对于那些已经有人制作过 MOD的游戏,是可以询问得知的。而且那些作者已经理解了 游戏程序员的资源存放思路 了
对于没人只做过MOD的游戏,那就只有问优秀作者,或者自己慢慢摸索了
快速寻找的捷径?
捷径是有的,依然是那个理论 “程序员(乃至于普通人)将文件按照其层级意义进行分类存放”
由于这个原因,大多数游戏资源会集中放置于 某个 或 某几个.assets
文件中,而不会单独的分开存放。这会让这些文件有一个特征一一体积大
所以只要加载那些体积大的.assets
文件,一般都能找到目标图片
AssetStudio
是支持同时加载多个.assets
文件的,但同时读取多个会占用跟多的系统资源,加载速度也会变慢
在加载完毕后,点击 Asset list
查看资源
可以查看到加载的资源包中的内容
由于是要修改图片,所以需要留意的是 Texture2D
和Sprite
这两种图片格式的资源
Texture2D 与 Sprite
Texture2D 是真正的图片。而Sprite则是一些序列记录,并非是图片本身。
Sprite?
2D动画是由一帧帧图片不断快速切换实现的
它们可以单张图片分来存储,也可以合并成一张存储
当合并成一张图片来存储的时候,想要从一张图片中获取指定的内容,就需要一些切割信息记录,来标注需要的内容的位置
比如,我现在需要游戏准头的贴图。它并不单独保存到一张图片中,而是和其他的游戏内容一起保存在一张贴图(Texture2D)
准头Sprite记录就是为了能够在这张图片上找到准头的图片资源而存在的(比如说记录准头位于这张图片,左上角坐标(x1, y2),右下角坐标(x2, y2)所组成的矩形区域中)
在给出坐标信息后,程序就能将图片进行“切割”,单独地将准头图片资源拿出来使用了
可以通过设置过滤器,使得软件只显示指定格式的资源
余下的就是真正的进行搜索了
在游戏里,我看到我想要修改的角色名字叫安娜
,那么对应的英文应该是Anna
于是就直接进行搜索
你怎么知道就是
Anna
?
这是英语的习惯,很多人名都是有固定的拼写的
比如 卢卡斯 对应Lucas
, 本 对应 Ben
这种东西应该找英语老师,而不是找我
其它词语?
还记得前些篇目说的要诀吗? “关键是摸清程序员的思路”
想想这次的目标,也就是游戏操作的角色,都有什么可能的名词描述呢?
hero(英雄),character(角色),player(玩家)……
其实都可以试试进行搜索,但一般程序员都会用名字来对游戏资源进行命名,因为这个命名是唯一的(没有第二样东西叫Anna.所以找Anna就只能是这个Anna)
在搜索到Texture2D
的时候就已经看到有目标的资源了,证明想法没有错,但是没找到目标
增加了Sprite
类型后,就找到了目标
这个PathID
需要记录
Sprite
并非是图片本身
需要通过这个Sprite
记录找到它所使用的图片Texture2D
查看目标所在的.assets
文件
如此一来,就知道了资源的PathID
信息和所在的.assets
文件信息
查看sprite
记录来得知所需要的图片
这里会用到 AssetBundleExtractor
这个软件
利用这个软件打开Sprite
所在的.assets
文件进行查看
利用在前面找到的PathID
记录,对资源进行查找,找到目标Sprite
查看Sprite
记录,找到其使用的图片的信息。这里是UI_character_choose
利用这个信息,重新在AssetStudio
中查找。找到目标图片
类似的,记录图片的PathID
, 在AssetBundleExtractor
中导出图片
对目标进行修改
导出的图片可以用PS来进行修改
由于本身并不会画画,这里我会稍微利用一下油管像素画大佬的资源
一顿操作(修改被选中时的图像,未被选中时的图像……)过后,按原本导出的格式保存到本地
(PSD源文件建议备份)
保存修改后的内容到游戏
首先备份你即将修改的游戏原本的.assets
文件
用AssetBundleExtractor
进行修改。用修改过的图片替换原来的图片
保存修改后的assets
(这个软件无法做到读与写同一个文件,所以先保存到别处)
关闭AssetBundleExtractor
,用修改后的.assets
文件替换原本的.assets
文件
重启游戏,观察是否修改成功
看着还行
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!