現在開発中のこのゲーム、
プレイヤー(AI)同士はぶつかりません。
コライダーがあるオブジェクト同士で、
「このオブジェクト同士はぶつからせたくないなー」て時は、
「Edit」→「ProjectSetting」→「Physics2D」を選ぶと、レイヤー同士のリストが表示されます。
(注意:)3dで開発してるときは「Physics」を選ぼう
「Runner」のチェックを外すことで、Runner同士はぶつからないのです。
ちなみにオブジェクトにレイヤーを設定したいときは、
インスペクタの右上からレイヤーを選択でき
レイヤーを追加するには
「Edit」→「ProjectSettings」→「Tags and Layers」を選択。
インスペクターに、Tag、SortingLayer,Layerが表示されます。
こんな感じで、
オブジェクト同士をぶつからせたくなければエディタを編集するだけでOK。
さて、ここで本題。
私が開発しているゲームのプレイヤーは「ブースト」がつかえます。
ブーストはただ早くなるだけじゃなくて、ぶつかることで相手を妨害出来たら、より競争としての駆け引きが成り立つんじゃないかと考えた。
今回やりたい事は、ブーストで相手を転ばせたい! つまり、
ブーストの時だけ当たり判定を有効にしたい!!
というわけで
ぶつからない設定をしている物体同士が、ある条件の時だけぶつかるようにする方法を実装してみました。
とても簡単です。
まず、「BoostRunner」というレイヤーを用意する。
これとRunnerレイヤーは判定が出来るように設定。↓
↑ RunnerとRunnerはすり抜ける、BoostRunnerとRunnerはぶつかる、BoostRunner同士もすり抜ける……
あとはブーストの発生時にこのレイヤーに切り替えます。
//プレイヤーのレイヤーを「BoostRunner」に切り替える
gameObject.layer = LayerMask.NameToLayer("BoostRunner");
ブーストが終了、もしくは相手にぶつかったら
gameObject.layer = LayerMask.NameToLayer("Runner");
等のスクリプトで元に戻します。
これで、普段はすり抜けるプレイヤー同士がブーストの時だけ当たり判定するようになりました!
あとは、いつも通り、ぶつかったときに転ぶなりすればいいです。
以上。レイヤーを使った当たり判定制御でした。