VRChatにおけるUnityのLayers
Layersは、UnityにおいてGame Objectsを整理したり、Game Objects間のcollisions(衝突)やRaycastsを判定したり、シーンの一部を選択的にrender(描画)したりするために使用されます。
VRChatワールドでは、ほとんどのLayersを自由に使用できます。 一部のLayersはUnityとVRChatで共有され、使用されます。
VRChatのWorlds SDKを使用してUnityプロジェクトを作成すると、VRChatの組み込みLayersを使用するようにプロジェクトが自動的に設定されます。Collision Matrixを変更したり、組み込みのLayersの名前を変更したり削除したりした場合、ワールドをVRChatにアップロードするとそれらの変更は上書きされます。
22〜31番のLayersは、Unityの未使用の「User」Layersです。これらは自由に変更でき、これらのLayersに対する変更はワールドのビルドおよびアップロード時に破棄されることはありません。
Unityの組み込みレイヤー
以下の表は、Unityの組み込みレイヤーと、VRChatでの使用方法、およびユーザーがそれらのレイヤーにステッカーを配置できるかどうかをまとめたものです。
| Layer number | Layer Name | Description | Can have stickers |
|---|---|---|---|
| 0 | Default | UnityのGameObjectでデフォルトで使用されます。VRChatのアバターペデスタルで使用されます。 | ✔ |
| 1 | TransparentFX | UnityのFlareアセットで使用されます。VRChatのPhysboneおよびContactのオーバーレイデバッグ表示で使用されます。 | ❌ |
| 2 | IgnoreRaycast | レイヤーマスクが指定されていない場合、Unityの物理演算Raycastによって無視されます。VRChatの物理演算Raycastでは無視されません。 | ❌ |
| 3 | Item | ユーザーがワールドに配置したVRChatのアイテムで使用されます。ワールドをアップロードすると、このレイヤーにあるGameObjectはすべてLayer 0 (Default) に移動されます。 | ❌ |
| 4 | Water | UnityのStandard Assetsで使用されます。VRChatのポータルで使用されます。VRChatのミラーで使用されます。UnityのPost Processingによく使用されます。 | ✔ |
| 5 | UI | ⚠ このレイヤーの使用は推奨されません。UnityのUIでデフォルトで使用されます。プレイヤーがVRChatメニューを開いている場合を除き、VRChatのUIポインターによって無視されます。カメラで「UI」が有効になっていない限り、VRChatのカメラによって無視されます。 | ❌ |
| 6 | reserved6 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約レイヤーにあるGameObjectはすべてLayer 0 (Default) に移動されます。 | ❌ |
| 7 | reserved7 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約レイヤーにあるGameObjectはすべてLayer 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のRaycastをブロックしません。 |
❌ |
| 19 | InternalUI | ⚠ このレイヤーの使用は避けてください。メニュー、ネームプレート、デバッグパネルなど、VRChatの内部UI要素に使用されます。 | ❌ |
| 20 | HardwareObjects | ⚠ このレイヤーの使用は避けてください。コントローラーやトラッカーなど、物理的なハードウェアの仮想表現をゲーム内で描画するためにVRChatで使用されます。 | ❌ |
| 21 | reserved4 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約レイヤーにあるGameObjectはすべてLayer 0 (Default) に移動されます。 | ❌ |
| 22-30 | UnityおよびVRChatでは使用されていません。アップロードされたワールドにおいて、VRChatはこれらのレイヤーの名前や衝突マトリックスを上書きしません。 | (✔)1 | |
| 31 | ⚠ このレイヤーの使用は避けてください。Unityエディターのプレビューウィンドウの仕組みで使用されます。 | (✔)1 |
ステッカー
ステッカーを使用すると、VRChat+ ユーザーはワールド内の Collider コンポーネントに画像を配置できるようになります。
ステッカーはすべてのレイヤーに配置できるわけではありません。Collider コンポーネントにステッカーを配置されたくない場合は、そのレイヤーを変更してください。VRChatとUnityで使用されていないレイヤー8("Interactive")を使用することをお勧めします。
ステッカーの配置を一切許可したくない場合は、VRChatウェブサイトでワールドを編集し、ステッカーを無効にしてください。
Physicsとレイヤー
Physics操作を使用する際は、予約済みレイヤー(Reserved layers)上のオブジェクトを避けるため、判定対象とするレイヤーを限定することをお勧めします。また、Physicsの呼び出しから返されたオブジェクトに対して Utilities.IsValid を使用し、誤って「保護された」オブジェクトを取得していないか確認することも重要です。これに該当すると null が発生し、UdonBehaviourが停止する可能性があります。
以下のPhysicsメソッドは、`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レイヤーにおけるInteractionのブロックとパススルー
Interaction(離れた場所からアイテムをつかむ、レーザーでUI要素を切り替えるなど)は、ほとんどのVRChatレイヤーによってブロックされます。以下のレイヤーはInteractionに対して透過的であり、それらを通り越して操作を行うことが可能です。
- UiMenu
- UI
- PlayerLocal
- MirrorReflection
ユーザーレイヤーのInteraction Passthrough
デフォルトでは、ユーザーレイヤーを介したインタラクションはブロックされます。インタラクションを透過(通過を許可)させるレイヤーを定義するには、「Interact Passthrough」マスクを使用してください。デスクトップ/モバイルプレイヤーでは衝突判定のレイ(ray)がプレイヤーのカプセル内から発生するのに対し、VRプレイヤーではトラッキングされた手から発生するという点に注意してください。つまり、VRプレイヤーはプレイヤーコライダーがブロックされている場合でも、手をコライダー内に潜り込ませることが可能です。そのため、手がコライダー内に潜り込んでいる状態では、そのコライダーによってVRプレイヤーのインタラクションがブロックされることはありません。
-
レイヤー 22〜31 は、デフォルトでステッカーが有効になっています。Interaction Passthrough リストに追加することで、無効にすることができます。 ↩↩
最終更新: