コンタクト
コンタクトは、アバターやワールドが他のコンタクトとの衝突を検知するためのシステムです。衝突を利用することで、アバターやワールドの挙動を制御し、あらゆる種類の独自のアクションを実行させることができます。
これらは通常のUnityのコライダーとは別物です。コンタクトは「センダー(Sender)」と「レシーバー(Receiver)」に分類されます。センダーは検知されるために存在し、レシーバーはセンダーを検知して、それに応じてパラメーターを更新したりイベントをトリガーしたりします。
アバターでコンタクトを使用する場合、使用するコンタクトの数はパフォーマンスランクに影響を与えます。
VRCContactSender
Contact Senderコンポーネントは、Contact Receiverと接触した際にContact信号を送信する空間の体積を定義します。
![]()
Root Transform- このコンタクトが配置されるTransformです。空の場合、このGameObjectのTransformが使用されます。
Shape
このセクションには、ContactSenderの形状を定義する設定が含まれています。
Shape Type- このコンタクトで使用されるコリジョン形状のタイプです。Sphere(球体)、Capsule(カプセル)、Box(箱)から選択できます。Radius- 原点から広がるコライダーのサイズです。Shape TypeがSphereまたはCapsuleに設定されている場合にのみ使用されます。Height- Y軸に沿ったカプセルの高さで、両端の半球を含みます。Shape TypeがCapsuleに設定されている場合にのみ使用されます。Size- 各軸に沿ったボックスコライダーのサイズです。Shape TypeがBoxに設定されている場合にのみ使用されます。Position- ルートTransformからの位置オフセットです。Rotation- ルートTransformからの回転オフセットです。
コンタクト形状の半径は最大3メートル、幅/高さ/奥行きは最大6メートルに制限されています。コンタクトがスケーリングされたGameObjectにアタッチされている場合、これらの制限はスケーリング後に適用されます。
Filtering
このセクションには、このContactSenderがContactReceiverとどのように相互作用するかを調整および定義するための設定が含まれています。
Local Only- アバター上のContact Senderでのみ利用可能です。このコンタクトをローカルクライアントでのみ機能するように制限します。有効にすると、このコンタクトはアバターのパフォーマンスランクに影響を与えません。Content Types- ワールド内のContact Senderでのみ利用可能です。このContact Senderが、ワールド、アバター、またはアイテム上のどのContact Receiverをトリガーするかを設定できます。Collision Tags- 何に影響を与え、何から影響を受けるかを指定する文字列のリストです。衝突を成功させるには、送信側と受信側の両方に少なくとも1つの一致する文字列ペアが必要です。衝突タグは大文字と小文字を区別します。1つのコンタクトにつき最大16個のタグを設定できます。
例として、以下のタグを設定すると、デフォルトのHead ContactReceiverや、Faceというタグを持つカスタムのContactReceiver(Fが大文字であることに注意してください!)と接触したときにコンタクト信号が送信されます。
![]()
タグには任意のテキストを使用できますが、SDKには、自身で作成していないアバターやワールドとも連携するコンタクトシステムを簡単に作成できるように、推奨されるタグのリストが用意されています。詳細についてはBuilt-In Contact Tagsを参照してください。
カスタム衝突タグを使用する場合は、組み込みタグの形式に合わせてPascalCaseで記述することを推奨します。
Standard Colliders
アバターには、「Colliders」と呼ばれるセクション内に一連の「Standard Colliders(標準コライダー)」がAvatar Descriptorで定義されています。このセクションでは、すべてのアバターに存在する標準的なコライダーを定義できます。これらは特に変更しなければ自動的に設定されますが、自身のアバターに合わせて微調整することも可能です。これらのコライダーはパフォーマンス評価には影響しません。
- Head
- Torso
- Hands L/R
- Feet L/R
- Fingers L/R
- Index
- Middle
- Ring
- Little
これらのコライダーは、主に他の人が自分のアバターで検知できる組み込みの身体部位タグを使用したContact Senderとして機能します。しかし、指と手のコライダーは、他の人のPhysBoneやワールド内のPhysBoneに影響を与えることができるグローバルなPhysBoneコライダーを作成するためにも使用されます。
VRCContactReceiver
VRCContactReceiver コンポーネントは、Contact Sender と接触した際に信号を受け取る空間の範囲を定義します。
![]()
Root Transform- このコンタクトが配置される場所の Transform です。空の場合、この GameObject の Transform が使用されます。
Contact Receiver が Contact Sender から信号を受け取った際の挙動は、その Contact Receiver が何に属しているかによって異なります。
- Contact Receiver がアバターの一部である場合、アバター制作者が定義した方法で Animator Parameter を設定します。
- Contact Receiver がワールドの一部である場合、代わりに Receiver と同じ GameObject にアタッチされているすべての Udon ビヘイビアに対して、以下のいずれかのイベントを発生させます。
OnContactEnter(ContactEnterInfo contactInfo)- Contact Sender が Contact Receiver に接触し始めたときに発生するイベント。OnContactExit(ContactExitInfo info)- Contact Sender が Contact Receiver から離れたときに発生するイベント。
Shape
このセクションには、ContactReceiver の形状を定義する設定が含まれています。
Shape Type- このコンタクトで使用されるコリジョン形状のタイプです。Sphere(球)、Capsule(カプセル)、Box(ボックス)から選択できます。Radius- 原点から拡張されるコライダーのサイズです。Shape Type が Sphere または Capsule に設定されている場合にのみ使用されます。Height- Y 軸に沿ったカプセルの高さです(両端の半球を含みます)。Shape Type が Capsule に設定されている場合にのみ使用されます。Size- 各軸に沿ったボックスコライダーのサイズです。Shape Type が Box に設定されている場合にのみ使用されます。Position- ルート Transform からの位置オフセットです。Rotation- ルート Transform からの回転オフセットです。
コンタクトの形状は、最大半径 3 メートル、最大幅/高さ/奥行き 6 メートルに制限されています。コンタクトがスケールされたゲームオブジェクトにアタッチされている場合、これらの制限はスケーリング後に適用されます。
Filtering
このセクションには、この ContactReceiver が ContactSenders とどのように相互作用するかを調整・定義するための設定が含まれています。
Allow Self- アバター上の Contact Receiver でのみ利用可能です。自分自身がこのコンタクトに影響を与えることを許可します。Allow Others- アバター上の Contact Receiver でのみ利用可能です。他人がこのコンタクトに影響を与えることを許可します。Local Only- アバター上の Contact Receiver でのみ利用可能です。このコンタクトをローカルクライアントのみで動作するように制限します。これを有効にすると、そのコンタクトはアバターの パフォーマンスランク を低下させません。- このオプションを有効にすることで、1 つのアバターにつき最大 256 個のコンタクトコンポーネントを使用できます。この制限を超えると、アバターをアップロードできなくなります。
Content Types- ワールド内の Contact Receiver でのみ利用可能です。この Contact Receiver がワールド、アバター、またはアイテム内のどの Contact Receiver をトリガーするかを設定できます。Collision Tags- 何に影響を与えるか、何から影響を受けるかを指定する文字列のリストです。衝突を成功させるには、送信側と受信側の両方に一致する文字列のペアが少なくとも 1 つ必要です。Collision tags は大文字と小文字を区別します。1 つのコンタクトには最大 16 個のタグを設定できます。
Receiver
このセクションには、信号を受け取った際に Receiver が何を行うかを定義する設定が含まれています。
アバター上の Receiver
アバターで使用する場合、Contact Receiver はコンタクト信号に応答して、アバターの Animator 内の Animator Parameter を設定します。
Receiver Type は、信号を受信した際のパラメータ設定の動作を定義します。
Constant- 接触が存在している間、そのことを通知します。接触が検知されなくなるとリセットされます。bool型のパラメータを使用するのが理想的です。Float型の場合は1.0に、Bool型の場合はTrueに、Int型の場合は1に設定されます。OnEnter- 接触が検知されたフレームを通知します。次のフレームですぐにリセットされます。bool型のパラメータを使用するのが理想的です。Float型の場合は1.0に、Bool型の場合はTrueに、Int型の場合は1に設定されます。オプションでMin Velocityを定義することも可能です。Proximity- 後述するように、接触がトリガーにどれだけ近いかに応じた0.0-1.0のFloat値を返します。必ずFloat型を使用してください。複数の接触が検知された場合は、最も近いものが適用されます。Parameter- アニメーションコントローラー上で更新されるパラメータです。このパラメータは、同期されるAvatar Parameterリスト上で定義する必要はありません。Receiver Typeに応じて、Float、Bool、またはInt型を使用できます。Value- 衝突が検知された際にパラメータが更新される値です。衝突がなくなると、パラメータはゼロにリセットされます。Min Velocity- このトリガーに影響を与えるために必要な、進入してくるコライダーの最小速度です。OnEnterタイプでのみ有効になります。
近接値(proximity)は、接触がトリガーの中心からどれだけ近いかを示します。これは、SenderからReceiverまでの最も近い点として計算されます。
ボックス形状のContact Receiverの場合、Use Face Proximity オプションを有効にできます。このオプションを有効にすると、近接値の計算方法が変更され、接触がボックスの正のZ面(positive Z face)からどれだけ近いかを示すようになります。
ワールド内のReceiver
ワールド内のContact Receiverコンポーネントには、ボックス形状のContact Receiverの近接計算の設定(上記参照)を除き、設定可能なオプションはありません。 その代わり、Receiverは常に、そのReceiverと同じGameObjectにアタッチされたUdonスクリプト内のイベントを呼び出すことで、接触信号に応答します。Udonを使用して接触を処理する方法の詳細については、以下のセクションを参照してください。
ワールドでのUdonアクセス
- ワールド内の Contact Sender および Contact Receiver を参照するフィールドや変数は、それぞれ型
VRCContactSenderおよびVRCContactReceiverを使用して作成できます。これら2つのクラスは名前空間VRC.SDK3.Dynamics.Contact.Componentsに含まれています。引数の型であるContactEnterInfoとContactExitInfoは、名前空間VRC.Dynamicsに含まれています。 - Contact Sender と Contact Receiver が接触したタイミングを検知するには、Contact Receiver コンポーネントと同じゲームオブジェクトに UdonGraph または UdonSharp ビヘイビアをアタッチし、以下のイベントを使用します。
OnContactEnter(ContactEnterInfo contactInfo)- Contact Sender が Contact Receiver に接触し始めたときに呼び出されます。パラメータは、接触に関する情報を含むデータ構造です。ContactSenderProxy contactSender- この衝突に関与した Contact Sender コンポーネントへの参照。ContactReceiverProxy contactReceiver- この衝突に関与した Contact Receiver コンポーネントへの参照。Vector3 enterVelocity- 接触点における、Contact Receiver に対する Contact Sender の相対速度。Vector3 contactPoint- ワールド空間における、Contact Receiver 表面上の推定接触点。string[] matchingTags- Contact Sender と Contact Receiver が共通して持つタグの配列。
OnContactExit(ContactExitInfo contactInfo)- Contact Sender が Contact Receiver から離れたときに呼び出されます。Enterイベントと同様、パラメータは衝突に関する情報を持つデータ構造です。ContactSenderProxy contactSender- この衝突に関与した Contact Sender コンポーネントへの参照。ContactReceiverProxy contactReceiver- この衝突に関与した Contact Receiver コンポーネントへの参照。string[] matchingTags- Contact Sender と Contact Receiver が共通して持つタグの配列。
- 上記の各イベントにおいて、
contactSenderとcontactReceiverは、衝突に関与している Contact Sender と Contact Receiver を参照するプロキシオブジェクトです。==または!=を使用してこれら2つのオブジェクトを比較することで、ワールド内のVRCContactSenderまたはVRCContactReceiverと一致するかを確認できます。プロキシオブジェクト自体には以下のプロパティが含まれています。 bool isValid- このプロキシオブジェクトが有効なコンタクトコンポーネントを参照している場合に true、そうでない場合に false を返します。他のプロパティにアクセスする前に、これが true であることを確認してください。VRCPlayerApi player- 該当する場合、コンタクトコンポーネントを所有するプレイヤーへの参照。ワールド内のコンタクトコンポーネントの場合、この値は null になります。DynamicsUsage usage- コンタクトコンポーネントがどのようなコンテンツに属しているかを示します。ワールドの一部であるコンタクトの場合はWorldになり、アバターの一部である場合はAvatarになります。Vector3 position- コンタクトコンポーネントのルートトランスフォームのワールド空間位置。Quaternion rotation- コンタクトコンポーネントのルートトランスフォームのワールド空間回転。Vector3 scale- コンタクトコンポーネントのルートトランスフォームの lossy scale。- Contact Sender または Contact Receiver のフィールドを取得・設定することで、
radius、height、size、position、およびrotationプロパティの読み取りと設定が可能です。 - これらのプロパティを変更した場合は、変更が完了した後に必ず Contact に対して
ApplyConfigurationChanges()を呼び出してください。これを行わないと、変更が Contact に反映されません。 - コンタクトの設定変更は負荷がかかる場合があります! 頻繁に行うとパフォーマンスの問題を引き起こし、プレイヤーにとって快適なワールド体験が損なわれる可能性があるため、プロパティの変更は必要以上に頻繁に行わず、適用する前にできるだけ多くの変更をバッチ処理するようにしてください。
- Receiver の
CalculateProximity()メソッドを使用して、Receiver と Sender 間の近接度をいつでも計算できます。これは0.0-1.0からの Float 値を返し、Sender が Receiver の中心にどれだけ近いか(Receiver がUse Face Proximityを有効にしたボックス型の場合は、その正のZ面に対する近さ)を表します。 UpdateContentTypes(DynamicsUsageFlags newContentTypes)およびUpdateCollisionTags(string[] newCollisionTags)メソッドを使用して、コンタクトの許可されるコンテンツタイプと衝突タグのセットを変更できます。- コンタクトには16タグというハードリミットがあることに注意してください。16個を超えるタグを設定しようとした場合、最初の16個のみが適用されます。
最終更新: