メインコンテンツまでスキップ

VRChat Avatar Transfer 変換内容

VRChatAvatarTransfer がVRChat用アバターのプレファブに対して行う変換の一覧です。 VRChat Avatarを使用するConvert ボタンを押したときに、内部で何が起きているかをまとめています。

変換の全体像

Tools > VRChat Avatar Transfer > Transfer で開いた VRChat Avatar Transfer ウインドウに変換したいプレファブをドラッグします。このプレファブは変更されません。

  1. VRChat の揺れもの (PhysBone) を VRM10 SpringBone に変換
  2. VRChat の Constraint コンポーネントを Unity 標準の Constraint に変換
  3. VRCAvatarDescriptor の FX レイヤーの AnimatorController を複製してルートの Animator に適用
    • 複製した FX 内の VRCAvatarParameterDriverAvatarParameterDriver に置換
    • 複製した FX 内の VRCAnimatorTrackingControlAvatarAnimatorTrackingControl に置換
  4. アバターのタイプに応じてルートにコンポーネントを追加
    • VRCFT v2 互換アバター (FX に FT/v2/ パラメータがある) → VRCFTAvatar を追加
    • それ以外 → VRCAvatar を追加し、Viseme リップシンク / 瞬き / Expressions メニューを移植
  5. VRChat 専用コンポーネント (VRCAvatarDescriptor, PipelineManager) と Missing Script を削除

1. PhysBone → VRM10 SpringBone

変換元 (VRChat)変換先 (VRM10)
VRCPhysBoneVRM10SpringBoneJoint (チェーン上の各ボーンに付与)
VRCPhysBoneColliderVRM10SpringBoneCollider
(なし)ルートに Vrm10Instance を追加し、SpringBoneSprings / ColliderGroups に登録

主な特徴:

  • 末端ジョイントは VRM10 SpringBone のシミュレーション範囲外になるため、末端の子に <bone名>_end という Transform を生成して tail として登録します。
  • 分岐のあるボーン構造にも対応します。分岐点は親チェーンの末端ジョイントとして含まれ、各子は新しい Spring の先頭から始まります。
  • コライダーは Vrm10Instance 直下の ColliderGroup GameObject にまとめて配置します。
  • Vrm10Instance.UpdateTypeUpdate に設定されます (LateUpdate だとアニメーション後に 1 フレーム遅れて反映されるため)。

制限事項

  • コライダー: Plane 形状で insideBounds=true のものは VRM10 SpringBone に対応する型がないためスキップされます。
  • immobile: VRM10 SpringBone に相当する概念がないため無視されます。
  • VRC stiffness (Advanced): 上記マッピングには含まれません。

2. VRC Constraint → Unity Constraint

変換元 (VRChat)変換先 (Unity 標準)
VRCParentConstraintParentConstraint
VRCPositionConstraintPositionConstraint
VRCRotationConstraintRotationConstraint
VRCScaleConstraintScaleConstraint
VRCAimConstraintAimConstraint
VRCLookAtConstraintLookAtConstraint

weight / constraintActive / locked および Source の transformweight、各軸の影響有無 (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 フィールドは互換のため値だけ保持されますが、本パッケージにはネットワーク同期の概念がないため常に適用されます。
  • CopyconvertRangetrue の場合は [sourceMin, sourceMax][destMin, destMax] に線形マッピングします。
  • OnStateEnter のタイミングでパラメータが反映されるため、VRChat と同じ発火タイミングになります。

3-2. VRCAnimatorTrackingControl → AvatarAnimatorTrackingControl

同じく State / StateMachine 上の VRCAnimatorTrackingControlAvatarAnimatorTrackingControl に置換します。

引き継がれる部位
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.lipSyncVisemeBlendShape の場合に限り、VisemeSkinnedMeshVisemeBlendShapes から以下の母音ブレンドシェイプを VRCAvatar に移植します。

  • aa / E / ih / oh / ou の 5 母音
  • sil は専用ブレンドシェイプを持たないため -1 (口閉じ) として扱われます
  • 子音系の Viseme は対象外です (ARKit から推定する 5 母音のみ対応)

母音のいずれも見つからない場合は移植をスキップし、VRCAvatar は Animator 経由の Viseme/Voice パラメータ駆動にフォールバックします。

VRCAvatarDescriptor.enableEyeLook が有効で、customEyeLookSettings.eyelidTypeBlendshapes の場合に、瞬き用ブレンドシェイプを VRCAvatar に移植します。

  • eyelidsBlendshapes[0] (Blink スロット) のインデックスのみ使用します
  • "Looking Up" / "Looking Down" は対象外 (視線は Eye ボーンで駆動)

5. VRChat 専用コンポーネントの削除

非 VRChat 環境では参照できないため、以下のコンポーネントが階層全体から削除されます。

  • VRCAvatarDescriptor
  • PipelineManager

加えて、元 VRChat アバターに残ったサードパーティ製 Missing Script (このプロジェクトに存在しないコンポーネント) も除去されます。SaveAsPrefabAsset が Missing Script を含むプレファブの保存を拒否するためです。

関連リンク