Open2
2Dマップの地形ごとに、今どの地形にいるかを判定させる
タイルマップじゃないマップで、各地形(3種以上)ごとに足音やパーティクル有無を変えたくて、とりあえずどの地形にいるかを判定できるような実装を考えた。
最終的にPolygonCollider2Dで区分けしたエリアをPhysics2D.OverlapPoint()で
エリア判定が必要なフレームでは都度判定するような実装になった。
(が、割と紆余曲折あった気がするので後日メモしたい)
最終的な実装は以下。
readonly Dictionary<string, SeInfo> seMap = new Dictionary<string, SeInfo>
{
{ "Default", new SeInfo(SELabel.Walk, 0) },
// 以下エリア分列挙する
};
public void PlayFootStepSE()
{
var seInfo = seMap["Default"];
var hits = new Collider2D[10];
var hit_count = Physics2D.OverlapPoint(footPoint.position, CreateFootstepContactFilter(), hits);
Debug.AssertFormat(hit_count < hits.Length, "チェック用bufferが満タンです. バッファを増やしてください.");
for (int i = 0; i < hit_count; i++)
{
var collider = hits[i];
SeInfo result = null;
seMap.TryGetValue(collider.name, out result);
if (result != null && result.priority > seInfo.priority)
{
seInfo = result;
}
}
// このへんでサウンドをならす
}
ContactFilter2D CreateFootstepContactFilter()
{
var filter = new ContactFilter2D();
filter.useLayerMask = true;
filter.layerMask = 1 << LayerName.Footstep;
filter.useTriggers = true;
return filter;
}