up:: Unreal_Engine
source:: Windows - アクターが壁を通過してしまう現象について|teratail
source:: オブジェクトチャンネルについて - 妹でもわかるUnrealEngine4
source:: コリジョン反応の参照 | Unreal Engine ドキュメント
source:: コリジョンの概要 | Unreal Engine ドキュメント
source:: Overlap Triggering Every Tick - UE4 AnswerHub
コリジョンの細かな設定
Preset、Object Channel、Trace Channelの三つでできている。
Object Channelは普段の衝突用。
Trace Channelはレイトレース用の特別Channel。
物体の持つChannelごとに衝突設定をするのがPreset。
より抽象的に言うなら、自分から見た物体の振る舞いがPreset。
他者から見た自分の振る舞いがChannel。
基本はPresetだけでいい。物体によって他の物体がどう振る舞うかは変わるだろうし。他者から見て固有の振る舞いをするのであればChannelを足せばいい。
実際の設定はProject Settings→Engine→Collisionと、Mesh設定のCollisionでできる。
詳細
Presetではまず自分のChannelを決め、そのうえで他のchannelに対してどう衝突したいかを設定する。これを物体ごとに割り当てることで衝突判定は行われている。
Object Channelを使うのは、新しいPresetを適用した物体に対し、固有の制御をしたくなった時。
例えば、弾にWorld Static ChannelのBullet Presetを割り当てたとして、互いに当たりたくないからとWorld StaticをIgnoreにすると、トリガーに引っかからなくなってしまう。
こんな時にBullet ChannelのBullet Presetにすれば、Bullet ChannelをIgnoreにするだけで互いのみ当たらなくなる。
他には、弾で弾けるような物体がある場合でも、敵のPresetでBullet ChannelをBlockにすれば設定できる。
ChannelはObject、Traceそれぞれで18個までしか設定できないので、できるだけ多くのものが同じ振る舞いをするようにしよう。
だからって最初からそうできると思うなよ! 失敗して学べ!
さらに細かい話
Overlap
Generate Overlap Eventsにチェックを入れていないと、OverlapとIgnoreは事実上同じ結果を返す。
Overlapは双方にGenerate Overlap EventsがないとOverlap判定が行われない。
つまり特性上片方だけでOverlap Eventを起こすという処理はできず、必ず双方でOverlap Eventは呼び出されている。(公式ドキュメントでパフォーマンスのためって書かれてるし、たぶん消す処理より両方起こしてしまう処理のほうが軽い)
OverlapでTickしたいならBool作ってEvent Tickに組み込めばいいんじゃないかな。
Block
物をBlockしたい場合は、両方がBlockでないとBlockできない。
Blockの場合は、Simulation Generates Hit Eventsにチェックを入れたほうにのみHit Eventを返す。
HitはTick、ぶつかっている間は毎フレーム処理を行う。