关于Unity2d游戏动态CG和Live2D动画的提取以及逆向思路

您所在的位置:网站首页 黄油的提取 关于Unity2d游戏动态CG和Live2D动画的提取以及逆向思路

关于Unity2d游戏动态CG和Live2D动画的提取以及逆向思路

#关于Unity2d游戏动态CG和Live2D动画的提取以及逆向思路| 来源: 网络整理| 查看: 265

【重要说明】

*1 .解包已发布的项目,使用其素材进行二次创作可能会引发版权纠纷,不要做进橘子的行为(

2 .本文旨在记录 提取Unity3d游戏里的动态cg 的学习过程,不提供任何工具和代码下载

3 .我的操作止于提取素材 不涉及游戏逻辑代码,并无使用提取出来的素材用于任何个人项目,也没有公开传播

4 .可能有点啰嗦,可以根据小标题跳着看~

2023/10/30 前言:

在前几天忽然想起玩过的某国产黄油的一首很好听的op,或许可以调个翻唱什么的。于是从github上整了个unity解包软件AssetStudioGUI,提取出了游戏的op.wav文件和一堆静态cg.png,画风很好看可以拿来当壁纸什么的(没有h,不会社死)

这个游戏是有很精美的动态cg的,但是我只找到了一些内容是很多零碎图片碎片的.png,当时猜测可能是有什么动画播放器,或者是unity内的Animation做出来的。于是找了unity 动画提取教程开始看,磕磕绊绊整了几天,最后还是成功实现了,记录一下过程。

AssetStudioGUI提取动画.fbx导入Blender (失败,只适用于提取3d模型)

我注意到这个游戏资源文件夹下打了很多个.bundle 即ab资源包,所以可以根据文件名找到要提取动态cg的图片素材,右键选择show original file 找到资源所在的包。单独复制包文件出来用AssetStudioGUI解开,这样就不会因为导入整个游戏文件太多爆内存了(导致电脑蓝屏卡死)

然后根据教程在Scene Hierarchy里勾选要导出的模型object,在AssetList里根据Tapy过滤出Animator和AnimationClip,选中要导出的然后Export - Animator + Selected AnimationClips,导出之后会是一个.fbx模型文件

.fbx 文件可以用建模软件Blender打开,不过我看的教程视频里演示的是3d项目,导出.fbx后拖到Blender里是一个不带纹理的白模,后续把纹理拖进去引用,再调下渲染器就可以了。

而我拖进去是只有层级结构的空物体,界面上没有任何模型,换成Blender的2d项目再拖进去也一样,于是不能继续操作了。可能2d项目的模型和动画不能用这样的方式这样导出,以后如果有3d模型动画导出的需求会继续深入探究

AssetStudioGUI提取.atlas和.skel 导入 Spine(可行,但是分游戏)

当时看的是另一个提取BA(碧蓝档案)的live2d的教程,BA虽然是手游但是也是unity做的,提到了提取包里的.atlas和.skel这两个文件,还有图片素材就可以导入Spine这个软件来还原出live2d动画。

我看完了之后在包里找不到这俩个文件,出于好奇于是又找了其他几个小黄油,解开来练练手

.atlas(贴图解析文件)和.skel(骨骼和动作文件)这俩类型是TextAsset可以一起导出,上面个名字一样的Texture2d是这个cg的图片素材,这一个cg只导出这三个文件就行了。

*.atlas 和 .skel导出来之后都有个.asset后缀,要删除这个后缀

删除两个文件的asset后缀

接下来打开Spine,点软件最左上角的Spine图标打开软件菜单,导入数据。

格式选JSON或二进制,文件选到刚才导出来的去掉asset后缀的.skel(骨骼文件),点击导入。

会弹出一个警告,提示有一堆素材文件没找到,不用管。现在界面上能看到cg图片的白模,但是没有材质贴图。

点左上角Spine图标打开菜单,选择纹理解包器。

图集文件选到.atlas,输出文件夹需要新建一个文件夹,用来存放解开之后的那些小的贴图文件,因为cg的材质贴图都在那一张png文件里了,要把它分开

.atlas文件里面就存着分开贴图的各种数据,感兴趣的可以用打开看看

点解开会报错,点打开日志找到ERROR,错误是因为 素材.png的像素分辨率 和 .atlas文件里的不一样

打开.atlas文件(可以直接用记事本打开)看到size是8192x8192,而素材.png的分辨率是2048x2048

于是可以用Adobe Photoshop把图片的分辨率拉成8192x8192,糊一点问题不大。注意不要用windows的画图整,会丢.png的透明

ps的操作太简单不赘叙了,再次回到Spine点纹理解包器,这次不会报错了

点右边的模型 - 图片,在下面的路径选到纹理解包器把纹理解出来的文件夹,这样模型就有了贴图

点软件左上角的Spine下面的小图标可以切换到动画,这样就可以浏览这个cg的各个动画。

后续的话,可以在Spine里调整各个参数;导出动画为视频文件;甚至导出整个Spine工程到unity里使用等等操作都可以实现。因为我没有这个需求就不继续下去了

* Spine现在貌似只能找到3.8的学习版本,如果是使用版本高于3.8的Spine制作的动画,可能提取不出来。而且Spine这个软件卖的貌似巨贵,非专业人员就算了

* 后续解包其他游戏过程中,我发现很多游戏都用到了Spine来制作动画,不过通常是一些小动画。

AssetStudioGUI提取.moc3文件 手写model3.json并导入 Live2d Viewer浏览(只能提取基础live2d建模,没有动作动画)

回到我想提取live2d动画的这个游戏的ab包,用AssetStudioGUI解开之后并没有多余的TextAsset文本文件,除了贴图,还有Animator(动画),AnimationClip(动画片段),MonoBehaviour(挂载脚本),这些都是unity工程内的对象,貌似陷入了僵局

于是继续找教程看,在某解析少女前线的live2d教程里,找到了可以提取到.moc3文件的方法

在AssetStudioGUI里过滤出MonoBehaviour,选跟这个live2d对象一样名字的,也是size最大的这个以二进制文件导出,Export - Raw - Selected assets。下面的Dump是以json文本文件格式导出

会得到一个.dat文件,安装一个十六进制查看器 010Editor 或者 Visual Studio打开

把图中选中的.dat文件头删掉,留MOC3开头

把文件的后缀.dat改成.moc3,和提取出来的贴图.png放到一起

Live2D是有官方软件的,所以由Spine或者其他技术做出的动画CG,只能算作动态CG而不能称为live2d

关于.moc3文件,是Live2D Cubism工程里的模型数据文件,里面存储了live2d模型的纹理,图层和可调整参数等信息

除此之外还需要一个关联.moc3和纹理.png的配置文件model3.json,从Live2d官网上下载了一个官方模型用来对照

Live2D官方模型

1.第一个文件夹存放的是纹理.png

2.motion文件夹里面存放的是动作文件motion3.json

3.moc3文件即模型数据

4.model3.json 即模型和纹理的关联文件

5.physics3.json是物理模拟效果之类的数据 (可有可无)

5.cdi3.json 参数描述文件 和 pose3.json 姿势文件(可有可无)

打开官方模型的model3.json文件看看内容,复制一份出来,我们只需要MOC和Texture这俩就行了,其他的部分可以删掉(物理Physics,Pose,动作Motions等,注意分括号)

把内容改成跟自己的moc3和素材文件名相同,就可以拿出来用了

到这里就可以把model3.json拖到Live2d Cubism Viewer里打开预览了,不过目前只有基础的live2d模型贴图和默认动作,没有动态cg里的各种动作(没有motion3.json)

AssetRipper 提取Animator和AnimationClip原文件 转化成motion3.json以提取Live2D动作动画 (理论可行? 但需要逆向SDK 或者使用其他tool )

* AssetRipper 同 AssetStudioGUI 功能差不多,也是一个解包软件。不过AssetRipper支持的unity版本貌似更高,而且AssetStudioGUI停止维护了。

** AssetRipper能从包中提取出 完整的unity项目使用格式的文件,比如直接提取出.prefab预制体文件 .anim 即AnimationClip文件等等。

而AssetStudioGUI对于unity项目里使用的对象 只能转化成 .json文件或者 .dat二进制文件

看的教程里提取少女前线的动画,提取的是ab包里的.fate文件,然后根据CubismSDKForUnity里的转化逻辑写出逆向转化工具,把提取出来的.fate.json 逆向转化成 motion3.json ,从而达到提取live2d动画的目的。

看了几遍Live2d在unity的使用教程,于是我从官网上下载了CubismSDKForUnity工具包,并将官网下载的模型导入了新建的unity工程,打算从游戏开发者的角度理清其中的转化逻辑

*CubismSDKForUnity是Live2D的官方工具包,可以在将Live2D工程导入unity时,自动根据那些json文件生成unity工程可以使用的对象和文件。比如预制体.prefab文件,.fade,和.anim文件,如图:

.anim (绿色三角形图标)和 .fade (蓝色正方体{ })都是CubismSDKForUnity 根据motion3.json生成的

当然工具还生成了其他的东西,不过我暂时只考虑动画。打开unity工程的文件目录是这样的:

不过我目前的这个游戏的ab包里也没有.fata文件和.motion3.js文件可供提取,也许是游戏作者Build项目之前删除掉了,毕竟生成了.anim之后fade文件和motion3.json就没用了。

所以教程里up主提供的.fade转motion3.json的工具exe我暂时用不到

现在只剩下了通过AnimationClip(即.anim)逆向转化成motion3.json的方法了,这个方法需要阅读CubismSDKForUnity里转换部分的源代码,再自己写出可用的工具代码emm

下面是SDK手册里给出的转换API调用方法,具体代码里逻辑可不止这么简单,想逆向怕不是短时间能搞定的。。

于是又陷入了僵局,,

** UnityLive2DExtractor 一键提取ab包里的Live所有素材(完美解决)

当时又找到了一些带.fade的游戏来解包,不知道因为unity的原因,还是AssetStudioGUI的原因,提取出来的.fade.json只有一些引用信息,内容不完整,而提取成.dat格式虽然完整但是乱码。

跟不上教程里使用fade.json转motion3.json,up主提供的转换工具是完全用不上,也许是pc端和移动端差异

使用AssetRipper是因为当时再找AssetStudioGUI的使用教程,怀疑是自己的导出格式设置有问题或者漏掉了什么关键东西,跟up的教程里不一样

结果意外地找到了AssetStudioGUI作者 Prefare大佬 的博客,在他的留言栏里得知AssetStudioGUI停止更新,推荐使用AssetRipper。

同时在他的博文里看到了这段话:

我推断出Prefare大佬的这个工具 有通过MonoBehaviour(即.anim等等unity工程文件)转换回motion3.json(当然还有其他东西)的功能

于是我从github上下了个 UnityLive2DExtractor ,看了下使用手册

* UnityLive2DExtractor需要把包含live2d的ab包放到一个文件夹下,然后拖动文件夹到exe上运行,就能成功解析出Live2D官方标准的的所有工程,真一键操作!

于是我从MuMu模拟器里拖了个碧蓝航线 的live2d ab包出来,跟着提取了一遍,果然能生成完整的Live2D项目

用Live2D Cubism Viewer打开,动作文件也完整提取出来了,右边的截图部分不放出来了,是碧蓝的初月Live2D皮肤

当我以为橘势大好,把我要提取的游戏的ab包 也照样来一遍的时候,发现UnityLive2DExtractor 只有黑框闪一下,程序可能是报错了或者不支持这个ab包。

不应该呀两个同样是ab包,虽然碧蓝是移动端而这个游戏是pc端

用010 editor查看两个包的头文件,碧蓝的包是UnityFS 2018.4.34,这个游戏是UnityFS 2020.3.34,难道是unity版本的问题?UnityLive2DExtractor 不支持2020的版本

我尝试用dnSpy逆向UnityLive2DExtractor查看逻辑,但是短时间里怕是找不出解决方案。。

当时在github上一直打开着UnityLive2DExtractor项目的页面,看到项目有个live2d的标签。于是我点了进去看看还有没有其他大佬关于live2d的项目可以用~

*结果意外地翻到了这个项目,在Prefare大佬的基础上UnityLive2DExtractor继续维护的,虽然它只有13个星星

于是下载下来尝试了一下,使用方法相同,居然发现它能支持我这个游戏的ab包的解析,完美地解决的我的需求!(果然还是github上的大佬给力hah)

附上提取出来后的文件,可以看到motion文件夹里是有motion3.json的。

使用Live2D Cubism Viewer打开,各动画功能也完美复现

附上一些可能会遇到的问题,以及live2d逆向使用到unity工程里的思路

关于非StreamingAssets文件夹下资源的live2d提取(可行性未知 未来更新)

* Unity移动端的手游 通常都会打ab包热更新资源,所以可以直接使用UnityLive2DExtractor 来提取(没有加密的情况下)

StreamingAssets文件夹下的资源会在项目Build发布后 原样复制到文件夹下,不会被unity进行整合处理。ab包用于热更新,所有一般会在这个文件夹下

但是也有资源全在Data文件夹里,没有打ab包的情况,这种情况常在小规模的独立游戏

这时候要提取.moc3文件是没有问题的,但是motion3.json动作文件怕是不能通过UnityLive2DExtractor 来提取,因为ab包都没有

1. 可以用AssetRipper提取出.anim 文件,以及其他存在的 物理效果physics3.json 转化的 unity文件,然后想办法理出UnityLive2DExtractor主函数的逻辑,逆向改出适合的UnityLive2DExtractor使用,emm

2. 可以将AssetRipper提取出的.anim 文件以及有的 导入unity项目,可以不使用,选中它们单独打出一个ab包。再用UnityLive2DExtractor提取打出来的这个ab包,得到motion3.json

再手写个model3.json关联这些文件,达到提取Live2D的目的

* 但是我暂时没有试过,可行性未知,未来也许会更新这部分内容的解决方案

关于解包出来的Live2D 放到桌面上播放(社死警告)

提取出来的这些还不是完整的Live2D项目,不能用Live2D Cubism Editor打开编辑

但是可以导入moc3到Live2DViewerEX里,重新生成完整的Live2D项目(.cmo3 .can3),从而能导入Live2D Cubism Editor。

Live2DViewerEX 可以在Steam上购买,26大洋。

具体的 Live2DViewerEX软件操作 和 Live2D项目相关的内容就不深入了~

关于遇到ab包加密 或者资源文件 加密的情况

那肯定要逆向游戏代码出来,找到加密的方法然后想办法得到解开的包啊,或者直接找有经验的大佬要解密工具

具体情况具体分析,一般大公司的游戏才考虑这些,小作坊的游戏一般不会加密

Unity里的脚本编译技术分为 Mono 和 IL2CPP 两种,Unity游戏资源文件夹下有Managed/Assembly-CSharp.dll 为Mono,而游戏主文件夹下有GameAssembly.dll 即为IL2CPP

Mono能反编译出跟原来几乎一样的C#代码,多花点时间可以理通逻辑;

而IL2CPP 在Mono的基础上将代码编译成了C++和汇编语言,反编译出来怕是神仙都难看懂

如果是IL2CPP的话那只能说寄

关于解包出来的Live2D逆向使用到Unity项目(可行性未知 不建议尝试 可能进橘子!)

从Live2D官网上下载CubismSdkForUnity导入项目,再直接导入提取出来的Live2D文件夹到Asset下,会自动生成anim动画文件等等

新建一个动画控制器控制它们,把控制器挂载给预制体

如果没有预制体,可以直接拖AssetRipper解包出来的.prefab进来,整理好预制体挂载的组件

缺什么就解包提取什么拖进来,遇到问题一个一个慢慢解决就完事了

关于几种去码的思路

使用Adobe PhotoShop对素材.png里有码的贴图部分作处理,覆盖或者手动去码(笑

更改motion3.json里的内容,替换部件参数

导入Live2DViewerEX或者Live2D Cubism Editor自行修改

后语:

教程看了一堆,果然涩涩才是最大的生产力,这几天晚上睡觉前躺在床上都在琢磨到底哪不对。。

算是对unity的动画这块有了新的认知,记录一下说不定以后能用在项目上呢 ?

如果你看到了这里,别问我解包这个游戏是什么hah



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3