最初に
・実行環境のUnityはバージョン[2019.3.1f1]です!
・OnTriggerEnter()やOnCollisionEnter()で当たり判定じゃなくて、RayCast()でヒットした判定を行いたい。
・引数にLayerMaskを指定する場合で特定のオブジェクトのLayerを(「Project Settings」の「Physics」の「Layer Collision Matrix」のマトリクスを)引数にしたい場合。
#日本語がもう駄目かも
ごにゃごにゃ書くの面倒なのでソースと結果(画像)を乗っけます。
(マトリクス作成)汎用的なスクリプトか何か
GameSetting.cs
usingUnityEngine;usingSystem.Collections.Generic;publicclassGameSetting:ScriptableObject{privatestaticGameSettings_instance=null;publicstaticGameSettingInstance{get{if(s_instance==null){InitMaskTable();s_instance=CreateInstance<GameSetting>();}returns_instance;}}privatestaticDictionary<int,int>_masksByLayer;privatestaticvoidInitMaskTable(){_masksByLayer=newDictionary<int,int>();for(inti=0;i<32;i++){intmask=0;List<string>name=newList<string>();for(intj=0;j<32;j++){if(!Physics.GetIgnoreLayerCollision(i,j)){mask|=1<<j;//Debugif(LayerMask.LayerToName(j)!=""){name.Add(LayerMask.LayerToName(j));}}}//Debugif(LayerMask.LayerToName(i)!=""){Debug.Log("["+LayerMask.LayerToName(i)+"] is masked ["+string.Join(",",name)+"]");}_masksByLayer.Add(i,mask);}}publicintMaskForLayer(intlayer){return_masksByLayer[layer];}}
(使い方)RayCastで当たり判定を行おうとしているスクリプトのやつ。
Bullet.cs
~~省略~~if(Physics.Raycast(startPosition,direction,outRaycastHithit,distance,GameSetting.Instance.MaskForLayer(gameobject.layer),QueryTriggerInteraction.UseGlobal))~~省略~~
結果
Unity起動してのログ
Physicsのマトリクスで指定したと通りのログが出力されてます。
※例を挙げるとマトリクス(左下)で[Area]にチェックが入っているのは[PeopleForArea]だけで、
ログ(右下)でも"[Area] is masked [PeopleForArea]"と確認できる。
[情報元]
https://forum.unity.com/threads/is-there-a-way-to-get-the-layer-collision-matrix.260744/