忍者ブログ

about:

tcard

twitter

ブログ内検索

Now Playing

Ranking

ブログランキング・にほんブログ村へ

カウンター

カレンダー

10 2025/11 12
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
17 18 19 20 21 22
23 24 25 26 27 28 29
30

ブログの評価 ブログレーダー

VRChat Unity上でのオブジェクトの消し方

VRChatの話。手を付け始めた頃に欲しかった情報をまとめた。
全体的な改変のワークフローは概ねこちらを参考にして行っている。他にも参考になる記事は数多く存在するが、なかなか1箇所にまとまっていない情報を集約する。

まえがき

アバターの改変に手を付けると必ず「アバターのオブジェクトツリーの一部を消したく」なるはずである。しかし単純にオブジェクトを「削除」すると思わぬ不具合に繋がる場合がある。また削除した髪型や衣装などを「やっぱり元に戻したい」時に困った事になる。

改変作業の前提として、Prefabのオブジェクトツリーから「一部のオブジェクトを消す」方法を解説する。

1. ツリーから削除する (オススメしない)

自分で追加したPrefabを丸ごと削除する分には問題無い。一方でPrefab内部のツリーの一部を消す場合は、後々困る場合もあるのでオススメしない。

2. 非アクティブにするだけ(オススメしない)

エディタ左側のツリーで対象オブジェクトを選択し、Inspector最上部のチェックボックスをオフにするだけ。

お手軽だが、オブジェクトを明示的に消す意図があるのであれば、この方法で見えなくするのはオススメしない。 チェックボックスの操作1つで切り替えられるので編集中は便利だが、
  • アバターをアップロードする段階では非アクティブのままのオブジェクトもデータに含まれる事になる。改変後に使用しないオブジェクトを非アクティブにしただけでは、無駄にアバターのダウンロードサイズを増やしてしまう事になる(※1)
  • 元々出し入れ可能な衣装やアクセサリーは、そもそもこの方法では消せない場合がある。これはパラメータという別の仕組みでアクティブ/非アクティブを制御されているためである。
  • この方法では「編集中の都合でそうしているのか」「最終的に不要だからなのか」区別しづらくなってしまう。
(※1)一応、AAOを導入していればPublish時にいい感じに削除してくれるらしいが……確実ではない。

3.  非アクティブかつEditorOnlyに設定する

一番オススメの方法。ただしExpressionメニュー(Exメニュー)から表示/非表示を切り替えられるオブジェクトの場合は、4.の手順で行うこと。

まず2.と同様にエディタ左側のツリーで対象オブジェクトを選択し、Inspectorのチェックボックスからチェックを外して非アクティブにする。次にチェックボックスの下のプルダウンメニューから「EditorOnly」を選択する。

EditorOnlyに設定したオブジェクトは編集中はそのままだが、Unity内で再生ボタンを押している間やアバターをアップロードした後は消去される。最終的なデータサイズを削減しつつ、編集中は残るため変な不具合に遭遇する可能性も減り、元に戻すのも簡単である。
元に戻す際にEditorOnlyを外し忘れないよう注意。

4. Exメニューから非表示にできるものを消す

Exメニューから表示/非表示を切り替えられるオブジェクトは、切り替え時に他のオブジェクトの状態にも影響を及ぼしている場合がある(後述)。これに起因してアバターが意図しない状態になってしまう可能性があるため、以下の手順で「オブジェクトが表示されていない状態」にアバターを固定してから消すとよい。
  1. まずアバターのExメニューをInspectorで辿り、これから消したいオブジェクトの表示/非表示を切り替えている項目を探す。そこに表示/非表示を制御している「パラメータ」の名前が記述されているはずなので、それをメモする。
  2. 次にModular AvatarのMA Parametersコンポーネントをアバターに導入(※2)し、メモしたパラメータの初期状態を「消したいオブジェクトが消える状態」に設定する。
  3. 設定したらPlayを押し、(1)オブジェクトが非表示状態になっていること、(2)それ以外のオブジェクトが意図しない状態になっていないこと……を確認する。
    この段階では初期状態を設定しただけなので、Exメニューを操作すれば再度表示できるはずである。
  4. 確認できたらPlayモードを抜け、改めて非表示にしたいオブジェクトを前述の「3. 非アクティブかつEditorOnlyに設定する」手順で消す。
  5. 最後にExメニューの該当する項目を消去し、オブジェクトを表示する操作が行えないようにする。
    もしMA Menu Itemがアバターのどこかに導入されていてExメニューの項目を管理している場合、メニュー項目をオブジェクトに展開する
    その後、展開後のメニュー項目に対応するオブジェクトを3.の手順でEditorOnlyにすることで、Exメニューの項目を消すことができる。
(※2)MA対応のアバターには既に導入済みの場合もある

もともとメニューで出し入れ可能だったオブジェクトも、これで表面上は痕跡を残さず消すことができた。
実はこの手順だけではAnimation Controller関連やParameterといった別の残骸データは残っているのだが、これらまで消そうとするとAnimatorの編集に手を出す必要があり、ややこしいので本項では割愛する。アバターのパラメータ数に余裕があるのであれば触る必要は無い。

余談

Exメニューの項目を消す方法に関して

Exメニューの中身は本来、アバターに同梱されているExpressions Menuのアセットファイルに保存されている。このファイルはプロジェクト全体で共通であるため、安易に編集すると別の改変シーンにも影響してしまう。そこで本項ではファイルの内容をシーン上のオブジェクトツリーへ展開し、そちらを編集する方法を紹介した。
これらのメニュー項目オブジェクトは、なぜか非アクティブにしただけではExメニューからは消えないため3.の方法が必要となる。

なぜ4.の手順が必要なのか

Exメニューで非表示にできるオブジェクトは、ざっくり
  1. ユーザがExメニューを操作する
  2. 操作したメニュー項目に対応した「Avatar Parameter」が書き換えられる
  3. 同名のAnimatorのParameterが書き換えられる
  4. Animator ControllerでそのParameterを参照する部分が動作し、オブジェクトの状態などが変更される
という仕組みになっている。
ここで、1つのパラメータから複数のオブジェクトの状態を制御している場合がある。そのうちの一部、目に見えるパーツのオブジェクトをEditorOnlyで消したとしても、残ったオブジェクトにパラメータが影響し、アバターが意図しない状態になるおそれがある。

例えばある衣装を表示するパラメータが
  • 衣装オブジェクトをアクティブにする
  • 衣装と干渉するアバターの体の部位を絞るシェイプキーを有効化し、干渉を防ぐ
という2つの設定を同時に行っている場合がある。絞られた体は衣装で隠蔽されるので本来は外からは見えず問題にならないが、この状態で衣装オブジェクトだけを消すと露出してしまうのである。

オブジェクトのメッシュの一部を消すには

上記の方法で消せるのはツリーの「オブジェクト1個単位」である。ツリー上でそれ以上分解できない1つのオブジェクトの、3Dグラフィックの一部を消したい場合は別の方法でポリゴンメッシュの一部を消去する必要がある。Blenderで直接編集してもよいが、消すだけなら多くの場合Unityのみで対処することもできる。

まず対象のオブジェクトにSkinned Mesh Rendererが使用されている場合、AAOの「Remove Mesh By 〇〇」やMAの「Mesh Cutter」といったコンポーネントで、特定条件に合致するポリゴンメッシュの頂点(と、それらを使う面)をピンポイントで消去することができる。特に「AAO Remove Mesh By Box」 は、Unityの3Dシーン上で消去範囲を確認しながら直感的な編集操作が可能なので個人的に愛用している。

またアバターの中には「身体を絞る」シェイプキーが実装されており、大まかな身体の部位毎に細くして改変衣装からはみ出さないようにすることができる。が、単純に当該部位を非表示にしたいのであれば、上述のAAO Remove Mesh by BlendShapeやMAのVertex Filter - By Blendshapeのいずれか、BlendShapeを指定してメッシュを消去するコンポーネントを使用するとよい。メッシュの不可視化に加えて頂点数自体を削減することができるため、アバターの処理負荷を軽減できる。

Skinnedではない方のMesh Rendererが使用されている場合これらは使えないが、 MeshDeleterWithTextureというツールであればMesh Rendererにも対応しており、同様にUnity上の操作のみで削除することができる。
PR

Comments

Comment Form