Layers
各オブジェクトが所属するLayer
オブジェクトのInspectorの右上にあるLayerからそのオブジェクトが所属するレイヤーを設定可能
所属するレイヤーによってオブジェクト同士の衝突関係が異なる
Cameraの設定でカメラに写るレイヤーを設定したり、VRC_MirrorReflectionで鏡に映るレイヤーを設定したりすることで特定のオブジェクトのみを表示可能
本ページでは以下のように用語を定義して使用しています。
- クイックメニュー : WorldsやAvatar、Socialなどを選択できるメニュー
- VR専用カメラ : VRChatのバージョン2018.1.3現在、VRモード限定で使用できるクイックメニューから選択して使用可能なカメラ
- レイキャスト : クイックメニューを表示した際などにアバターの手から水平方向に向かって飛ぶ青い光線
- HUD(Head UP Desplay) : クイックメニュー上部にあるマイクマークやinviteマークなど
各種Layer
各Layerに所属するもの(所属すべきもの)や挙動等
DefaultからUIまではUnity従来のもの、Interactive以降はVRChatオリジナルのもの
VRChatオリジナルのものはSDKを導入後、VRChatSDK > ShowBuildControlPanelのSetup Layersを押すことで使えるようになります。
- Default
- デフォルト状態。特に設定しなければこのレイヤーに所属
- TransparentFX
- Ignore Raycast
- Water
- SDK内のVRCMirrorはここに所属
- UI
- ワールドアップロード時のカメラ(VRCCam)やVR専用カメラで表示されない(デスクトップモードだと写る)
- クイックメニュー選択時のレイキャスト、HUD、VR専用カメラ、Pickup時等に手に表示される説明が所属
- フルトラッキング時のトラッカーの位置を示すSphereも所属
- Interactive
- VRC_TriggerコンポーネントでOnInteractに設定した場合、自動的に所属?してなかった
- Player
- 自分以外のプレイヤーのアバター
- PlayerLocal
- 自分のプレイヤーのアバターの頭以外
- アバター選択時の左に表示されるアバターオブジェクトも所属
- Environment
- UiMenu
- ワールドアップロード時のカメラ(VRCCam)やVR専用カメラで表示されない(デスクトップモードだと写る)
- プレイヤーのネームタグやクイックメニューが所属
- Pickup
- Pickup可能なオブジェクト
- VRC_Pickupコンポーネントを追加すると自動的に所属
- PickupNoEnvironment
- StereoLeft
- HMDの左目のディスプレイにのみ表示される?ならなかった
- VR、デスクトップモードいづれも表示され、スクショにも映る
- StereoRight
- HMDの右目のディスプレイにのみ表示される?ならなかった
- VR、デスクトップモードいづれも表示され、スクショにも映る
- Walkthough
- プレイヤーと衝突しないワールド設置オブジェクト。Pickupできるオブジェクトとは衝突する
- ワールドに含まれる多くのオブジェクトがこれに割り振られていた(例:机、椅子、マット...)
- MirrorReflection
- カメラ(や鏡?)に映った自分のプレイヤーのアバター全体
- 自分のプレイヤーアバターのHeadのメッシュはこのレイヤーのみに所属
- プレイヤーの視点には写らない
- reserved2
- reserved3
- reserved4
- これ以降のレイヤーはワールド制作者が任意に追加することができます
?がついているものは未検証です(要検証)
Layerの追加方法
Inpectorの一番右上にあるLayerのプルダウンメニューの一番下、AddLayerから任意のレイヤーを追加できる
各Layerの衝突
VRChatSDK > ShowBuildControlPanelのSetupCollisionLayerMatrixからVRChatオリジナルのレイヤーの衝突関係を設定できます。
設定したレイヤーごとの衝突の関係はEdit > ProjectSettings > Physicsから確認できます。
チェックが入ってるものが衝突します。
DefaultとPickupの衝突は必須(チェックを外すと最適化を求められてアップロードできない)
Layerに関するコンポーネントやオブジェクト
- Camera : 任意のレイヤーのオブジェクトのみを写すように設定可能
- VRC_MirrorReflection(鏡) : 任意のレイヤーのオブジェクトのみを写すように設定可能。PlayerLocalにチェックが入っていてもアップロード時に自動的にチェックが外れる模様
- projecter : 任意のレイヤーのオブジェクトにマテリアルを適用することを無視するように設定可能
- VR専用カメラ : UI, UiMenu, PlayerLocalレイヤーのオブジェクトを写さない
- プレイヤーの視点カメラ : MirrorReflectionレイヤーのオブジェクトを写さない。しかし、コライダーによる衝突は確認できる。
- ParticleSystem : Collisionモジュールにて任意のレイヤーのオブジェクトのみに衝突するように設定可能
アバターに関係するLayer
アバターでは以下の4つのみが関係しています。
- PlayerLocal
- Player
- MirrorReflection
- UiMenu
プレイヤーのオブジェクトに対してUnity上で設定したレイヤーは、UiMenuレイヤーを除いてPlayerLocalとMirrorReflection(またはPlayer)レイヤーに自動的に再設定される。
自分のアバターのオブジェクトは2つのレイヤーに所属させるためにオブジェクトをすべて複製されている。PlayerLocalレイヤーを設定したほうのオブジェクトでは、Headのメッシュがカメラに映らないようにするためにHeadボーンのScaleをすべて0にしてHeadのメッシュを見えなくしている。
もう一方のオブジェクトはMirrorReflectionレイヤーに設定され、自分のプレイヤーの視点カメラでは写らない。これらのオブジェクトはPlayerLocalレイヤーのほうが自分から見るために使われ、MirrorReflectionレイヤーのほうが鏡に写るために使用される。
また、自分以外のアバターのオブジェクトは自分から見た際にPlayerレイヤーに所属されている。
しかし、UiMenuレイヤーだけは例外でUnity上で設定した場合、アップロード時に変更されることなく、VRChat上でもUiMenuレイヤーに所属している。
自分のアバターのオブジェクトの場合、同様に複製されるが、一方のオブジェクトはUiMenuレイヤーに設定され、もう一方のオブジェクトはMirrorReflectionレイヤーに設定される。また、自分以外のプレイヤーの場合は自分から見た際にUiMenuレイヤーに所属されている。
3人称視点 HOLOPORT[3P Locometion]
移動時に見えるアバターオブジェクトも同様にPlayerLocalとMirrorReflectionレイヤーに所属している。しかし、移動中はPlayerLocalでもHeadのメッシュが見えるため、Scaleが元に戻っていると考えられる
参考資料
- レイヤー番号とレイヤーごとの衝突関係など http://vrcprog.hatenablog.jp/entry/data-layers
- プレイヤーに付属しているコライダー形状の検証 https://twitter.com/naqtn/status/1064910528709967873 (PlayerLocal と Player とで形状が異なる)
- VRCLayerSetup
- https://github.com/AoiKamishiro/UnityCustomEditor_VRCLayerSetup
- アバター用のプロジェクトにて各種レイヤー名をセットするエディタ拡張
要検証案件
- https://twitter.com/momoma_creative/status/1027447970432614401
- https://twitter.com/momoma_creative/status/1026770908629716994
- https://twitter.com/mukaderabbit/status/1029986862096498693
- https://twitter.com/momoma_creative/status/1033167352181846017
コメント・情報提供
- 最終更新:2021-06-02 17:43:30