了解LIVE2D在unity的使用--前提記錄
了解各個組件的作用
Live2D Manuals & Tutorials
這些文件都是重要的控制動畫參數的
Cubism Editor是編輯Live2D的工具,而導出的數據的類型,需要滿足以上的條件
SDK中包含的Cubism的Importer會自動生成一個Prefab。
這個生成的Prefab是轉換為Unity可以處理Live2D模型的版本。
可以從Hierarchy視圖中操作參數和部件的顯示。
了解一下Live2D的制作流程
1立繪分層_嗶哩嗶哩_bilibili
可以設置陰影、透明度、將人物分為多個部分部分,每個部分都可以有自己的變化曲線
達成最終的呈現效果,所以在Unity調動2D模型的時候,這些很多的變化要如何規范,這是一個盲區
旋轉變形器? 曲面? 父子集? 流暢度(帶動周圍格子變形)
透明度設置為0,需要切換發型則將新發型設置為1,原來的設置為0
可以整體依然用同一套物理
制作過程中也會存在分文件夾制作
對單個頭發的部件控制
這樣看,SDK的作用確實很重要了,把這些本來規定在Editor里的規則,搬運到unity里得到控制
頭部的移動,但頭發作為子物體,通過調整,達到保持了重力的垂直效果
眼部的閉合也是通過一個0~1的參數就可以控制變化
睫毛作為部件被變化曲線連帶
閉眼不失去高光點
微笑,左右眼開閉,以及閉眼變成微笑融合的情況
這么復雜的變化,unity不能在自己的引擎里控制每一個部分的參數變化
所以需要外部提供變化的規則文件,就像給出多個int? ,每個int 只能控制一個范圍的變化,但湊起來可以達到在Editor里展現的效果
加速度,scale變化,xy的位置綁定,轉換到具體的每一個unity物體
連帶的曲面等等,則通過額外的連動計算腳本控制
頭部的轉向控制,xy控制,z控制大小
圖片只需要一張就可以,其余的都是Editor下的對圖片的各種物理變化
輕微的拉伸是合理的,并不會造成視覺上的怪異
里面也會有噴槍等額外添加的圖片層,可能是貼在原圖上,可能是新建資源,
但在unity里,如果是前者無變化,是后者則變化較大,
會涉及到新圖的放置問題(但Editor也可以轉換成參數控制顯隱,以及像轉動頭部一樣的xy控制,最后的模型的處理規則傳遞到SDK里,應該不會有什么變化)
最后的呈現效果真的很驚人,,資源是僅僅一個圖集,但最后呈現的效果非常廣,好強,,
每個部件的變化都有自己的 參數可以提供輸出,,
每個部件也可以接受別的部件的輸出 影響自身部件的變化倍率,變化幅度等等
9導出和按鍵表情包_嗶哩嗶哩_bilibili
最后一課導出,
每一個表情,衣服的透明度都單獨調整為1,之前的設置為0,然后導出一個文件
每次都導出,每一個透明度替換狀態對應一個按鈕,就可以在電腦鍵盤上對應切換狀態
---------------
回到unity控制Live2D
在Unity項目模型上 播放從Cubism Editor 輸出的嵌入動畫文件
.motion3.json在載入時會自動轉變為Unity的動畫格式AnimationClip
從Cubism Editor輸出的嵌入動態文件連同包含它的文件夾拖放到Project視圖中
經過該操作,AnimationClip將從.motion3.json生成、、也可以為生成的AnimationClip設置Loop
AnimationClip以曲線的形式擁有設置為模型各參數的值,此曲線上設置的參數的屬性位于模型Prefab以下層次結構中。
Cubism Part 控制 Opacity透明度
Cubism Parameters則是 控制變化的參數
指定這些屬性,則可以使用在Unity上創建的AnimationClip或程序
操作模型的參數和部件的不透明度
Cubism的 動畫格式在 載入項目時會轉變為AnimationClip,所以可以使用Animator管理 過渡和混合多個動態
在運行時導入模型 | SDK 教程 | Live2D Manuals & Tutorials
在3.0或更高版本中,處理已經完全重新設計,使用CusbimModel3Json.LoadAtPath導入模型后,調用.ToModel()即可顯示模型。
另外,創建并顯示Prefab,無需從腳本中編寫.update()或.draw()的更新繪制,繪制也會更新。
自己用c#腳本實現對導入模型的“轉unity”
在運行時導入模型 | SDK 教程 | Live2D Manuals & Tutorials
這一塊附近的內容都相對關鍵一些,先找找現在有沒有更簡單的工具可以幫我實現,但我還沒找過,關于這些復雜的控制先暫時停下
---
回到制作層面,現在可以接入Deepseek的API來回答出問題了
(這里是future,,還是打算用GPT的API了,)
完成了對話的內容,接下來需要達到的效果是什么樣的:
Live2D只是交互的方式,是說話或Idle 的時候可以表現出的動畫控制
接下來可以填入什么進去?
1.語音模型,達到朗讀發音
....
---
再次回到對Live2D的模型unity里進行控制
Live2D Cubism 模型有 多個參數 用來控制 表情、動作、變形。常見參數:
參數名 | 功能 |
---|---|
ParamAngleX | 頭部左右旋轉 |
ParamAngleY | 頭部上下旋轉 |
ParamAngleZ | 頭部歪斜(傾斜) |
ParamEyeLOpen | 左眼開合(0=閉眼, 1=睜眼) |
ParamEyeROpen | 右眼開合 |
ParamEyeBallX | 眼球左右移動 |
ParamEyeBallY | 眼球上下移動 |
ParamMouthOpenY | 嘴巴開合(0=閉嘴, 1=張嘴) |
ParamMouthForm | 嘴型(-1=悲傷, 1=笑) |
ParamBodyAngleX | 身體左右旋轉 |
ParamBodyAngleY | 身體上下移動 |
簡單測試
public class Live2DControl : MonoBehaviour
{private CubismModel model; // Live2D 模型void Start(){model = GetComponent<CubismModel>(); // 獲取模型組件}
}打印所有參數
void Start()
{model = GetComponent<CubismModel>();foreach (var param in model.Parameters){Debug.Log("參數名: " + param.Id + ",當前值: " + param.Value);}
}
52個參數,這個還算是簡單的模型
.要做到可以控制各個參數,像虛擬主播一樣:
EyeBlink | Cubism SDK 手冊 | Live2D Manuals & Tutorials
---
CubismEyeBlinkController.Refresh()
CubismEyeBlinkController.EyeOpening
可以通過操作CubismEyeBlinkController.EyeOpening的值,將值應用于眨眼的參數
CubismEyeBlinkController在每幀的LateUpdate()時機
將CubismEyeBlinkController.EyeOpening的值應用于CubismEyeBlinkParameter標記的參數
Cubism SDK for Unity中,各組件的執行順序由CubismUpdateController控制
---
剛才直接去看了Sample自帶的場景,發現了一些可以直接引用的組件,達到實現追蹤的效果
target就是掛載的游戲對象,會整體跟隨移動
那大致要怎么控制的框架就有了
大致框架理解之后,Sample里的例子就很容易知道重點在哪一部分了
lookAt的動畫變化,并不是由unity的animator控制的,此時掛在模型上的animator是空的
導入進來的Live2D模型實際上和 unity里的Motion調整動作沒有關系,,或者說在導入之前,Editor里就已經把物理規則定的很標準,是不允許在unity里亂調不暴露出來的重要參數的
這些各種Controller就是整理好的,可以在unity中暴露被修改的部分
unity才是扒拉人家模型,強行想用到自己的引擎里,但Editor對這方面的規定比較完善和硬核,所以unity能改的地方并不多,
狀態機可以做的,是安排各種條件,對應各種動作表情(這些也是Editor規定好的,不會為了unity bro去額外改什么規則),這樣就可以把效果的控制全轉移到C#的代碼邏輯上了
?這些動作也和狀態機沒有一點關系
但是參數的修改有時候在unity上沒有很及時的同步,不知道是不是適配原因
這些動作的切換是Motion Controller控制的,但是layer count沒有很及時的變換(unity也是夠卑微 )
Fade Controller,應該就是動作之間切換的時候,透明度逐漸調為0的過程
所以需要list確保淡去哪個,顯示哪個
這個動畫就運用了狀態機,讓他自己切換播放
可以確定了,Live2D在unity里就是不能通過Animation播放這些動作的
但是Animation里的 Clip文件,對每個參數的變化的都是有記錄的,這些內部參數又是不會暴露給unity的,所以無法通過Animation窗口查看,
但可以在Game窗口里,當狀態切換的時候,會把對應的動作調用出來得到展示
每個狀態上也掛了對應的觀察腳本(應該是控制透明度切換,更換新的動作),并沒有把控制權交給unity
進這個腳本里大致看看結構,也可以差不多的感覺到對切換的監控和準備切換為新狀態
Cubism的射線檢測
一個測試腳本,拖入模型之后,就可以檢測到碰撞(也是Sample樣本里的)
--------
animator又在一些時候有用,,
OW(Original Workflow,原始工作流)是 Live2D Cubism SDK for Unity 中的一部分,它提供了一系列 組件 和 腳本,用于管理 Live2D 模型的參數、動作、表情、姿勢,讓開發者可以通過 代碼 輕松控制 Live2D 模型的各種表現。
你理解得 基本正確——OW 主要是 暴露出可以操作的參數,讓開發者可以通過 C# 修改參數 以控制 Live2D 角色的各種行為,比如 表情、動作、姿勢、過渡效果。
OW(Original Workflow)目錄下的文件 主要包含以下功能:
文件 作用 CubismParameterStore
存儲參數值,可用于保存和恢復 Live2D 模型狀態 CubismUpdateController
管理參數更新,確保模型的參數隨時間變化 Expression
管理表情(類似 happy.face3.json
這樣的表情文件)Motion
管理動作(如 Idle.motion3.json
等)MotionFade
處理動畫淡入淡出,讓不同的動畫過渡更自然 Pose
管理 Live2D 角色的姿勢,用于防止角色姿勢不自然
Expression | Cubism SDK 手冊 | Live2D Manuals & Tutorials
Expression的文件創建,使用到Live2D上
下載了模型之后,檢查有沒有生成.asset文件(unity形式的expression和motion文件,下方的文本是json文件,是Cubism Editor 里做好的原始文件,unity并不能控制)
了解各個系統在unity中的使用之前,首先要清楚,unity在Live2D模型的控制力是很卑微的(在以后學習到別的資源引用的時候應該也會這樣),
Editor做好的模型都在SDK里幾乎自己解決了,給unity也不想unity亂用,所以暴露出來的可控區域很少,基本上OW文檔里面說了什么,就只能用這些
Live2D 表情系統(Expression)
1. Expression
Live2D Expression 負責 控制表情,主要用于 眨眼、微笑、皺眉、驚訝 等 短時間的動態變化。
- 通過
.exp3.json
文件定義表情參數(類似于“開心”、“驚訝”)。 - 通過
CubismExpressionController
播放表情。 - 通過 加算(Additive)、覆蓋(Override)、正片疊底(Multiply) 計算表情對參數的影響。
- Unity 的 Animator 沒有“正片疊底”功能,所以需要 Expression 系統 處理表情混合。
2. 使用前提
在 Unity 里使用 Expression(表情系統) 之前,需要確保:
- Live2D 預制體(Prefab)已經包含:---SDK has done commonly
CubismUpdateController
CubismParameterStore
- 有表情文件(.exp3.json):
- 需要從 Live2D Editor 導出,并轉換成 Unity 可用的
.exp3.asset
文件。
- 需要從 Live2D Editor 導出,并轉換成 Unity 可用的
- 表情列表(.expressionList.asset):
- 管理多個表情,類似于“表情索引”。
3. 完整流程
1. 創建 .exp3.asset
(表情數據)---SDK has done commonly
.exp3.asset
是 .exp3.json
的 ScriptableObject 版本,用于存儲解析后的表情信息。
- 解析
.exp3.json
,轉換為CubismExpressionData
- 創建
.exp3.asset
- 不要手動修改
.exp3.asset
,否則可能導致異常。
代碼示例
// 解析 .exp3.json 并創建 .exp3.asset
expressionData = CubismExpressionData.CreateInstance(ExpressionJson);
AssetDatabase.CreateAsset(expressionData, AssetPath.Replace(".exp3.json", ".exp3.asset"));// 更新 Unity 資源庫
EditorUtility.SetDirty(expressionData);
?2. 創建 .expressionList.asset
(表情列表)---SDK has done commonly
.expressionList.asset
是 管理表情 .exp3.asset
的列表。
- 這個文件 記錄了當前模型支持的所有表情。
- 使用
CubismExpressionController
通過 索引(CurrentExpressionIndex) 選擇要播放的表情。
代碼示例
// 獲取現有的表情列表
var expressionList = AssetDatabase.LoadAssetAtPath<CubismExpressionList>(expressionListPath);// 如果不存在,創建新資產
AssetDatabase.CreateAsset(expressionList, expressionListPath);// 更新 Unity 資源
EditorUtility.SetDirty(expressionList);
?3. 追加 .exp3.asset
到 .expressionList.asset
---SDK has done commonly
每個模型的 .expressionList.asset
都需要綁定 .exp3.asset
(表情數據)。
代碼示例
// 追加新的 .exp3.asset
expressionIndex = expressionList.CubismExpressionObjects.Length;
Array.Resize(ref expressionList.CubismExpressionObjects, expressionIndex + 1);
expressionList.CubismExpressionObjects[expressionIndex] = expressionData;// 更新 Unity 資源庫
EditorUtility.SetDirty(expressionList);
?4. 通過 CubismExpressionController
播放表情
在 Unity 運行時,可以通過 CubismExpressionController.CurrentExpressionIndex
切換表情。
代碼示例
using Live2D.Cubism.Framework.Expression;
using UnityEngine;public class ExpressionController : MonoBehaviour
{private CubismExpressionController expressionController;void Start(){expressionController = GetComponent<CubismExpressionController>();}void Update(){if (Input.GetKeyDown(KeyCode.H)){expressionController.CurrentExpressionIndex = 0; // 播放第一個表情}if (Input.GetKeyDown(KeyCode.S)){expressionController.CurrentExpressionIndex = 1; // 播放第二個表情}}
}
🔹 說明
CurrentExpressionIndex = 0
→ 切換到happy.exp3.asset
CurrentExpressionIndex = 1
→ 切換到sad.exp3.asset
- 必須 綁定
CubismExpressionController
組件。
?5. 讓表情有“淡入淡出”效果
每個表情有:
FadeInTime
(淡入時間)FadeOutTime
(淡出時間)
在 切換表情時,應該 設置上一個表情的 ExpressionEndTime
,讓它正確淡出。
代碼示例
// 讓上一個表情淡出
if (_playingExpressions.Count > 0)
{var playingExpression = _playingExpressions[_playingExpressions.Count - 1];playingExpression.ExpressionEndTime = playingExpression.ExpressionUserTime + playingExpression.FadeOutTime;_playingExpressions[_playingExpressions.Count - 1] = playingExpression;
}
🔹 這個代碼會 自動計算表情的過渡時間,讓表情更流暢。
?6. 計算表情并應用
表情在每幀更新時,系統會計算新表情的值,并應用到 CubismParameter
里。
- 表情數據結構
字段 作用 Type
.exp3.json
類型FadeInTime
表情淡入時間 FadeOutTime
表情淡出時間 Weight
影響權重(0 ~ 1) ExpressionUserTime
播放時間 ExpressionEndTime
退出時間 Destinations
影響的 Live2D 參數 Value
表情應用到參數的值 Blend
計算方式(Override、Additive、Multiply)
Live2D SDK 通過 CubismExpressionController.OnLateUpdate()
計算表情參數的最終值。
必須在 ParameterStore.SaveParameters()
之后應用表情,否則會導致參數錯誤。
測試表情的代碼
using Live2D.Cubism.Framework.Expression;
using UnityEngine;public class ExpressionController : MonoBehaviour
{private CubismExpressionController expressionController;void Start(){expressionController = GetComponent<CubismExpressionController>();}void Update(){if (Input.GetKeyDown(KeyCode.E)){expressionController.CurrentExpressionIndex++;if (expressionController.CurrentExpressionIndex >= expressionController.ExpressionsList.CubismExpressionObjects.Length){expressionController.CurrentExpressionIndex = -1;}Debug.Log(expressionController.CurrentExpressionIndex);}}
}
模型的Render錯位
模型導入到LIVE2D場景之后,會出現這樣的問題,因為Editor里的圖層順序安排,在unity里并不適用,要在RenderController里設置后-前 Order,這樣部件的排序(大概率是SDK做的Order)就可以改掉unity的展示問題
功能實現記錄
梳理一下自己的需求,視線追蹤要實現,自由切換表情,,,(這個可能還要結合一下語音內容什么的,已經有動作了,表情要怎么處理,,,這個還得考慮)
--------------
AnimationClip以曲線的形式擁有設置為模型各參數的值,此曲線上設置的參數的屬性位于模型Prefab以下層次結構中。(Value在Inspector中隱藏)
[模型根]/Parameters/[參數ID]/Cubism Parameters/Value
----
SDK會帶來自己的狀態機文件,和動畫clip
這些clip都是json轉出來的適用于unity的動作控制
clip動畫和對模型的控制的其他組件功能是分開的,不會產生重疊的問題
通過使用Motion,您可以從腳本播放動畫,而無需使用Unity的Mecanim構建狀態機
要使用Motion,您需要CubismFadeController組件和Unity的Animator。
如果在Animator組件中設置AnimatorController,則不會播放Motion,而是播放AnimatorController的動畫
但加上也是可以的,只不過和Clip的動畫會有一些出入,比如覆蓋clip里規定 的各個參數變化,眼睛一直保持某個狀態不變等
加于不加并不沖突
太多類型如果都去記,就很消耗時間,var這個類型前綴,用的很多是有原因的
注意,Center是target 對象身上的中心,是可以不拖的,默認就把target物體的中心做中心來計算
(因為是鼠標,所以可能這個地方的lookAt功能并不是很能體現出Center的位置重要性)?
參數中,將名為CubismLookParameter的組件附加到希望跟蹤的gameobject
最后,準備要跟蹤的對象。
在CubismLookController組件的[Target]中,設置實裝[ICubismLookTarget]接口的組件。
加look parameter組件一定要加載對應的gameobject上
視線追蹤和點擊頭、身體的隨機動畫是做好了
----
關于這個自動眨眼,一些模型會自帶的做上去,附加上Controller
mao這個模型就附帶了,也不用加auto blink input了
-----
口形同步設置
關于blend mode,大多默認是multiply,這樣就是如果有別的部分在操作參數,自己則不使用參數
additive就是附加,“正片疊底”
override就是完全控制該blend下的全部參數
MouthMovement包含作為輸入范例,根據AudioSource的音量和Sin波操作嘴巴開合值的組件。
此次附加一個名為?CubismAudioMouthInput?的組件,以便您可以從AudioSource設置值。
?Sampling Quality:設置要采樣的音量的精度。設置的階數越低,精度越高,計算負載越大。
Gain:設置以多少倍的值處理采樣音量。1為等倍
?Smoothing:設置從音量計算的開/關值平滑化多少。值越高,則越平滑,但也會增加計算負載
最后,要獲取音量,將AudioSource拖入 CubismAudioMouthInput的Audio Input?
-----
最后,就是接入語音模型了,也是不怎么了解的領域,先了解一下吧