i-school - 索敵範囲のコライダーの誤判定を回避する
 索敵範囲のコライダーにEnemyタグがついていると、Playerが攻撃を行った際に、敵本体のコライダーだけではなく、索敵範囲や香華範囲といったコライダーまで
接触判定として拾ってしまうケースがあります。

索敵範囲のコライダー画像




対策

1.索敵範囲などのゲームオブジェクトのTagをEnemy以外に変更する


 Playerの武器による接触判定ではOnTriggerEnterメソッドを利用しており、その処理の中でTagによって「どのゲームオブジェクトと接触したか」を分岐しています。
索敵範囲用のゲームオブジェクトのTagがEnemyになっていると、この処理が通ってしまって、敵本体のコライダーに加えて、
索敵範囲のコライダーも敵であると誤判定してしまい、ダメ―ジ処理が行われてしまいます。

 そのため索敵範囲のコライダーのTagはEnemyではなく、他のTagにすることでこの現象を回避できます。Untagged (Tag設定なしの状態)でもよいですし、
新しく SearchArea といったTagを作成して、それを索敵範囲のゲームオブジェクトに設定すれば、OnTriggerEnterメソッドでの誤判定を防ぐことができます。






2.Layermaskを変更する


 UnityではTagの他にLayermask(Layer)と呼ばれるマスキング処理が設定できます。ゲームオブジェクトへの設定場所は名前の下です(Tagの左側)。

ゲームオブジェクトのLayerの設定場所(インスペクター内)



 Layermaskの新規の登録方法も同じで、このゲームオブジェクトのLayer設定の部分で Add Layer を選択すれば、任意の名前でLayerを登録できます。
 
 Layerには Layer Collision Matrix と呼ばれる設定があり、どのLayer同士が接触するのか、あるいは接触しないのか、という部分をチェックボックスで設定できます。

 設定場所はUnityのメニューから Edit => Project Settings を開いてポップアップを開きます。
ポップアップの左側のメニュー内の Physics (あるいは Physics2D) を選択し、右側の詳細情報をPhysicsの内容に切り替えます。


ProjectSettingsの開き方 動画
https://gyazo.com/d441ced3cf88c346dd0c436aa34d7aef


 この項目の最下段に Layer Collision Matrix の設定箇所があります。基本的にはすべてのLayer同士のチェックが入っている状態で、接触する状態になっています。
ここでLayer同士の名前を見て接触させたくないLayer同士のチェックを外します。これでこのLayer同士では接触判定が発生しなくなります。

 下記の画像では、Weapon と SearchArea のLayerのチェックを外していますので、このLayer同士の間では接触判定を発生しないように設定しています。


Layer Collision Matrix画像


 
 Layer Collision Matrixの設定を変更したら、この設定を利用したいゲームオブジェクトのLayerを変更しておきます。




<スクリプトから動的にTagやLayerMaskを切り替える方法>

 
Tagの変更方法

// Tagの文字列を設定
string tag = "Player";

// Tagを変更したいゲームオブジェクトのTagを指定して変更する
gameObject.tag = tag;


Layerの変更方法

// Layerの文字列を設定
string layerName = "SearchArea";

// Layerを変更したいゲームオブジェクトのLayerを指定して変更する
gameObject.layer = LayerMask.NameToLayer(layerName);