はじめに
この記事はGWアドベントカレンダーという企画の「VCIアドベントカレンダー GW ver」8日目の記事です
今日はTriggerとKinematicの挙動と衝突検出について説明します。
(TriggerとKinematicに密接な関係があるわけじゃないですがまとめて説明します。ごちゃごちゃしてすみません。。。)
TriggerとKinematicの挙動
Trigger
(青がTriggerがOFF,赤がTriggerがOn)
TriggerをOnにすると上記画像のように物理衝突の影響を受けないようにする(すり抜けるようにする)ことが出来ます。
useGravityをOnにしてる場合は重力の影響は受けますが、衝突の影響を受けないため床も盛大にすり抜けます。
Utity上の以下の部分の「Is Trigger」にチェックを入れるとこで設定出来ます。
TriggerをOnにしても衝突判定自体は有効なため、何かとぶつかったときに検知したいが他の物体に影響を及ぼしたくないときに使用します。
いろいろなことをやろうとすると割と使う設定だと思います
Kinematic
(向かって左がkinematicがon、右がkinematicがOff)
KinematicをOnにすると上記画像のようにオブジェクトを空中に固定することが出来ます。他のオブジェクトで叩いても影響を受けません。
Utity上の以下の部分の「Is Kinematic」にチェックを入れるとこで設定出来ます。
チェックを付けない場合はふわふわ飛んでいく状態となるため、掴みやスクリプトでのみ移動させたいVCISubItemを作りたい時に、ここにチェックを入れて使用します。
いろいろなことをやろうとすると割と使う設定だと思います
衝突時の判定関数
Triggerとkinematicに関する衝突判定関数の取扱についてトピックを2つ紹介します
Triggerオブジェクトと非Triggerオブジェクトの衝突判定関数
Triggerと非Triggerの衝突時の実行関数は以下の通りとなります
item側trigger | hit側trigger | 発火関数 |
---|---|---|
off | off | onCollision~ |
on | off | onTrigger~ |
off | on | onTrigger~ |
on | on | onTrigger~ |
気をつける点として、いずれかがtriggerがonであればもう一方がoffであってもitem・hit側とも両方onTriggerが発火します。
自分のtriggerがoffであればonCollisionになるわけではないので注意です。
Kinematicとtriggerとボーンの衝突判定関数
Kinematicとボーンの衝突時の発火関数は以下の通りとなってます。
こちらは結構複雑でした。
kinematic | trigger | grab状態 | 発火関数 |
---|---|---|---|
off | on | - | onTrigger~ |
off | off | - | onCollision~ (掴んでから1回だけ) |
on | on | - | onTrigger~ |
on | off | grab中 | onCollision~ (掴んでから1回だけ) |
on | off | 非grab中 | 発火しない |
[2020/12/16 追記] ※ルームだと掴んでから1回という制限はないみたいです(確認時点) |
kinematicがon,triggerがoffの時はgrab中かどうかで動作が変わり、更にgrab中の時はonclissionが1回だけ走るようになっていました
(いろいろ試しましたが詳細条件あまり自信がないです。間違っていたら指摘いただけるとありがたいです)
とりあえずほかオブジェクトに干渉しなくていい場合はontriggerをonにして置けば問題ないかと思います。
おわりに
今回はTriggerとKinematic、及び衝突時の発火関数について紹介しました。
正直書いてる途中で間違っていることが判明して書い直したりもしたのであっているか自信がないです。
ただ、調べた範囲のことは書きましたので参考になればと思います(・ω・)