VRChatにおけるUnityレイヤー
Layersは、UnityにおいてGame Objectを整理し、Game Object間のcollisionsやRaycastsを決定したり、シーンの一部を選択的にrenderしたりするために使用されます。
VRChatのワールドでは、ほとんどのレイヤーを自由に使用できます。 一部のレイヤーはUnityとVRChatで共有され、使用されます。
VRChatのWorlds SDKを使用してUnityプロジェクトを作成すると、プロジェクトはVRChatの組み込みレイヤーを使用するように自動的に構成されます。コリジョンマトリックスを変更したり、組み込みレイヤーの名前を変更または削除したりした場合、ワールドをVRChatにアップロードする際にその変更は上書きされます。
レイヤー22から31は、Unityの「User」レイヤーであり、使用されていません。これらは自由に変更でき、ワールドのビルドおよびアップロード時に変更が破棄されることはありません。
Unityの組み込みレイヤー
以下の表は、Unityの組み込みレイヤー、VRChatにおけるそれらの使用方法、およびユーザーがstickersを配置できるかどうかをまとめたものです。
| レイヤー番号 | レイヤー名 | 説明 | ステッカー配置 |
|---|---|---|---|
| 0 | Default | Unityのゲームオブジェクトでデフォルトで使用されます。VRChatのアバターペデスタルで使用されます。 | ✔ |
| 1 | TransparentFX | Unityのフレアアセットで使用されます。 | ❌ |
| 2 | IgnoreRaycast | レイヤーマスクが指定されていない場合、UnityのPhysics Raycastで無視されます。VRChatのPhysics Raycastでは無視されません。 | ❌ |
| 3 | Item | ユーザーがワールド内に配置したVRChatアイテムで使用されます。ワールドをアップロードすると、このレイヤーにあるすべてのゲームオブジェクトはLayer 0 (Default) に移動されます。 | ❌ |
| 4 | Water | Unityのスタンダードアセットで使用されます。VRChatのポータルで使用されます。VRChatのミラーで使用されます。Unityのポストプロセッシングで頻繁に使用されます。 | ✔ |
| 5 | UI | ⚠ このレイヤーの使用は推奨されません。UnityのUIでデフォルトで使用されます。プレイヤーがVRChatメニューを開いていない限り、VRChatのUIポインターによって無視されます。カメラで「UI」が有効になっていない限り、VRChatのカメラによって無視されます。 | ❌ |
| 6 | reserved6 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約済みレイヤー上のすべてのゲームオブジェクトはLayer 0 (Default) に移動されます。 | ❌ |
| 7 | reserved7 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約済みレイヤー上のすべてのゲームオブジェクトは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 | ⚠ このレイヤーの使用は避けてください。メニュー、ネームプレート、デバッグパネルなどの内部UI要素に対してVRChatが使用します。 | ❌ |
| 20 | HardwareObjects | ⚠ このレイヤーの使用は避けてください。コントローラーやトラッカーなど、物理ハードウェアの仮想表現をゲーム内で描画するためにVRChatが使用します。 | ❌ |
| 21 | reserved4 | ⚠ このレイヤーの使用は避けてください。VRChatによって予約されています。ワールドをアップロードすると、予約済みレイヤー上のすべてのゲームオブジェクトはLayer 0 (Default) に移動されます。 | ❌ |
| 22-30 | UnityおよびVRChatでは使用されていません。VRChatは、アップロードされたワールドにおいてこれらのレイヤーの名前や衝突行列を上書きしません。 | (✔)1 | |
| 31 | ⚠ このレイヤーの使用は避けてください。Unityエディターのプレビューウィンドウの仕組みで使用されます。 | (✔)1 |
ステッカー
ステッカーを使用すると、VRChat+ ユーザーはワールド内の Collider コンポーネントに画像を配置できます。
ステッカーはすべてのレイヤーに配置できるわけではありません。Collider コンポーネントにユーザーがステッカーを配置できないようにしたい場合は、そのレイヤーを変更してください。VRChatやUnityで使用されていないレイヤー8("Interactive")を使用することをお勧めします。
ワールド全体でステッカーを許可したくない場合は、VRChatウェブサイトでワールドを編集し、ステッカーを無効にしてください。
物理演算とレイヤー
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レイヤーにおけるインタラクションのブロックとパススルー
インタラクション(遠くにあるアイテムをつかむ、レーザーでUI要素を切り替えるなど)は、ほとんどのVRChatレイヤーによってブロックされます。以下のレイヤーはインタラクションに対して透過的であり、それらを通り抜けてインタラクションを行うことが可能です。
- UiMenu
- UI
- PlayerLocal
- MirrorReflection
ユーザーレイヤーのインタラクション・パススルー
デフォルトでは、ユーザーレイヤーを介したインタラクションはブロックされます。インタラクションを透過させたい(インタラクションが通り抜けることを許可したい)レイヤーを指定するには、"Interact Passthrough" マスクを使用してください。なお、衝突判定用レイの発生源は、デスクトップ/モバイルプレイヤー(プレイヤーカプセル内)と、VRプレイヤー(ユーザーのトラッキングされた手)で異なります。そのため、VRプレイヤーは自身のプレイヤーコライダーがブロックされている状況でも、手を使ってコライダーに侵入することが可能です。結果として、手そのものがコライダーに侵入しているため、そのコライダーはVRプレイヤーからのインタラクションをブロックしなくなります。
-
レイヤー 22〜31 は、デフォルトで Stickers に対して有効になっています。Interaction Passthrough リストに追加することで無効化できます。 ↩↩
最終更新: