VRChat Avatar Transfer 変換内容
VRChatAvatarTransfer がVRChat用アバターのプレファブに対して行う変換の一覧です。
VRChat Avatarを使用する で Convert ボタンを押したときに、内部で何が起きているかをまとめています。
変換の全体像
Tools > VRChat Avatar Transfer > Transfer で開いた VRChat Avatar Transfer ウインドウに変換したいプレファブをドラッグします。このプレファブは変更されません。
- VRChat の揺れもの (PhysBone) を VRM10 SpringBone に変換
- VRChat の Constraint コンポーネントを Unity 標準の Constraint に変換
VRCAvatarDescriptorの FX レイヤーの AnimatorController を複製してルートのAnimatorに適用- 複製した FX 内の
VRCAvatarParameterDriverをAvatarParameterDriverに置換 - 複製した FX 内の
VRCAnimatorTrackingControlをAvatarAnimatorTrackingControlに置換
- 複製した FX 内の
- アバターのタイプに応じてルートにコンポーネントを追加
- VRCFT v2 互換アバター (FX に
FT/v2/パラメータがある) →VRCFTAvatarを追加 - それ以外 →
VRCAvatarを追加し、Viseme リップシンク / 瞬き / Expressions メニューを移植
- VRCFT v2 互換アバター (FX に
- VRChat 専用コンポーネント (
VRCAvatarDescriptor,PipelineManager) と Missing Script を削除
1. PhysBone → VRM10 SpringBone
| 変換元 (VRChat) | 変換先 (VRM10) |
|---|---|
VRCPhysBone | VRM10SpringBoneJoint (チェーン上の各ボーンに付与) |
VRCPhysBoneCollider | VRM10SpringBoneCollider |
| (なし) | ルートに Vrm10Instance を追加し、SpringBone の Springs / ColliderGroups に登録 |
主な特徴:
- 末端ジョイントは VRM10 SpringBone のシミュレーション範囲外になるため、末端の子に
<bone名>_endという Transform を生成して tail として登録します。 - 分岐のあるボーン構造にも対応します。分岐点は親チェーンの末端ジョイントとして含まれ、各子は新しい Spring の先頭から始まります。
- コライダーは
Vrm10Instance直下のColliderGroupGameObject にまとめて配置します。 Vrm10Instance.UpdateTypeはUpdateに設定されます (LateUpdateだとアニメーション後に 1 フレーム遅れて反映されるため)。
制限事項
- コライダー:
Plane形状でinsideBounds=trueのものは VRM10 SpringBone に対応する型がないためスキップされます。 immobile: VRM10 SpringBone に相当する概念がないため無視されます。- VRC
stiffness(Advanced): 上記マッピングには含まれません。
2. VRC Constraint → Unity Constraint
| 変換元 (VRChat) | 変換先 (Unity 標準) |
|---|---|
VRCParentConstraint | ParentConstraint |
VRCPositionConstraint | PositionConstraint |
VRCRotationConstraint | RotationConstraint |
VRCScaleConstraint | ScaleConstraint |
VRCAimConstraint | AimConstraint |
VRCLookAtConstraint | LookAtConstraint |
weight / constraintActive / locked および Source の transform と weight、各軸の影響有無 (AffectsPositionX など)、*AtRest / *Offset、Aim 系の aimVector / upVector / worldUpType などは可能な範囲でそのまま引き継がれます。
制限事項
FreezeToWorld: Unity Constraint に相当機能がないためスキップされます。TargetTransformが自身以外: Unity Constraint は常に自分自身を制御するためスキップされます。
3. FX AnimatorController の適用
VRCAvatarDescriptor.baseAnimationLayers から FX レイヤーを探し、設定されている AnimatorController を出力先フォルダに複製した上で、ルートの Animator.runtimeAnimatorController に設定します。元の FX コントローラのアセットは変更されません。
これにより、VRChat 上で動いていた表情やトグル系のアニメーションを VirgoMotionStudio 側からも再生できるようになります。
FX レイヤーが空の場合は何も適用されません。ルートに Animator が無い場合も適用はスキップされます。
複製した FX コントローラは出力フォルダに <アバター名>.FX.controller として保存されます。
3-1. VRCAvatarParameterDriver → AvatarParameterDriver
複製した FX コントローラの各 State / StateMachine に付与されている VRCAvatarParameterDriver (StateMachineBehaviour) を、VRChat SDK に依存しない AvatarParameterDriver に置換します。
Set/Add/Random/Copyの各ChangeTypeをそのまま引き継ぎます。value/valueMin/valueMax/chance/sourceMin/sourceMax/destMin/destMax/convertRangeなどのパラメータも同じ意味で複製されます。localOnlyフィールドは互換のため値だけ保持されますが、本パッケージにはネットワーク同期の概念がないため常に適用されます。CopyのconvertRangeがtrueの場合は[sourceMin, sourceMax]を[destMin, destMax]に線形マッピングします。OnStateEnterのタイミングでパラメータが反映されるため、VRChat と同じ発火タイミングになります。
3-2. VRCAnimatorTrackingControl → AvatarAnimatorTrackingControl
同じく State / StateMachine 上の VRCAnimatorTrackingControl を AvatarAnimatorTrackingControl に置換します。
| 引き継がれる部位 |
|---|
trackingHead / trackingHip |
trackingLeftHand / trackingRightHand |
trackingLeftFoot / trackingRightFoot |
trackingLeftFingers / trackingRightFingers |
trackingEyes / trackingMouth |
各部位の TrackingType (NoChange / Tracking / Animation) はそのままマッピングされます。
4. アバターコンポーネントの追加
複製済み FX コントローラの Animator パラメータを調べ、アバターのタイプに応じてルートに追加するコンポーネントを切り替えます。
4-1. VRCFT v2 互換アバターの判定
FX コントローラのパラメータ名に FT/v2/ で始まるものが 1 つでも存在する場合、Adjerry91 の VRC Face Tracking Template v2 を使用したアバターと判定します。
- VRCFT v2 互換: ルートに
VRCFTAvatarを追加します。ARKit の 52 ブレンドシェイプ値をFT/v2/...パラメータに変換して Animator に直接書き込みます。FT テンプレート側が Animator 内で表情を駆動するため、以降の Viseme / Blink / Expressions の移植は 適用されません。 - それ以外: ルートに
VRCAvatarを追加します。VRCAvatarは FX コントローラのViseme/Voiceパラメータを ARKit から駆動するためのブリッジで、VRCAvatarDescriptorが削除される前に以下の情報を移植します。
4-2. Viseme リップシンク (VRCAvatar)
VRCAvatarDescriptor.lipSync が VisemeBlendShape の場合に限り、VisemeSkinnedMesh と VisemeBlendShapes から以下の母音ブレンドシェイプを VRCAvatar に移植します。
aa/E/ih/oh/ouの 5 母音silは専用ブレンドシェイプを持たないため -1 (口閉じ) として扱われます- 子音系の Viseme は対象外です (ARKit から推定する 5 母音のみ対応)
母音のいずれも見つからない場合は移植をスキップし、VRCAvatar は Animator 経由の Viseme/Voice パラメータ駆動にフォールバックします。
4-3. 瞬き (Blink) ブレンドシェイプ (VRCAvatar)
VRCAvatarDescriptor.enableEyeLook が有効で、customEyeLookSettings.eyelidType が Blendshapes の場合に、瞬き用ブレンドシェイプを VRCAvatar に移植します。
eyelidsBlendshapes[0](Blink スロット) のインデックスのみ使用します- "Looking Up" / "Looking Down" は対象外 (視線は Eye ボーンで駆動)
5. VRChat 専用コンポーネントの削除
非 VRChat 環境では参照できないため、以下のコンポーネントが階層全体から削除されます。
VRCAvatarDescriptorPipelineManager
加えて、元 VRChat アバターに残ったサードパーティ製 Missing Script (このプロジェクトに存在しないコンポーネント) も除去されます。SaveAsPrefabAsset が Missing Script を含むプレファブの保存を拒否するためです。
関連リンク
- VRChat Avatarを使用する — Transfer の操作手順
- VRC FaceTracking について — 表情まわりの扱い