VRChatにおけるUnityレイヤー
レイヤーはUnityにおいて、ゲームオブジェクトの整理、ゲームオブジェクト間のコリジョン(衝突判定)やレイキャストの決定、シーンの一部を選択的なレンダリングなどを行うために使用されます。
VRChatワールド内のほとんどのレイヤーは自由に使用できます。一部のレイヤーはUnityとVRChatの両方で共有・使用されています。
VRChatのWorlds SDKを使用してUnityプロジェクトを作成すると、VRChatの組み込みレイヤーを使用するようにプロジェクトが自動的に設定されます。コリジョンマトリックスを変更したり、組み込みレイヤーの名前を変更または削除したりした場合、ワールドをVRChatにアップロードするとそれらの変更は上書きされます。
レイヤー22~31は、Unityで使用されていない「User」レイヤーです。これらは自由に変更可能であり、ワールドのビルドやアップロードを行っても、これらのレイヤーへの変更が破棄されることはありません。
Unityの組み込みレイヤー
以下の表は、Unityの組み込みレイヤー、VRChatでの使用方法、およびユーザーがステッカーを配置できるかどうかをまとめたものです。
| レイヤー番号 | レイヤー名 | 説明 | ステッカー配置可能 |
|---|---|---|---|
| 0 | Default | Unityのゲームオブジェクトのデフォルトとして使用されます。VRChatのアバター台座で使用されます。 | ✔ |
| 1 | TransparentFX | Unityのフレアアセットで使用されます。 | ❌ |
| 2 | IgnoreRaycast | レイヤーマスクが指定されていない場合、Unityの物理演算レイキャストからは無視されます。VRChatの物理演算レイキャストからは無視されません。 | ❌ |
| 3 | Item | ユーザーがワールドに配置したVRChatアイテムで使用されます。ワールドをアップロードする際、このレイヤーにあるゲームオブジェクトはすべてレイヤー0(Default)に移動されます。 | ❌ |
| 4 | Water | UnityのStandard Assetsで使用されます。VRChatのポータルで使用されます。VRChatのミラーで使用されます。Unityのポストプロセッシングで頻繁に使用されます。 | ✔ |
| 5 | UI | ⚠ このレイヤーの使用は避けた方が賢明です。UnityのUIのデフォルトとして使用されます。プレイヤーがVRChatメニューを開いている場合を除き、VRChatのUIポインターからは無視されます。カメラで「UI」が有効になっていない限り、VRChatのカメラからは無視されます。 | ❌ |
| 6 | reserved6 | ⚠ このレイヤーの使用は避けてください。VRChat用に予約されています。ワールドをアップロードする際、予約済みレイヤーにあるゲームオブジェクトはすべてレイヤー0(Default)に移動されます。 | ❌ |
| 7 | reserved7 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約済みレイヤーにあるすべてのゲームオブジェクトはレイヤー0(Default)に移動されます。 | ❌ |
| 8 | Interactive | UnityおよびVRChatでは使用されていません。 ユーザーにステッカーを配置させたくないコライダーに対して、このレイヤーを使用してください。 | ❌ |
| 9 | Player | ローカルプレイヤー以外のVRChatプレイヤーに使用されます。 | ❌ |
| 10 | PlayerLocal | ローカルプレイヤーを描画するためにVRChatで使用されます。ヒューマノイドアバターは、頭のボーンが表示されない状態で描画されます。 | ❌ |
| 11 | Environment | UnityおよびVRChatでは使用されていません。 | ✔ |
| 12 | UiMenu | ⚠ このレイヤーの使用は推奨しません。プレイヤーがVRChatメニューを開いている場合を除き、VRChatのUIポインターによって無視されます。 | ❌ |
| 13 | Pickup | Pickupコンポーネントを追加した際、VRChatのPickupによってデフォルトで使用されます。プレイヤーとは衝突しません。 | ❌ |
| 14 | PickupNoEnvironment | このレイヤーのコライダーは、「Pickup」レイヤーのオブジェクトとのみ衝突します。 | ❌ |
| 15 | StereoLeft | UnityおよびVRChatでは使用されていません。 | ❌ |
| 16 | StereoRight | UnityおよびVRChatでは使用されていません。 | ❌ |
| 17 | Walkthrough | このレイヤーのコライダーは、プレイヤーと衝突しません。 | ✔ |
| 18 | MirrorReflection | VRChatがミラー内にローカルプレイヤーを描画するために使用します。 このレイヤー上のレンダラーは、ミラー内にのみ表示されます。 このレイヤー上のレンダラーは、VRChatのメインカメラには描画されません。 このレイヤー上のコライダーは、VRChatのレイキャストを遮断しません。 | ❌ |
| 19 | InternalUI | ⚠ このレイヤーの使用は避けてください。メニュー、ネームプレート、デバッグパネルといったVRChatの内部UI要素に使用されます。 | ❌ |
| 20 | HardwareObjects | ⚠ このレイヤーの使用は避けてください。コントローラーやトラッカーなど、ゲーム内の物理ハードウェアの仮想表現を描画するためにVRChatが使用します。 | ❌ |
| 21 | reserved4 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードする際、予約されたレイヤー上のゲームオブジェクトはレイヤー0(Default)に移動されます。 | ❌ |
| 22-30 | UnityおよびVRChatでは使用されません。アップロードされたワールドにおいて、VRChatはこれらのレイヤーの名前や衝突行列(コリジョンマトリックス)を上書きすることはありません。 | (✔)1 | |
| 31 | ⚠ このレイヤーの使用は避けてください。Unityエディターのプレビューウィンドウの仕組みで使用されます。 | (✔)1 |
Stickers
Stickersを使用すると、VRChat+ユーザーはワールド内のColliderコンポーネントに画像を配置できるようになります。
Stickersはすべてのレイヤーに配置できるわけではありません。ColliderコンポーネントへのStickersの配置を許可したくない場合は、そのレイヤーを変更してください。VRChatおよびUnityで使用されていないレイヤー8("Interactive")を使用することを推奨します。
Stickersをどこにも配置させたくない場合は、VRChatウェブサイト上でワールドを編集し、Stickersを無効にしてください。
物理演算とレイヤー
物理演算処理を使用する際は、予約済みレイヤー上のオブジェクトを避けるため、判定対象となるレイヤーを制限してください。また、Physicsの呼び出しから返されたオブジェクトに対してUtilities.IsValidを使用することをお勧めします。これにより、誤って「保護」されたオブジェクト(nullとなり、UdonBehaviourを停止させる可能性があります)を取得していないことを確認できます。
これらの物理演算メソッドは以下と組み合わせるのが最適です。IsValid:
- Physics.Raycast – レイ(光線)を飛ばし、最初に衝突したものを返します。
- Physics.RaycastAll – レイ上ですべての衝突を返します。
- Physics.RaycastNonAlloc – 事前に割り当てられた配列を使用して結果を格納し、ガベージコレクションを削減します。
- Physics.SphereCast – Raycastと同様ですが、より広い検出範囲を持つ球体を使用します。
- Physics.SphereCastAll – 球体を使用して、すべてのヒット結果を返します。
- Physics.SphereCastNonAlloc – 事前に割り当てられた配列を使用する最適化されたバージョンです。
- Physics.OverlapSphere – 球体内のすべてのコライダーを返します。
- Physics.OverlapBox – ボックス内のすべてのコライダーを返します。
- Physics.OverlapCapsule – カプセル内のすべてのコライダーを返します。
- Physics.OverlapSphereNonAlloc – 事前に割り当てられた配列を使用する最適化されたバージョンです。
- Physics.OverlapBoxNonAlloc – 同上ですが、ボックス用です。
- Physics.OverlapCapsuleNonAlloc – 同上ですが、カプセル用です。
- Rigidbody.SweepTest – Rigidbodyが指定された方向に何かに衝突するかどうかを確認します。
- Rigidbody.SweepTestAll – Rigidbodyの経路上のすべてのヒット結果を返します。
- Physics.CapsuleCast – カプセルを指定した方向にキャストし、最初のヒットを検出します。
- Physics.CapsuleCastAll – カプセルを使用して、すべてのヒット結果を返します。
- Physics.CapsuleCastNonAlloc – 事前に割り当てられた配列を使用する最適化されたバージョンです。
- Physics.BoxCast – ボックスをキャストし、最初にヒットしたものを検出します。
- Physics.BoxCastAll – ボックスを使用して、ヒットしたすべてを返します。
- Physics.BoxCastNonAlloc – 事前に割り当てられた配列を使用する最適化バージョンです。
- Collider.Raycast – 単一のコライダーに対してレイをキャストします。
- Physics.CheckSphere – 球体がコライダーと重なっているかを確認します。
- Physics.CheckBox – ボックスがコライダーと重なっているかを確認します。
- Physics.CheckCapsule – カプセルがコライダーと重なっているかを確認します。
VRChatレイヤーにおけるインタラクションのブロックとパススルー
インタラクション(遠くからアイテムを掴む、レーザーでUI要素を切り替えるなど)は、ほとんどのVRChatレイヤーによってブロックされます。以下のレイヤーはインタラクションに対して透過的であり、それらを通してインタラクトすることが可能です:
UiMenuUIPlayerLocalMirrorReflection
ユーザーレイヤーのインタラクション・パススルー
ユーザーレイヤーを通じたインタラクションは、デフォルトでブロックされています。「Interact Passthrough」マスクを使用して、インタラクションを透過(インタラクションの通過を許可)させるレイヤーを定義してください。なお、衝突判定用レイ(光線)の発生源は、デスクトップ/モバイルプレイヤー(プレイヤーカプセル内)とVRプレイヤー(ユーザーのトラッキングされた手から)で異なります。つまり、VRプレイヤーは、プレイヤーのコライダーがブロックされている場合でも、手でコライダーを貫通させることが可能です。そのため、手が貫通している間、それらのコライダーはVRプレイヤーからのインタラクションをブロックしません。
脚注
レイヤー22〜31は、デフォルトでStickersに対して有効になっています。これらをInteraction Passthroughリストに追加することで無効化できます。 ↩ ↩2
最終更新: