表情

「表情」(Expressions),是在 VRChat 中的角色(Avatar)功能之一,其由用戶自訂的選單所組成,可讓用戶在角色上啟用各種動作或切換功能,旨在以靈活且方便的方式快速存取角色的獨特功能。
更多資訊請參閱關於角色的創作者文件。
表情選單
遊戲內的表情選單,可透過動作選單(Action Menu)存取,也可透過快速選單(Quick Menu)與主選單(Main Menu)中的表情標籤頁存取。這種操作方式適用於所有平台的 VRChat。角色表情的變化會同步給同一平台上的其他用戶,並可設定跨平臺同步。
SDK 中的表情
表情功能可透過 VRChat SDK 中的各種參數進行編輯。
基礎表情
當未設定任何表情功能時,系統會自動為角色加入包含基礎動畫的預設表情選單,其中包含以下動畫:
- 揮手(Wave)
- 鼓掌(Clap)
- 指向(Point)
- 歡呼(Cheer)
- 跳舞(Dance)
- 後空翻(Backflip)
- 死亡(Die)
- 悲傷(Sadness)
自訂表情
若要新增自訂表情,請先在 Unity 中建立 Expression Menu(表情選單)資產與 Expression Parameters(表情參數)資產,然後在 VRChat Avatar Descriptor 的 Expressions 區段中指派這些資產。Expression Menu 用於定義哪些控制項會顯示於遊戲內選單,而 Expression Parameters 則用於定義這些控制項所變更之數值的名稱、類型、預設值,以及同步行為。
每個自訂參數都可以設定是否 Saved(儲存)及 Synced(同步)。已同步的自訂參數會計入角色的 256 位元同步預算,而單一角色最多可定義 8192 個自訂參數。此資產中的參數也可以由 Contact Receiver、Parameter Driver、PhysBone 以及 OSC 進行變更。
SDK 也提供了一個 Default Parameters(預設參數)按鈕。按鈕會還原 VRChat 預設 AV3 控制器所使用的三個別名參數:VRCEmote、VRCFaceBlendH 與 VRCFaceBlendV。
控制
每個頁面最多可建立 8 個控制項。建立控制項時,可選擇以下類型:
- Button(按鈕):按下時瞬間設定指定數值,並在 VRChat 傳送變更後立即自動重設。
- Toggle(切換):啟用時設定指定數值,停用時則重設該數值。
- Sub Menu(子選單):下設另一個表情選單,並可選擇在該子選單開啟期間設定特定參數。
- Two Axis Puppet(雙軸控制):透過水平與垂直輸入控制兩個浮點數參數,通常範圍為
-1.0至1.0。 - Four Axis Puppet(四軸控制):控制四個浮點數參數,分別對應四個方向,通常範圍為
0.0至1.0。 - Radial Puppet(環形控制):以環狀滑塊控制一個浮點數參數,範圍為
0.0至1.0。
控制選單範例

當你向不同方向移動搖桿、觸控板或滑鼠時,將會改變其動畫參數,以此來表現不同表情,或在不同表情之間進行混合(例如「開心」與「驚訝」)。任何參數都可以透過此選單進行控制。
你可以在任一隻手上開啟一個選單(或同時在兩隻手上開啟)。預設情況下,可透過快速撥動來選擇選項;你也可以在動作選單設定中改為使用扳機鍵進行選擇。若要返回表情選單的上一層,請按下扳機鍵。
當屬於控制類型的控制項被開啟時,VRChat 會使用較快速的 IK 同步模式即時同步其數值。控制項關閉後,當前數值會維持不變,直到再次被修改為止。
表情參數
表情參數(Expression Parameters)可透過表情選單、Contact Receiver、OSC、Parameter Driver 或 PhysBone 元件來控制角色功能。這些參數接著會對應至角色 FX、手勢(Gesture)或動作控制器中的 Animator Controller 參數。
設定
Expression Parameters 資產中的每個項目都會儲存以下資訊:
- Name(名稱):必須與 Animator 參數名稱完全一致。
- Type(類型):可為
Bool、Int或Float。 - Default(預設):當角色重設時的預設值。
- Saved(儲存):控制該數值是否會在不同工作階段之間保留。
- Synced(同步):控制該數值是否會傳送給其他用戶。
預設情況下,自訂參數會使用 VRChat 的 Playable 同步模式進行同步。當控制類型的控制項處於被開啟狀態時,則會暫時改用較快速的 IK 同步模式。
內建參數
VRChat 也提供內建的 Animator 參數。這些參數不需要額外加入 Expression Parameters 資產中,且不會計入自訂參數的預算限制。
內建參數處於唯讀模式,無法由用戶任意修改。要觸發內建參數,只需在 Playable Layer(可播放層)的 Animator Controller 中使用對應名稱建立參數,VRChat 便會在執行期間自動更新其數值。這些參數不會被設定到子 Animator(Sub-Animator)上,而只會設定於 Playable Layer 的 Animator。
其他內建參數包括:
Viseme(Int):由唇形同步(Lip Sync)控制,數值範圍從0(靜音)到14(母音「u」)。當 Avatar Descriptor 的 Lip Sync 設定為 Viseme Blend Shape 或 Viseme Parameter Only 時啟用。Voice(Float):感知到的麥克風音量,範圍從0.0到1.0,會受到距離及音罩(Earmuffs)設定影響。VelocityX、VelocityY、VelocityZ、VelocityMagnitude(Float):沿各軸向及總體的移動速度(單位為公尺 / 秒)。本地端不會計算遊玩空間移動,而遠端則會計算。Upright(Float):趴臥時為0,站立時為1。Grounded(Bool):表示用戶是否接觸地面。MuteSelf(Bool):表示用戶是否已將自己的麥克風靜音。Earmuffs(Bool):表示用戶是否已啟用耳罩功能。IsOnFriendsList(Bool):表示檢視者是否為角色穿戴者的好友(在本地端永遠顯示為 False)。ScaleFactor、ScaleFactorInverse、EyeHeightAsMeters、EyeHeightAsPercent(Float):與角色縮放相關的參數。由於EyeHeightAsMeters為線性數值,且不受上傳時身高影響,因此建議用於需要感知角色尺寸的系統。
每個內建參數都有其對應的同步類型,用來決定何時將數值傳送給遠端用戶:
- IK:用於由追蹤資料衍生的數值,例如手勢、移動速度及是否接觸地面等。
- Speech:用於與語音相關的數值,例如唇形同步及語音音量。
- Playable:用於表示用戶狀態的數值,例如麥克風靜音、音罩、追蹤類型及角色縮放等。
- None:用於僅限本地端使用的數值,例如
IsLocal與PreviewMode。
網路同步
只有已被同步的表情參數以及部分內建參數會透過網路傳送。每個角色所同步的完整資料包括:
- IK 目標:包含頭部、下顎與雙手的位置資料;桌面模式與三點追蹤皆會同步這些資料。全身追蹤則額外同步臀部與雙腳的位置資料。使用 Index 控制器的用戶還會同步手指位置。
- 已同步的表情參數:只有標記為 Synced 的參數會被傳送。數值會經過量化處理:Int 類型以 0 至 255 的範圍同步;Float 類型以 −1 至 1 之間、每 1/127 為單位的數值同步;Bool 類型則同步為 true 或 false。
- 內建 VRC 參數:包括手勢、移動速度、語音以及其他執行期間參數。
- PhysBones:姿勢位置資料會傳送給稍後加入房間的用戶。
為了確保後加入房間的用戶也能正確看到角色狀態,建議採用以 IsLocal 參數分離 Animator 邏輯的設計模式:本地端(IsLocal = True)圖層負責處理 Contact、Parameter Driver 以及所有邏輯運算,並將結果寫入已同步參數;遠端(IsLocal = False)圖層則只讀取這些已同步參數,並根據其值播放正確的視覺表現。這種做法可避免依賴不會同步的本地事件或邏輯,同時確保後加入房間的用戶能夠正確還原並顯示角色目前的狀態。
手勢與臉部表情
內建的 GestureLeft 與 GestureRight 參數用於識別用戶的手勢,而 GestureLeftWeight 與 GestureRightWeight 則提供類比扳機鍵的按壓程度。在 Humanoid 角色上,Gesture Playable Layer(手勢可播放層)通常用於控制手勢,而臉部表情則通常透過 FX 圖層中的 Blendshape、材質屬性或其他非 Humanoid 動畫來驅動。
在具備手指追蹤功能的控制器上,由於手指追蹤預設會覆蓋動畫的效果,因此創作者可使用 Tracking Control 狀態行為(State Behavior),在需要時將相關手指的控制方式由 Tracking(追蹤)切換為 Animation(動畫)模式。
表情參數不相符
表情參數不相符(Expression Parameter Mismatching)是指當表情參數與本機動畫控制(Animator Controller)參數之間使用不同的參數類型。雖然建議保持參數類型一致,但系統仍支援類型不相符的設定,並會依照特定規則在不同類型之間自動轉換數值。這種做法在某些 Advanced 配置中可能相當實用。同樣的轉換機制也適用於 VRChat 內建的動畫參數。
Unity 的 Animator 系統在底層實際上使用 Float 來處理所有參數類型,而 VRChat 則會將已同步的自訂表情參數儲存為更精簡、適合網路傳輸的格式。Unity 與 VRCSDK 的使用者介面允許創作者為了方便而選擇不同的參數類型,但在底層仍可進行數值轉換。這代表參數並非以 C# 意義上的型別轉換方式運作,而是在不同系統之間以不相符的參數類型進行對應。這種行為也受到熱門工具如 Av3Emulator 與 Gesture Manager 的支援。
表情參數 Bool
| 類型 | Expression Bool = False | Expression Bool = True |
|---|---|---|
| Bool → Bool | Bool = False | Bool = True |
| Bool → Int | Int = 0 | Int = 1 |
| Bool → Float | Float = 0.0 | Float = 1.0 |
表情參數 Int
| 類型 | 行為 |
|---|---|
| Int → Bool | 任何不為 0 的 Int 值都會將 Bool 設為 True。 |
| Int → Int | 預期行為 |
| Int → Float | 直接轉換:例如 Int = 2 → Float = 2.0 |
表情參數 Float
| 類型 | 行為 |
|---|---|
| Float → Bool | 任何不為 0 的 Float 值都會將 Bool 設為 True |
| Float → Int | 四捨五入轉換:≥ 0.5 → 1;< 0.5 → 0 |
| Float → Float | 預期行為 |
官方資源
- 發布在 VRChat 上的 Avatar 3.0 Hub 世界。
- 發布在 VRChat 創作者文件上的表情選單與控制。
- 發布在 VRChat 創作者文件上的動作選單 - 表情選單。
- 發布在 VRChat 創作者文件上的表情參數。
- 發布在 VRChat 創作者文件上的 Playable Layers。
- 發布在 VRChat 創作者文件上的狀態行為。
參見