VRChatでBlendshapeの変更がアップロード後にリセットされる問題を解決する完全ガイド|原因の見極めとFXレイヤーで初期値を固定する手順

画像処理、制作

本記事では、Unity上で調整したアバターのBlendshape(シェイプキー)がVRChatにアップロードすると元に戻ってしまう現象を、原因別に切り分けしながら、元のPrefabを崩さずに「意図した値を確実に維持」するための具体的な手順を解説します。Animator(FX/Face/Gesture)やExpressionメニュー、Prefabの適用漏れなど、つまずきやすいポイントを実例つきで整理しました。

なぜBlendshapeがリセットされるのか:よくある原因

① Prefabのオーバーライド未適用:シーン上でSkinnedMeshRendererのBlendshape値を変えても、Prefabに適用していないとビルド時に元の値へ戻ります。

② アニメーションクリップで上書き:FX/Face/Gestureいずれかのレイヤーに、対象メッシュのblendShape.○○をキーに持つクリップがあると、再生開始時や遷移時に0や既定値へ上書きされます。

③ Expressionメニューやパラメータの初期化:トグル類の初期ステートや、起動時に走るステートがBlendshapeをリセットするクリップを参照している場合。

④ Write Defaults(WD)の扱い:WDのオン/オフ方針が混在すると、意図せぬプロパティの初期化(=暗黙リセット)が起きがちです。

ゴール:Prefabを保ったままBlendshape初期値を固定する

ここでのゴールは「メッシュをBlenderで焼き込み直さず」「Prefab構造を維持したまま」「常に狙った値で起動」させることです。最小手数で安全に達成するため、FXレイヤーに“初期姿勢(BasePose)クリップ”を常時再生させ、Blendshapeの既定値を明示的に固定します。

この方法は、衣装の非対応対策(胸/腰/腕周りの微調整など)にも有効で、他の表情アニメや表情メニューと併用できます。

手順A:前提の整備(Prefab適用と衝突の洗い出し)

1)Prefabのオーバーライドを適用:Sceneのアバターを選択→Inspector右上のOverrides(またはPrefab)→Apply All。これでBlendshapeの既定値がPrefabに保存されます。Prefab Variant運用なら、必ずVariant側に適用してください。

2)衝突アニメの検索:Project検索でblendShape.(該当名)を入力し、当該メッシュを参照するAnimationClipを特定。FX/Face/Gestureのどこで書き換えているかを洗い出します。意図しないクリップが見つかった場合はキーを削除するか、別の方法(下記BasePose)で上書きします。

3)WD方針を決める:現代の運用ではWD=OFF推奨が一般的です。WD=OFFに統一する場合、各クリップは「触るプロパティをすべて明示キー」します(初期値リセットの偶発を避けるため)。既存がWD=ONで統一されているプロジェクトなら一旦揃え、混在を避けます。

手順B:FXレイヤーで初期値を固定する(BasePose法)

1)固定用アニメを作成:Projectで新規AnimationClip(例:BasePose_BlendshapeDefaults)を作り、対象SkinnedMeshRendererに対してblendShape.(胸縮小用の名前など)へ希望の重み(例:BreastSize= -30% 相当の値)をキー登録します。このクリップは他の表情や衣装トグルが上書きしない限り、常に初期値を提供します。

2)FXレイヤーのDefault Stateに配置:Animator Controller(FX)を開き、最初に再生されるステート(Entry直後)をこのクリップに設定。ループ有効でOK、遷移条件は不要です。WD=OFFの場合は「初期値として必要なBlendshapeのみ」を明示キーで含めます。WD=ONの場合は副作用に注意し、他プロパティを不用意に巻き込まないようアバターマスクで対象メッシュに限定すると安全です。

3)他レイヤーとの整合:Face/Gestureで同じblendShape.○○を動かすクリップがある場合、そちらの遷移時に上書きされます。常に縮小状態を維持したいなら、各トグル側クリップから該当キーを削除、またはトグルOFF時に戻す設計にします。

手順C:Expressionメニュー&パラメータを安全化

1)不要なパラメータの整理:サイズ変更系のパラメータやメニューエントリが残っていると起動時初期化で意図せず0に戻ることがあります。未使用のParameter/Menu項目は削除し、参照先アニメがないか確認します。

2)初期化クリップの優先度:サイズ変更をユーザー操作で切り替えたい場合は、ON/OFF両方のクリップを用意し、デフォルトはBasePoseと同じ値にしておくと起動時のチラつきを防げます。

3)アップロード前の確認:Playモードで起動→表情/ジェスチャーを一通り切り替え→衣装トグルを操作し、Blendshapeが維持されるかをチェック。問題が出たら、どのクリップ遷移で値が変わるかをAnimatorのパラメータを見ながら特定します。

実例:胸まわりを小さくして非対応衣装を着るケース

例として、BodyメッシュにBreastSizeというBlendshapeがあるとします。衣装が対応しておらず貫通するため、デフォルトで-30%相当にしたい状況です。

この場合、BasePose_BlendshapeDefaultsにてblendShape.BreastSizeを例えば30(値のスケールはアバター依存)に設定し、FXのDefault Stateで常時適用。衣装トグルや表情クリップにはblendShape.BreastSizeのキーを含めない設計にします。こうすると、起動直後から常に縮小状態で、衣装側の貫通が起こりにくくなります。

もし「衣装ごとに微妙に数値が違う」なら、各衣装ONステートに合わせた調整クリップを作り、トグル切替時にのみ上書き、OFFでBasePoseへ戻るよう遷移設計します。

トラブルシュート:それでも戻る時のチェックリスト

  • FX以外(Gesture/Action/Face)に同名Blendshapeキーがないか?
  • 別メッシュ(衣装側)のCorrectiveクリップがBodyを誤って参照していないか?
  • WDが混在していないか?(すべてOFFまたはすべてONに統一)
  • Prefab適用はVariant階層の正しいレベルに反映されているか?
  • アップロード時、Avatar DescriptorのPlayable Layersで意図したControllerを参照しているか?

なお、どうしてもアニメ設計上リセットされる場合は、BasePoseを上位優先(常時再生)に置き、トグル時のみ明示的に上書き→復帰の流れに統一すると安定します。

代替策:Blenderでの焼き込みを避けたい時の工夫

BlenderでBasisへ適用してFBXを作り直す方法は強力ですが、Prefab差し替えや衣装側のバインドが面倒になりがちです。まずは本記事のBasePose法で非破壊に運用できるか検討してください。

どうしても衣装側に依存する場合は、衣装ON用の補正Blendshape(衣装メッシュ側)を作り、トグルで衣装メッシュのみ補正する設計も有効です(Bodyの恒常変更を避けられる)。

まとめ:安全に「意図した初期値」を保証する設計に

Blendshapeのリセットは、ほぼ例外なく「どこかで上書く何かがある」ことが原因です。Prefabへ適用→衝突クリップの洗い出し→FXでBasePose常時再生→WD方針統一、という順で整えると、元のPrefabを保ったまま安定して値を維持できます。非対応衣装の対処も、まずはこの非破壊ワークフローから始めると、作業負担と副作用を最小化できます。

コメント

タイトルとURLをコピーしました