はじめに
今回はUnityにあるSkinned Mesh Rendererの設定と影響についてまとめます。
VRChatでの利用を想定したUnityのことを書きます。

ゲーム制作目的できた人はこの解説通りの画面じゃなかったり…
この解説でおすすめしてる設定から変えた方が良い部分もあります。
各自で作ってるゲームに合わせて調整してください。
Unityの基本操作などはこちらをご覧ください。
↓また公式の説明なども合わせてみると理解が深まると思います。


この説明で一般人が分かるなら私がこの記事執筆してない問題はある。
Skinned Mesh Rendererとは
一言で言うと「変形する形状」のための描画設定です。
ボーンやシェイプキーで動かすにはこの設定にする必要があります。

ボーンやシェイプキーを設定したモデルを選択。
インスペクターを見ると出てきます。
よく使われるのがシェイプキーこと「BlendeShapes」です。

↓このような変形するメッシュは「Skinned Mesh Renderer」にする必要があります。

Mesh Rendererの方はボーンやシェイプキーなどで動かせません。
試しにコンポーネントを追加 → 「Mesh」で検索しMesh Rendererを追加。

Skinmed Mesh Rendererのチェックを解除。
Mesh Rendererだけの状態にすると… 表示がきえます。


シェイプキーがあるものをむりやりMesh Rendererにした結果…
描画が不可能な状態になりました。
Skinned Mesh Rendererを再表示。
Mesh Renderer横の3つの点を選択。
→ コンポーネントを削除で元に戻します。

ちなみにコンポーネントを追加で「Skinned Mesh Renderer」も追加できます。
何かの手違いで変形するモデルにMesh Randererが入った方はこの手順で差し替えてください。

以上がSkinned Mesh Rendererの解説です。

そしたらSkinned Mesh Rendererの設定項目を全て見ていきます。
Skinned Mesh Rendererの重要設定項目
Skinned Mesh Rendererで特に重要なのは下記の2つ。
・Bounds範囲
・プローブの「アンカーオーバーライド」設定


Bounds範囲は一回りデカく
アンカーオーバーライドは “アバター” の中心である「Chest」を設定する。
この2つを理解し守れれば後は読まなくてもいいです。
この2つを先に見ていきます。
Bounds範囲は一回りデカく
カメラから規定された描画範囲内に「Bouds」があるものは表示のための計算が行われます。

↓極端にBoundsをズラすとこんな感じの挙動になります。
Boundsの立方体がカメラから消えると描画処理が行われなくなります。

で、このBoundsはモデル全体を覆っていればOKとされます。

物体より小さい状態がNG。

Boundsの立方体よりモデルが大きいと…
ズームなどで視界からBoudns立方体が外れて、意図しない描画キャンセルが起こります。

ただ… 変形するモデルは何かしらの理由でメッシュの大きさが変わります。
そしてBounds範囲がギリギリだと突き抜けることがあります。

ボーンなどの変形も同様です。
形が変わってはみ出るのは避けた方が良いです。

この状態で特殊な視点で見ると…
Boundsが範囲外になりモデルの一部が消えることがあります。

なので、このような変形までを想定して「一回り大きく」してください。

ちなみに、Boundsが大きすぎも避けた方が良いです。

メッシュの表示が無いのにBoundsの立方体があるので…
内部的には表示のための計算が行われる状態になります。

このような状態は無駄な処理負荷を増やすので避けた方が良いです。

なので… このような一回り大きい状態が理想です。

↓より詳しく知りたい方はこちらをご覧ください。

Boundsの基準はルートボーンで決まる
Bounds範囲はルートボーンを基準に決まります。
これはVRChatアバターであれば多くの場合で「Hips」です。

Unityで見るならArmature直下のボーン。

全ての親なので… 操作すると全体が動きます。

そしてルートボーンに設定したボーンを変形すると…
「ボーンの変形に合わせてBounds範囲も変化」します。
↓Bagボーンをルートにして動かした「Bagのモデル」の図。

なので、ボーンなどで動くVRChat向けアクセサリーなどを作った場合…
ルートボーンは「Hips」にしなくても良いです。
「アクセサリー」のルートボーンをそのまま使ったほうが上手くいきやすいです。

下手にルートボーンを「Hips」に揃えようとしすぎると…
Boudnsの基準点がズレて範囲設定が面倒なことになります。

もしルートボーンのHips統一をやるなら…
アバター全体の可動範囲を想定してBounds範囲を一括指定する形になります。

モノによっては余計なBounds範囲ができたりしますが…
手軽に管理できるのが魅力。

また正直、今のパソコンの性能を考えると…
Bounds範囲がちょっと余計に大きいぐらい普通に許されると思います。

ただアクセサリー製作者的には全てのアバターのHips状態に対処できません。


初心者はこの記事にたどり着かないと思うので飛ばし気味で行きます。
分からないことがあれば右上の所からブログ内検索してください。
Bounds範囲の確認方法
ヒエラルキーに適当な “変形がある” モデルを配置。
「メッシュ」のデータを選択。
するとBoundsという白い線で立方体の枠が表示されます。

変形 = シェイプキー or ボーンによる操作。
Skinned Mesh Rendererはこの2つの変形が行われるメッシュに対して必要になる設定。
なのでこの2つのいずれかの操作を行わないなら「Mesh renderer」で良い。
そして、この記事にたどり着いてない。

表示されない方は「ギズモ表示」を有効化してください。

インスペクターを確認。
Skinned Mesh Rendererを開くと「Edit Bounds」下に範囲の表示があります。

このBounds範囲は物体より小さい状態がNGとされてます。

では、なぜこれがNGなのかを見ていきます。
Bounds範囲が小さいと起こる問題
Bounds問題が分かりやすくなるように位置を調整。
あえてメッシュからズラします。

ここれカメラ(視点)の情報をおさらいします。
【カメラの描画範囲について】
・1つの場所から画角が決まっていて映す範囲が決まる
・前方と後方に描画範囲の限界を設けてそこを超えた先は描画しない

この画角と前方+後方描画範囲で作られた範囲が描画範囲です。


この描画範囲を表す台形の図を「視錐台」と言います
この描画範囲にBoundsが当たっていれば、そのメッシュは描画します。

このBoundsの立方体がカメラで表示されているとメッシュの表示が見えます。

Boundsの立方体が描画範囲から消えるとメッシュの表示が消えます。

↓動かすとこんな感じです。

Boundsの効果が分かったので「物体より小さい状態がNG」と言われてる理由を見ていきます。

これはズームすると分かります。
一定の所までズームするとモデルがあるのにBoundsが画面外に行くことがあります。
そして表示が消えます。

なので「Bounds」の立方体ば物体全体を覆う必要があります。


ただ… メッシュを覆う範囲ギリギリではNGです。
一回り大きくする必要があります。
一回り大きくする理由
Skinned Mesh Rendererは「変形」するメッシュに対して必要になる設定です。
なのでシェイプキーなどで変形操作が行われます。
この時、変形の形によっては… 初期Bounds範囲を超えることがあります。

キャラクターの体なども同様です。
わざとギリギリにBoundsを設定したモデルを用意。
腕を上げるとBoundsの範囲を超えます。

この状態で特殊な視点で見ると…
Boundsが範囲外になりモデルの一部が消えることがあります。

↓動かすとこんな感じです。


これがよくVRChatで問題となります。
なので… ポーズ変更などの変形を想定してBounds範囲は一回り大きくしてください。

ほかのモデルも同様。

以上が、Bounds範囲をモデルより一回り大きくする理由です。
大きすぎはNG
ではBoundsは大きければ大きいほど良いかと言われれば… そうではありません。

Boundsが大きすぎるとメッシュが画面外に行っても計算処理が入ります。
そして「描画負荷」を上げる原因になります。

↓このような状態だと、メッシュが画面内に無いのに余計な表示のための計算処理をします。

これを回避するためにも…
「”一回り大きく”がBoundsの最適解」とされてます。

ルートボーンがBoundsに与える影響
Skinned Mesh Rendererには「ルートボーン」という設定項目があります。
これは3DCGの計算に必要となる一番最初のボーンです。

Unityで見るならArmtureの直下にあるボーンです。

VRChatアバターの場合は大体「Hips」がルートボーンになります。

これを操作すると全体が回転します。


ゲーム開発ではルート指定用に足元(X,Y,Z = 0,0,0地点)に1つボーンを置くことがあります。
どのような構造にするかは… 郷に入っては郷に従いましょう。
このルートボーンを変えると「Boudnsの基準点」が変わります。

そしてルートボーンに設定したボーンを変形すると…
「ボーンの変形に合わせてBounds範囲も変化」します。
↓Bagボーンをルートにして動かした「Bagのモデル」の図。

なので、ボーンなどで動くアクセサリーなどを追加する場合は「Hips」にしなくても良いです。
「アクセサリー」のルートボーンをそのまま使ったほうが上手くいきやすいです。

下手にルートボーンを「Hips」に揃えようとしすぎると…
Boudnsの基準点がズレて範囲設定が面倒なことになります。

もしルートボーンのHips統一をやるなら…
アバター全体の可動範囲を想定してBounds範囲を一括指定する形になります。

モノによっては余計なBounds範囲ができたりしますが…
手軽に管理できるのが魅力。

また今のパソコンの性能を考えると…
正直、Bounds範囲がちょっと余計に大きいぐらい普通に許されると思います。

ただアクセサリー製作者的には全てのアバターのHips状態に対処できません。

なので結局はアクセサリー単体から見た「ルートボーン」を設定しておくのがいいと思います。


…あとはどこで「形状を区切り」何を「親ボーンとする」かを決めるセンスの問題。
目指すべき形は個別最適なBounds範囲設定
+後で紹介するアンカーオーバーライドを「Chest」に統一の2つです。

つまりアンカーオーバーライドさえ適切に設定されていれば「ルートボーン」は変えてもいいです。


要するに形状よりBounds範囲が小さくなければ良い。
ボーンが無いモデルはルートボーン設定不要
ボーンが無いモデルの場合、ルートボーンは設定は不要です。

無理やりルートボーン設定を入れると…
位置がルートボーン位置にズレて二度と動かせなくなります。

このようなモデルの場合はルートボーン「なし」に設定。
そしてBounds範囲を作ってください。


たぶんオプジェクトの位置(Transform値)でBoundsの基準が決まってます。
以上がBounds範囲は一回りデカくの解説です。
アンカーオーバーライドの設定
結論だけ言うとVRChatアバターの場合は「すべてをChest」しましょうです。

これだけでは分からないと思うので… 解説していきます。

全員がVRChatのためにUnityを使ってると思うな私定期。
ライトプローブの解説
アンカーオーバーライドを知るためには「ライトプローブ」を理解する必要があります。
ライトプローブは計算負荷を下げるために空間に記録された光源情報です。
↓特殊な条件を用意すれば、このような「球」として表示されます。

光源に「Light Probe Group」を追加してライトベイクを行うと…
空間に光の情報が記録されます。

そして動く物体は最寄りのライトブローブ球を参照し…
物体の光源情報を決めます。
↓なので極端な例ですが、平面の遮蔽や距離などの影響は出ません。

計算してるのは最寄りのライトブローブ球です。
なのでどれだけ離しても…
より近いライトブローブ球が無く参照先が変わらなければ同じ光になります。

ライトベイクとライトプローブの確認方法はこちらで解説。

また検証用のシーンデータをPixiv Fanboxの方で無料配布しました。
↓こちらもご活用ください。
ライトプローブの参照先が何で決まるか?
先ほどの立方体は動くとライトプローブの参照先が変わります。
では、これは何を判定して動いているのか?

ライトプローブ球の参照先も「Skinned Mesh Renderer設定」で決まります。

決まり方は下記の通り。
①アンカーオーバーライドでオプジェクト指定
(指定すると最優先で決まる)
②Boundsの中点
(アンカーオーバーライド指定がない場合)

以上がライトプローブの参照先が何で決まるか?の解説です。
参照先の位置ズレで起こる問題
アンカーオーバーライドが「なし」の状態。
さらにBoundsの範囲がモデルごとに違うと…
ライトプローブ球の参照先もモデルごとに変わってしまします。

この状態で物体内でライトプローブ球の参照先が変わるような環境用意。
するとモデルの一部で環境光の情報が変わり一部の「色」が変わる問題が起こります。

こちらでは、顔と体で色が違う問題が発生しました。

頭のライトプローブ球が参照してる部分は青いライト付近です。

一方の体は赤いライトのライトプローブ球を多く参照してます。

アンカーオーバーライドは “アバター” の中心へ (Chest)
この問題を解決するのがアンカーオーバーライドです。
これをアバターの中心に設定すれば解決します。


決定の優先順位は…
「指定したアンカーオーバーライド」 > 「Boundsの中点」です。
なので、アンカーオーバーライドを適切に設定するだけで解決します。
アバターの中にあるメッシュデータをShift+クリックで全て複数選択。

インスペクターに移動。
アンカーオーバーライドでアバターの「Chestボーン」を設定。

これでライトプローブ球の参照先が1つになりました。


Bounds範囲は変わってますが…
ライトプローブ球の位置は変わらなくなりました。
これでアバターの一部モデルで色が違う問題がなくなりました。

あとの2つはライトプローブの計算方法関係です。
VRChat目的の方はそのままでOK。
分からない方も触らないようにしましょう。


本気でUnityでゲームを作ってる方が少しでも処理を軽くしようとした際に触るところ。
以上がアンカーオーバーライドの設定です。
ライティングとブローブの違い
ライトプローブは環境光の設定でした。
そこで「ライティング」と何が違うの…? と疑問が出てくると思います。
【ライティングとプローブの差】
・ライティング
→ リアルタイムの「落ち影」関係の処理
→ 主にDirectional Lightの影響を操作する
・プローブ
→ 事前計算された後の環境光に関する処理(ライトベイク)

ライティングについて
ライティングを説明するために下図のような環境を用意。
真ん中の立方体をむりやり「Skinned Mesh Renderer」にしました。

下記の2点がポイントです。
・平面に立方体が影を落としてる
・別の立方体から影が落とされてる

この状態で真ん中のSkinned Mesh Rendererにした立方体を選択。
投影をオフにすると… 平面に落ち影を落とさなくなります。

今見えてるのはデカい立方体の影です。

↓単体で表示するとこんな感じの動作です。

両面は「背面カリング」で消えたオプジェクトの影も落とすかどうか?の設定です。

Unityは処理負荷を減らすために裏側の面を表示しない設定にできます。(背面カリング)
↓詳細はこちらで解説。
この背面カリングで表示が消えても影だけ落とすのが「両面」設定です。

影を受けるを無効化すると… デカイ立方体からの落ち影がなくなります。

↓動かすとこんなか感じです。

以上がライティングの解説です。
残り部分の紹介(重要度低め)
残った部分は優先度がかなり低いです。
VRChatユーザーは覚えなくてもOK。

それでも1つ1つ解説していきます。
BlendShapes
言わずと知れたシェイプキーです。
Unityでできるのは操作だけ。


シェイプキーにあるのはBaseで指定したどれだけ各頂点が移動したかの情報です。
なので移動量は足し算できます。
=シェイプキーは混ぜれます。
難しいことは考えず、適当にバーを動かして学びましょう。

またシェイプキーの追加はUnityでは行えません。
Blenderなどでモデルを編集する必要があります。

ちょっと古い記事ですが…
シェイプキーの追加方法やVRChatのアバターに反映する方法はこちらで解説。

Modular AvatarやFace Emoあたりを使えばもっと楽にUnity実装できるかも?
品質(有効ボーン数)
品質はメッシュを変形する上で1つの頂点に影響を与えれるボーン数の上限値です。
人力で設定すると「4」が上限。
自動にした場合は最大32まで設定できます。

モバイル系のゲーム開発者で少しでも処理負荷を下げたい人向け。(?)

普通に「自動」のままで良いです。
オフスクリーン時に更新
オフスクリーン時に更新はカメラから見えてない時の挙動です。
オンにすると見えてない時でも描画に関する処理が行われます。

↓このような描画範囲外の状態でも内部的にはモデルの計算がされるようになります。

無駄な負荷が増えるだけなので「オフ」のままにしましょう。

…何に使うか謎すぎる。
メッシュ
メッシュを押すと、どのモデルを参照してるかが分かります。
ダブルクリックでプロジェクトの階層を移動できます。
(鍵マークが入ってる場合は外してください)

表示されたのはモデルの中にある「頂点と面張り情報」です。

モデルを選びたい方は「▶」で開かれる1つ前にある親データを選択してください。
Blenderファイルを読み込んだ人はここでBlenderを起動できます。

Materials(マテリアル)
色情報です。
ダブルクリックでプロジェクト移動できます。

右上にある数字を変えたり「+」や「-」でスロット数を変更できます。


ただ…
ここでマテリアル数や参照先を操作するメリットは特にないです。
マテリアルの操作はプロジェクトで形状を選択。
インスペクターにある「Materials」の方で操作します。

あとマテリアルの追加や割り当ての変更はBlenderなどの3D作成ツールで行ってください。

マテリアルの操作方法はこちらで解説。
(2025年6月でも使えるv3.1記事)
また設定されてるマテリアルは画面下部の所で開くと操作できます。

以上がmaterialの解説です。
追加設定の2つ
追加設定にある2つは計算の品質関係です。
VRChatユーザーは気にせず「オン」のままでOKです。(たぶん)
・スキンしたモーションベクトル
→ オンだと変形が滑らかになる
→ オンだとGPUメモリ負荷が増える
・動的オクルージョン
→ オンだと壁の後ろに行ったモデルを描画しない(静的メッシュ裏)
→ オンだと描画負荷が減る
→ FPSの壁貫通的なエフェクトを作るには必要
→ 一般VRChatterは基本的に使わない

動的オクルージョンをオフにすると静的メッシュに遮蔽されても描画処理が行われます。
これは壁の裏にいるキャラの輪郭を描くとき使えます。

FPSやTPSゲーム開発でウォールハック的なエフェクトを作る用。
Once Humanのハンティングマーク(Bull Seye)みたいなエフェクトを作る用と考えてください。
おまけ:VRChat向けモデルを作る方へ
Skinned Mesh Rendererは「Bounds範囲」と「アンカーオーバーライド」の2つが超重要と説明しました。

このうち、Boundsは拡張機能なしで製作者側が設定できます。

が… アンカーオーバーライドを「Chest」にする設定はユーザーにお任せする必要があります。

Skinneed Mesh Rendererのアンカーオーバーライド指定は “アバター名” まで記録されます。

こちらが持ってるアバターのChestを指定しても…
ユーザーが持ってるモデルのChestまでは指定できません。

そして元のモデルを消すとエラーになります。
なので、Skinned Mesh Rendererでの指定は使えません。

そこで重要になるのは「ユーザーへの教育活動」だと思います。

↓なのでこちらのような記事を買いてモデルの使い方の所に組み込んだりしてください。


Booth販売ページにこのブログURLで引っ張っても大丈夫です。
一応MA Mesh Settingsを使えば、アバター名なしのパス指定ができます。
「Armature」部分から始まってることに注目。

“アバター名” は空白。

なので、モデルを入れたアバターの名前を自動で読み込んでパス指定してくれます。

これを使えば作者側が適切なアンカーオーバーライドを指定できます。
→ 理解あるユーザーが自力で「アンカーオーバーライド」を設定しなくて良くなります。

ただし…○○専用モデルにしか使わない方が良いというデメリットがあります。

アバター次第では、ボーン名や構造が違うことがあります。
このような場合に正しく動かない可能性があります。


極端な例ですが…
「Armature」の名前が「Armatu Nyan」になってたらこの時点で動きません。
またMesh Settingsの多重設定リスクなども考えると…
「○○専用」みたいな「元のアバターの状態を保証できる」モノにしか使えないです。

↓MA Mesh Settingsの詳細はこちらでまとめました。

でも結論アバター改変されることまで考えていくと…
結局最強の答えは「ユーザーへの教育活動」になる悲しいオチ。

なので、VRChat向けモデルを作る方は可能であれば…
アンカーオーバーライドの設定をユーザーにやってもらう説明文を作りましょう。
ユーザーの手間を減らすなら「MA Mesh Settings」を最上位に入れて下記のように設定。
・アンカーオーバーライドの設定モード → 設定
・アンカーオーバーライド → Chest設定
・Bounds設定 → 設定しない(3Dモデル制作者を信じる)

以上がVRChat向けモデルを作る方への追記です。
まとめ
今回はUnityにあるSkinned Mesh Rendererの設定と影響について解説しました。
・Skinned Mesh Rendererはボーンやシェイプキーで変形するモデルに必要な描画設定
・重要なのはBounds範囲とアンカーオーバーライド設定
・Bounds範囲は変形を想定してモデルより1周り大きくする
・アンカーオーバーライドはモデルの中央に設定する
・アンカーオーバーライドはVRChatアバターならChestボーンが一般的
・そのほかシェイプキーなどの操作も可能
・あとは適当でOK
また他にもVRChat向けUnityや3DCGについて解説してます。

ぜひ、こちらもご覧ください。
コメント