花亦山心之月(The Moonlit Oath) Spine/Live2D UnityCN 解析自定义Spine

花亦山心之月(The Moonlit Oath) 解析自定义Spine Spine/Live2D UnityCN

文件乱七八糟的,同时部分spine是自定义格式的,把动作和基础骨骼分离开了,而其他部分则是可以正常播放的。

资源路径

APK

  1. ab文件
  2. spineanimations目录下都是.spineani文件,也就是自定义spine中被分离开的动作。

Update

结构与APK完全一致。

  1. ab文件
  2. assets目录下找到spineanimations

合并一下两个spineanimations目录,同名文件保留来自Update的。

├─ APK
├─ Update
└─ spineanimations

导出

Spine

导入Raz版AS,选择UnityCN key

搜索

  1. assets/rescollection/prefabs/spine/spinedynamic
  2. assets/art/spine

不分组导出(把skel atlas png都放在一个目录,记为RES),因为如果按照容器路径导出,会有部分的atlas和png放一起,但是skel单独放在另一个目录下。

然后再把之前的spineanimations的所有.spineani文件也放到这个混合目录RES下。这样skel atlas png spineani 都在同一个目录RES之下。

DelFileSuf(.txt .bytes .asset .prefab).bat

批量去除文件后缀 asset prefab txt bytes

Live2d

Unity Live2D Cubism 3 Extractor for UnityCN

就10个,嫌麻烦就算了吧

UnityCN.py

手动处理UnityCN还原为明文bundle,然后导入MOD版AS一键导出。

解析Spine自定义格式

TheMoonlitOath/MergeSkelAndAni.py
参考IDA反编译代码、 SpineSkeletonDataConverter以及LLM炼丹。

具体的解析细节太多了,大致就是:主体部分的hash字段是自定义的,没法直接用这个skel,只能转为json,但是转为json后animations是空的,因为animations被单独放在了spineani文件里面,不展开介绍了。自定义改动的部分太多了,14种TimeLine几乎都改了,还有一些数据读取方式包括但不限于自定义读取方式以及大端读取。

目前解析的模型都可以正常运作,只有一个模型解析有略微的问题Senior_Yunwuji_Rw.json

---> System.ArgumentException: Color hexidecimal length must be 8, recieved: 5FAFFFFFF (Parameter 'hexString')
[E]2026-02-14 00:40:04 - Failed to load: D:\Tools\UsefulTools\MuMu\Shared\Download\花亦山\output\TMP\Senior\Senior_Yunwuji_Rw\Senior_Yunwuji_Rw.json, Failed to load spine with version '3.8'

手动改为5FAFFFFF,应该是多了一个F

分类

SortAtlas&Skel&png(Any).py

把同一个spine的skel/json png atlas 放在同名目录下。

获取UnityCN key

没什么特别之处,简述一下。

SetABEncryption ← SetAssetBundleDecryptKey ← SetAssetBundleKey

dump.cs

Unity内部的虚拟路径。

点击mono后需要导入DummyDLL还原数据

string EncryptKey = "INHJnhdypqk547xd"

string → hex

494e484a6e68647970716b3534377864

文件太多了,仅提供Live2D以及部分Spine
GamesArchive/TheMoonlitOath (HuaYiShanXinZhiYue)

哦对了,提前祝大伙新年快乐吧。

1 个赞

谢谢大佬 :heart_eyes: :heart_eyes:

大佬可以把Skel2Json.py也发一下吗,我从GitHub里面下载的Spine-skel2json.py用起来会报错,也可能是我下载错了 :smiling_face_with_tear: