【發佈】Arknights(明日方舟)拆包+桌面精靈

Arknights(明日方舟)拆包+桌面精靈

 

畢設結束後耗時一週,終於搞定這個坑了。現在可以在桌面撩這隻阿米驢啦~

前排附上鍊接

網盤鏈接:https://pan.baidu.com/s/1qA2qHPypxUiN9itPErsB9Q 
提取碼:9xum

目前只發布了三位幹員版本的桌面精靈,可能會有不定期更新。如果你對其他幹員版本的桌面精靈感興趣,可以聯繫作者,或嘗試根據教程內的思路自行製作。

拆包方法

環境:Win10

使用軟件:AssetStudio  附鏈接: GitHub地址 軟件發佈地址

明日方舟是由Unity開發的,他的數據使用了Unity的AssetBundle包裝(簡稱AB包),所以需要AssetStudio來提取。

拆包思路:

  1. 用電腦下載明日方舟的安卓安裝包(文件格式是.apk)
  2. 將安裝包後綴名改爲zip,然後直接解壓縮
  3. 使用AssetStudio,導入解壓縮後得到的Unity數據文件(文件格式是.ab)

網上其實已經有不少現成的拆包方法了,我剛剛隨便一搜就搜到了一則:關於現版本 明日方舟資源提取

本來以爲,通過網上能找到的方法,可以比較穩地拆出明日方舟的各類數據。搗鼓搗鼓,確實能把明日方舟的立繪資源整了出來。

看了看立繪列表,非酋心寒了。獻祭潔哥,求陳Sir到我島:

 

然而,真正的坑纔剛剛開始……


坑位預覽

角色語音

注意,角色語音數據是存放在AppData(應用私有的用戶數據)裏面的,在Apk文件中不存在。在第一次打開明日方舟App後,會在後臺自動下載角色語音數據,存放到AppData文件夾中。爲了挖出AppData數據,首先需要取得手機的Root權限。而華爲手機的Root問題又是坑上加坑……Root的問題在這裏不細講了,網上的教程一抓一大把,如果有小夥伴對挖角色音頻數據感興趣,請先看看你的手機是不是華爲。

明日方舟的AppData數據存放在這裏(正常情況下,在取得Root權限後才能查看

 

語音數據同樣是通過AssetBundle包裝過的,需要使用AssetStudio進一步提取。對於非華爲用戶來說,角色語音只是一個小坑。

Spine動畫(小人動畫)

明日方舟的基建、戰鬥關卡都使用了小人動畫(專業的說法是:Spine動畫),這是我們桌面精靈的關鍵資源。這類資源直接存放在Apk中,可以直接解壓後用。這裏存放着每個幹員的數據,包括立繪、Spine動畫等。

拆解其中一個AB包,裏面會有大量和Spine動畫無關的文件。爲了搞清楚哪些是Spine動畫的必要文件,首先需要了解Spine導入Unity的方式

接下來,將Spine動畫的必要文件從AB包導出後,就可以直接反手導入Unity啦!

然而,這個過程比想象中困難許多,網上不存在相應教程,需要自行摸索。下面是可能爲全網唯一的內容(較硬核):

自動化批量導出舟遊角色Spine動畫的思路

基礎知識

前置知識:Spine動畫(基礎,包含動畫製作、導出方法等)、Unity編程(較深入,包括Animator、Meta等)、Windows Form開發(基礎)、Github(基礎)、Unity Shader(基礎)

通過學習Spine動畫導出Unity的方式,我們可以發現下屬四個文件是將Spine數據導入Unity的必要文件。將其通過AssetStudio導出,再導入Unity(需要安裝Spine動畫官方插件

然而,你會發現,同樣的一個AB包中,可能包含多個同名的Spine動畫相關文件。這是因爲每個人物在正向、反向和不同服飾下,往往具有不同風格的Spine動畫,而這些Spine動畫的文件的同名的,唯一可以區分它們的,是地址

爲了自動化區分它們,找到我們需要的Spine動畫資源,首先需要確定AB包內的代碼邏輯結構。如下圖,左側的Character可以視作一種MonoBehviour資源,右側爲這個MonoBehviour的各種屬性。其中如紅框所示,是_animator屬性。籃框是_animator屬性的內容所在地址。

如下圖,通過在紅框內搜索該地址,即可在藍框內找到_animator屬性的內容。 可以發現,AB包內的代碼邏輯中,爲每個資源提供了地址值。而其中的Monobehviour資源,則使用m_PathId作爲地址,調用着各個資源。因而,爲了在大量無關資源中找到我們需要的Spine動畫資源,我們就需要通過動畫控制器(也就是Animator)的內容,一步步找到其所引用到的Spine動畫相關資源。

通過這一思路,結合文件名與編程經驗自行推導,你就能找到通過一個Character組件來得到每種風格所對應的Spine動畫資源。

修改AssetStudio來實現自動導出功能

明日方舟總共有數百位幹員,統共上千份Spine動畫資料,如果全靠人手導出,那實在是件地獄級差事。本着不重複勞動的態度,下面記錄了實現自動導出功能的方法。

在Github上下載AssetStudio源代碼。

AssetStudio是基於Windows窗體系統,通過VisualStudio開發的程序,整個解決方案主要包含AssetStudioGUI項目、各類插件項目、AssetStudio核心庫項目。

我們主要需要修改的是這個AssetStudioGUI項目

其中Studio靜態類內含有若干核心數據

    static class Studio
    {
        //所有資源主管理器
        public static AssetsManager assetsManager = new AssetsManager();
        //MonoBehviour翻譯機
        public static ScriptDumper scriptDumper = new ScriptDumper();
        //所有可被導出的資源條目
        public static List<AssetItem> exportableAssets = new List<AssetItem>();
        //所有可視(通過搜索的)的資源條目
        public static List<AssetItem> visibleAssets = new List<AssetItem>();
        internal static Action<string> StatusStripUpdate = x => { };
        //...略
    }

大體思路如下:

  1. 在窗口中加入【導出所有Spine動畫】的功能。
  2. 在功能內,遍歷所有已導入的AssetItem,通過資源名稱查找到Character資源。
  3. 進而通過Character資源內容,一步步查找到所有Spine相關資源。
  4. 模仿程序內Export相關的功能,將資源輸出到用戶指定的文件夾中。

具體的代碼量較爲繁多,這裏不再詳述。我在AssetStudio的基礎上添加了導出默認正向Spine動畫的功能,併發布在了 AssetStudio明日方舟版 。由於沒有嘗試過用這個版本拆解其他遊戲,可能會存在未發現的Bug,建議僅用來拆解明日方舟的Spine動畫。

修改Spine官方自帶插件來自動合併Alpha通道

爲了節約包體空間等目的,不少遊戲採用了Alpha分離(把圖片的Alpha通道和RGB通道分離)的方法處理所有png圖片,明日方舟也不例外。因而,在拆解出明日方舟的所有貼圖文件後(包括Spine動畫的圖片資源),你會發現每個貼圖都還有對應的Alpha貼圖文件。在正式使用時,需要將Alpha通道和RGB貼圖合併後才能顯示出正常效果,否則,透明的部分會呈現爲黑色。

本着不重複勞動的原則,我修改了Spine官方自帶插件的導入方式。Spine插件會自動在導入Spine動畫資源時,生成一些Unity可用的資源。在導入時,Spine插件會自動爲Spine動畫使用一種默認的材質。通過改寫這個材質綁定的Shader,就可以實現自動合併Alpha通道的效果。

我們使用的Shader如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// 合併一張ETC壓縮的RGB圖和一張alpha圖
Shader "AKA/MixAlpha" 
{
    Properties 
        {
                 _MainTex ("Base (RGB)", 2D) = "white" { }
                 _AlphaTex("AlphaTex",2D) = "white"{}
                 }
    SubShader
        {

                 Tags
                 {
                        "Queue" = "Transparent+1"
                 }
         Pass
                 {
                        Lighting Off
                        ZTest Off
                        Blend SrcAlpha OneMinusSrcAlpha
                        Cull Off
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag

                        #include "UnityCG.cginc"

                        sampler2D _MainTex;
                        sampler2D _AlphaTex;

                        float _AlphaFactor;
                
                        struct v2f 
                        {
                                float4  pos : SV_POSITION;
                                float2  uv : TEXCOORD0;
                                float4 color :COLOR;
                        };

                        half4 _MainTex_ST;
                        half4 _AlphaTex_ST;

                        v2f vert (appdata_full v)
                        {
                                v2f o;
                                o.pos = UnityObjectToClipPos (v.vertex);
                                o.uv =  v.texcoord;
                                o.color = v.color;
                                return o;
                        }

                        half4 frag (v2f i) : COLOR
                        {
                                half4 texcol = tex2D (_MainTex, i.uv);

                                half4 result = texcol;
                                
                                result.a = tex2D(_AlphaTex,i.uv)*i.color.a ;

                                return result;
                        }
                        ENDCG
                 }
    }
}

SpineEditorUtilities文件中,實現了導入Spine資源、自動配置材質的功能。閱覽此代碼,可以發現該代碼先讀取了主貼圖,然後通過默認Shader創建了新的材質,最後爲該材質賦入主貼圖。

我們要做的,就是將默認Shader替換爲我們的Shader,並額外讀取Alpha貼圖,最後爲該材質額外賦入Alpha貼圖。

詳細過程設計的代碼不多,但較繁雜,建議有興趣的小夥可以自行思考來實現類似功能。

 

利用UniWinApi來實現桌面精靈效果

拿到Spine動畫之後,最愉快的引用當然是桌面精靈啦。

爲了實現桌面精靈效果,我查閱了網上的一系列資料,找到了這塊插件:UniWinApi。UniWinApi是一款可以實現複雜Windows窗口效果的Unity插件。 

桌面精靈效果相關的教程有很多,但大多較爲老舊,有各類使用侷限或是效果存在問題。而UniWinApi是我能找到的效果最佳、時間最新(3天前竟然發佈了新版本)的一鍵式解決方案。

UniWinApi內含有一個預製體,直接拖入場景,調整相關的參數,就可以實現透明的桌面精靈效果啦!

接下來,爲我們的小人增設一些交互效果,讓桌面精靈像羅德島基建一樣有交互效果,再隨機觸發一些坐姿、睡姿動作,你就完成了拆包、導入、搭建的全部步驟,明日方舟的幹員們即將來到你的桌面啦!

再來一份萌萌的白咕咕:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章