Unity3D-游戏-通用MOD制作方法-修改游戏资源-打包游戏资源修改-静态图片

本文最后更新于:2021年4月13日 上午

引言

上次修改游戏的外部资源,算是一种特例。绝大部分游戏的游戏资源并不会这样直接“裸露在外”
u3d的游戏资源保存在.asset 文件中,游戏代码则主要在 Assembly-CSharp.dll中(复读)

此处假定你已经阅读了前文,并且下载好了工具,明白了制作MOD的基本思路与流程

关于游戏中的图片

对于游戏的图片的内容,除非程序员特地设计,它几乎百分百只存在于游戏资源之中

为什么说几乎只百分百只存在于游戏资源中?
因为使用其他方式保存大多会影响游戏的加载速度,或者造成游戏程序代码编写的不方便

这么说,还能将图片保存到游戏程序中?
是的,可以。
对于过分简单的图片(比如一张纯色的图),是可以使用代码来保存的,而且在获取的效率上甚至比保存在游戏资源中更快。但对于复杂的图片,保存在代码中就会比较的麻烦(如 BASE64 ),速度上也不见得会快

这是不是意味着可能找不到那些过分简单的图片?
但实际上,如果没有这样的需求,几乎没人会特地这么做。
还记得前面篇章中写过的吗?程序员(乃至于普通人)将文件按照其层级意义进行分类存放
所以哪怕是一张 用代码生成 比 保存到资源文件 中读取要快100倍的图片,程序员都会倾向于将它保存到资源文件中

在游戏中,图片的作用多种多样
有的可能是一张人物立绘或者游戏CG,有的可能是游戏菜单上的一个按钮,有的可能是某个模型的贴图
在这里,我会根据图片特点,将图片分为三个种类

  • 静态图片
    指那些图片本身看起来是怎么样,在游戏里看到就是怎么样的图片,典型的是游戏CG图

  • 可动图片
    指那些可以通过对图片进行形变/位移/叠加之类的操作达到一定表现效果的图片。典型的例子是Live2D 的人物

  • 模型贴图
    指那些用于保存模型材质信息的贴图

确定基本MOD制作思路(复读)

  1. 找一位 没有加密资源的 U3D制作的 幸运儿游戏
  2. 大致观察其内容
  3. 进入游戏,确认目标
  4. 搜索目标所在
  5. 对目标内容进行修改
  6. 保存修改后的内容到游戏中
  7. 重启游戏,观察是否修改成功

操作

寻找幸运儿游戏

关于如何寻找U3D游戏,见 Unity3D-游戏-通用MOD制作方法-修改游戏资源-文本

这次我选择的游戏是:霓虹深渊
(来自老菊玩啥我玩啥系列)

大致观察内容

进入游戏的过程中并没有发现有U3D的广告图
进入游戏根目录

观察到有 Unity 字样,但并不能确认什么

在游戏找到.assets文件,那么基本确认是U3D制作的游戏了

确认目标

这次的话,我选择替换这个任务的立绘好了

搜索目标所在

搜索方法

此处使用对于已经打包好的U3D游戏资源文件.assets使用AssetStudio这个软件来进行浏览和搜索目标资源

在观察目录的时候,就发现了有好几个.assets文件

目标在哪个.assets文件里呢?
每个游戏各有不同,没有人能回答你,你只能自己寻找
对于那些已经有人制作过 MOD的游戏,是可以询问得知的。而且那些作者已经理解了 游戏程序员的资源存放思路 了
对于没人只做过MOD的游戏,那就只有问优秀作者,或者自己慢慢摸索了

 

快速寻找的捷径?
捷径是有的,依然是那个理论 “程序员(乃至于普通人)将文件按照其层级意义进行分类存放”
由于这个原因,大多数游戏资源会集中放置于 某个 或 某几个 .assets文件中,而不会单独的分开存放。这会让这些文件有一个特征一一体积大
所以只要加载那些体积大的.assets文件,一般都能找到目标图片

AssetStudio是支持同时加载多个.assets文件的,但同时读取多个会占用跟多的系统资源,加载速度也会变慢

在加载完毕后,点击 Asset list查看资源
可以查看到加载的资源包中的内容

由于是要修改图片,所以需要留意的是 Texture2DSprite 这两种图片格式的资源

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 协议 ,转载请注明出处!