星塔旅人不是spine是Unity做的 Unity打开找不到人物模型 播放不了动画怎么整

最后的起源是可以的

通过网盘分享的文件:char_2d_14401.unity3d
链接: 百度网盘 请输入提取码 提取码: e1uu
–来自百度网盘超级会员v8的分享

這是Live2D文件
可以使用 aelurum 版AssetStudio 輸出Live 2D文件

感谢 :waving_hand: 我看他的运动方式不像L2D 没想到

aelurum版AssetStudio輸出Live2D文件常見問題解決
以S大傳的char_2d_14401.unity3d 為例來講解

修改完成的Live2D模型 : 星塔旅人 - 千都世(チトセ)
14401.rar (20.9MB)

使用aelurum版AssetStudio輸出Live2D文件

使用aelurum版AssetStudio開啟unity3d文件
Export ----> Live2D Cubism models ----> All models
設定輸出文件夾 (我這邊設定為out)
輸出後會看到Live2DOutput新目錄
\out\Live2DOutput\assets\assetbundles\actor2d\character\14401\14401_l
\out\Live2DOutput\assets\assetbundles\actor2d\character\14401\14401_lf
\out\Live2DOutput\assets\assetbundles\actor2d\character\14401\14401_lt

共三個目錄 , 四個model

aelurum版AssetStudio輸出Live2D文件的BUG發現

第一個目錄 14401_l
使用Cubism Viewer開啟 14401_L.moc3 文件後 , 顯示正常

第二個目錄 14401_lf
使用Cubism Viewer開啟 14401_F_a.moc3 文件後 , 顯示異常 (圖片錯位 , 背景圖片混入)

使用Cubism Viewer開啟 114401_F_b.moc3 文件後 , 顯示異常 (圖片錯位 , 背景圖片混入)

第三個目錄 14401_lf
使用Cubism Viewer開啟 14401_T.moc3 文件後 , 顯示異常 (圖片錯位)

這是aelurum版AssetStudio的老問題了
之前處理萬魔聖源錄的Live2D就發現到了
最後還是解決了 : )

Live2D文件修正思路

根據解包萬魔聖源錄的經驗
(a) PNG圖檔文件名順序錯誤導致圖片錯位
(b) 多餘圖片混入導致圖片錯位
大概這兩種因素造成

(1) PNG圖檔文件名錯誤 , 修正PNG圖檔文件名顯示恢復正常
比如將
texture_00.png 與 texture_01.png
改成
texture_01.png 與 texture_00.png
圖檔文件名順序對調

(2) 混入多餘PNG圖檔
修改json文件 , 將多餘圖檔移除 , 顯示恢復正常

本次的案例是 (1) 和 (2) 情況都有

Live2D文件修正實作 - 14401_l 目錄 - 14401_L模型

14401_l 目錄跳過不修改 (原本就顯示正常)

Live2D文件修正實作 - 14401_lf 目錄 - 14401_F_a模型

14401_lf 目錄兩個moc3模型
四張貼圖都在同一個目錄內

(1)
開啟 14401_F_a.moc3 後發現混入背景 (淺綠色)
修改14401_F_a.model3.json
去掉所有背景貼圖 , 存檔

(2)
重新開啟 14401_F_a.moc3
背景圖已消失但角色身體仍然有錯位
PNG圖檔對調文件名即可

(3)
將 texture_01.png 修改文件名為 texture_01x.png
將t exture_01_#33700709.png 修改文件名為 texture_01.png
重新開啟 14401_F_a.moc3 , live2d已顯示正常

Live2D文件修正實作 - 14401_lf 目錄 - 14401_F_b模型

(1)
開啟 14401_F_b.moc3 後發現混入背景 (淺綠色)
修改 14401_F_b.model3.json
去掉所有背景貼圖 , json文件存檔

(2)
因為 texture_00.png 與 texture_01.png 貼圖已被 14401_F_a 模型使用
所以這邊重新命名為 texture_02.png 與 texture_03.png
修改 14401_F_b.model3.json
修改貼圖名稱 , json文件存檔

(3)
將 texture_00_#27064554.png 修改文件名為 texture_02.png
將 texture_01x.png 修改文件名為 texture_03.png
重新開啟 14401_F_a.moc3 , live2d已顯示正常

Live2D文件修正實作 - 14401_lt 目錄 - 14401_T模型

(1)
開啟 14401_T.moc3 後發現圖片錯位
查看 14401_T.model3.json
發現多了一個貼圖 “textures/Default-ParticleSystem.png”,

(2)
刪除 “textures/Default-ParticleSystem.png”,
維持只有貼圖 texture_00.png 與 texture_01.png

json文件存檔
重新開啟 14401_T.moc3 , live2d已顯示正常

PNG貼圖不用對調文件名
若出現圖片錯位 , 才需要對調文件名

補充說明 : )

補上 迷霧修改法

去迷霧版

14401_lf.rar (3.4 MB)

Live2D文件修正實作 - 14401_lf 目錄 - 14401_F_a模型 - 迷霧修改

14401_F_a模型 歐派和胖次有迷霧

上面一團 下面一團

透過貼圖 texture_00.png

找到迷霧貼圖

Photoshop消去迷霧貼圖

存檔

重新開啟14401_L.moc3

迷霧已消失 : )

Live2D文件輸出PNG大型去背圖檔

PNG大圖生成輸出

使用Steam版 Live2DViewerEX —> EX工作室

Live2D/Spine編輯器

選擇Json配置文件夾
開啟14401_L.model3.json

背景 —> 禁用 (可生成去背PNG圖檔 , 可用來作其他後製)

渲染尺寸 —> 3000 x 4000

縮放 —> 人物全身要在窗口內

如果想要更大的圖
渲染尺寸數值可以改高一點
重點是人物全身要一定在窗口內
不然的話人物就會被切邊
按下快照鈕輸出PNG圖檔

可以使用Photoshop再做修圖切邊

Live2D/Spine編輯器
選擇Json配置文件夾
開啟14401_F_a.model3.json
重複上面步驟

Live2D文件輸出PNG大型去背圖檔 - python腳本切邊

因為Live2DViewerEX
EX工作室產生的PNG去背圖檔
上下左右有多餘的透明層
除了使用Photoshop切邊外
可以使用pytho腳本自動切邊

python 腳本
瀏覽子目錄下所有 *.png 圖檔
去除png圖檔上下左右多餘空白圖層
另存新檔重新命名為 *_trimmed.png

腳本和png圖檔放一起
運行png_trimmed.bat
自動運行png_trimmed.py
自動對png圖檔切邊

python腳本 + 未修改切邊的png圖檔

png_trimmed.rar (7.2 MB)

已切邊的png圖檔

png_trimmed2.rar (5.9 MB)

牛逼

必须删掉json的背景,不能背景人物一起正常显示吗?

去迷雾也可以在Live2DViewerEX工作室的制作liev2d的界面调网格的透明度,如图画红色圈的变量,把他透明度拉没就行

保存到文件里的话就是

先点击红圈的这个编辑json配置

然后选控制器,点网格透明度点上面的加号添加组,随便写个名字在ID组选三根横线加一个加号的图标,把hexie_1和hexie_2添加进去,把值设为0,就可以保存到.modle文件里了

Live2D動畫背景圖是否可套用分析

準備兩張全黃色的圖取代原本的圖
texture_00.png (2048 x 2048)
texture_01.png (2048 x 2048)

開啟 14401_F_a.moc3 模組後
可以看見實際顯示區域
點擊motions動作 , 身體還會動

所以可以確定背景圖不在Live2D模組內
texture_00.png 與 texture_01.png
換成其他圖也只是顯示同形狀的身影圖

背景圖為2400 x 1700
Live2D人物實際顯示區域明顯比這個還小

所以背景圖的樹葉搖擺動畫與下雨動畫
應該是使用Unity引擎自帶的Runtime Animator Controller
不是使用Live2D Runitme
合理懷疑是aelurum AssetStudio誤判輸出背景圖
json文件誤寫入背景圖

使用aelurum AssetStudio查看char_2d_14401.unity3d

可以看到人物加上背景原圖

可以看到人物差分表情圖

這個人物差分表情圖也是使用
Unity引擎自帶的Runtime Animator Controller
讓人物表情去做切換
因為AB包內沒看到Spine相關文件
所以不是使用Spine Runtime

如果是全部都是使用
Unity引擎自帶的Runtime Animator Controller
來呈現人物動畫的話
一樣會看到texture_00.png 與 texture_01.png 貼圖
但是看不到 Live2D相關文件

在創意工坊看過大佬做的動態桌面
他真的是把Unity引擎相關Runtime一起搬過來使用

星塔旅人運氣還不錯
至少人物使用Live2D
還可以解包出東西來讓你玩一玩
全部都Unity做的話
只能等熟Unity大佬來弄

UnityPyLive2DExtractor - 輸出 Live2D 的工具

分享一下另一個輸出 Live2D 的工具
UnityPyLive2DExtractor (最近更新 2025.09.27)

下載 UnityPyLive2DExtractor.exe

python 安裝模塊
pip install UnityPyLive2DExtractor

使用方式
CMD 命令 : UnityPyLive2DExtractor 輸入目錄名稱 輸出目錄名稱

範例
手動建立目錄 x 與 y
x 為輸入目錄
y 為輸出目錄
將S大提供的char_2d_14401.unity3d
放入輸入目錄 x 內
CMD 命令 : UnityPyLive2DExtractor x y
開始自動解包於 y 目錄生成 Live2D 文件

這Live2D解包工具的好處
(1)
不會像aelurum AssetStudio一樣
輸出的模組開啟後會產生圖片錯位現象
不需要手動改json檔和PNG圖檔重新命名
四個模型開啟都正常顯示
但背景圖片全部都沒有解包出來
所以這工具應該是判定背景圖非Live2D文件使用

(2)
不會像aelurum AssetStudio一樣
只輸出部份動作檔(motions)
不過這個Live2D解包工具輸出的動作檔
不會寫在model3.json裡
全部要手動添加 , 然後存檔更新model3.json
可以使用Cubism Viewer手動添加 , 存檔更新model3.json
可以使用Live2DViewerEX EX工作室手動添加 , 存檔更新model3.json

缺點
輸出的motions動作檔都混在一起
都放在Animation目錄內
你要手動一個一個去測試才知道
這個動作檔是不是給這個模組使用
在各模組目錄下新增motions目錄
將Animation目錄內的motions動作文件都複製一份過去
然後手動添加motions動作文件
一個一個點擊motions動作文件
查看Live2D人物的動畫 (看會動還是不會動)

缺點
但開啟moc3會有錯誤訊息就是了 (不影響顯示)
主要是 model3.json 文件的問題
可以使用Steam版 Live2DViewerEX —> EX工作室
重新生成 model3.json 文件
需要手動添加motions 動作文件 (還要建立分組)

所以目前解包Live2D的工具
很難找到100%正確輸出的
最後都是要手動調整、修改、添加

如果是這樣的話
各取其優點混合使用
如果你沒有Live2DViewerEX的話
(1)
使用UnityPyLive2DExtractor輸出Live2D文件
每個模組目錄都生成motions目錄 (如果沒有這目錄的話)
將Animation目錄內的motions動作文件都複製一份過去
使用Cubism Viewer手動添加motions動作檔 , 存檔更新model3.json

(2)
使用aelurum AssetStudio輸出model3.json文件
拿去給UnityPyLive2DExtractor輸出Live2D文件使用

你有Live2DViewerEX的話可以使用EX工作室手動添加

Live2DViewerEX - EX工作室手動添加文件生成model3.json

拿UnityPyLive2DExtractor輸出Live2D文件來測試
拿14401_F_a.moc3模組來測試

14401_F_a目錄下只有四個文件
\14401_F_a.moc3
\14401_F_a.model3.json
\Textures\texture_00.png
\Textures\texture_01.png

很精簡 : )
雖然有錯誤訊息
但Live2D還是可以正常顯示 (圖片不會錯位)

將Animation目錄內的motions動作文件都複製一份過來
目錄名改成motions

這邊你可以
使用Cubism Viewer手動添加motions動作檔 , 存檔更新model3.json
但這邊不這樣做 : )

先刪除14401_F_a.model3.json文件

開啟Live2DViewerEX - EX工作室

Live2D/Spine編輯器

選擇模型文件夾 (因為前面已將model3.json文件刪除)

點選右下角創建配置文件

文件名輸入 : 14401_F_a
兩個貼圖都點選 (texture_00.png & texture_01.png)
按下確認後自動生成 14401_F_a.model3.json

人物圖也窗口中顯示

編輯Json配置 —> 動作 —> 動作組 —> 建立分組 (使用預設Idle) —> 確認

右邊動作窗口一次性添加多了動作文件(motions) —> 勾選動作文件 —> 確認

點擊右下角保存鈕 14401_F_a.model3.json 存檔 (查看後已寫入新資料)

開啟14401_F_a.moc3 (不會出現錯誤訊息) , 可以看到動作文件(motions) 已在清單內

點擊動作文件看看角色會不會動
這是Idle的部分 , 其他類別動作文件一樣的添加方式
如果懶得分類的話 , 通通放在一起也是可以 : )

1 个赞

:grinning_face: ok

这个本质上是因为导出时Textures内默认排序将“texture_00”和“texture_01”等放到了后面

只需将json内部的顺序更改即可正确展示

新用户传不了附件,代码贴这里,原理很简单,读取原json,对FileReferences/Textures重新分组排序保存就行,本机测试正常

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Sanya.File_Manager;

namespace Live2DJsonRepair
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //获取工作路径
            string path = ProjectConstManager.AppFilePath;
            if (args.Length == 1) 
            {
                path = args[0];
            }

            //获取所有拓展名为.model3.json的文件
            var list = FilesConfigs_Manager.GetAllFilePath(path, "*.model3.json");
            foreach (var filePath in list)
            {
                Console.WriteLine(filePath);
                string json = Text_Manager.LoadALLTxt(filePath);
                JObject jsonObj = JObject.Parse(json);
                JArray jArray = (JArray)jsonObj["FileReferences"]["Textures"];


                // 分组排序
                var texturesGroup = jArray
                    .Where(x => x.ToString().StartsWith("textures/texture_"))
                    .OrderBy(x => x.ToString())
                    .ToList();

                var otherGroup = jArray
                    .Where(x => !x.ToString().StartsWith("textures/texture_"))
                    .OrderBy(x => x.ToString())
                    .ToList();

                //合并,texture_开头为先
                var sortedArray = new JArray();
                sortedArray.Merge(new JArray(texturesGroup));
                sortedArray.Merge(new JArray(otherGroup));
                jsonObj["FileReferences"]["Textures"] = sortedArray;

                string newJson = jsonObj.ToString();

                //Console.WriteLine(jArray.Count());
                Text_Manager.WriteTextFile(filePath, newJson);
            }
            Console.WriteLine("Over");
            Console.ReadKey();
        }
    }
}