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;
    }