Menu
CoddyTech

レイヤーとLayerMask

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 36/63。

すべてのGameObjectは1つのレイヤーに属し、Inspectorの上部にあるLayerメニューで選択します。Unityには32個のレイヤーがあります。いくつかは組み込みで用意されています(0 Default、2 Ignore Raycast、4 Water、5 UI)。独自のレイヤーはTags and Layersで、User Layer 3から名前を付けて追加します。LayerMaskはレイヤーの集合で、各レイヤーに1ビットずつ割り当てられています。maxDistanceの後にレイキャストへ渡すと、レイはその集合に含まれないレイヤー上のすべてのコライダーを無視します。

このプレイヤーは敵の頭の上ではなく、地面からジャンプする必要があります。床をGroundレイヤーに設定し、スクリプトにLayerMaskフィールドを追加すると、Inspectorにメニューが表示され、そこでGroundにチェックを入れられます。

[SerializeField] private LayerMask groundMask;

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}

Groundだけを含むマスクを使えば、プレイヤー自身が検出されるのも防げます。レイは開始位置が内部にあるコライダーはスキップしますが、子オブジェクトのコライダーなど、プレイヤーの他のコライダーはスキップしません。また、後のレッスンで扱うオーバーラップ判定ではプレイヤー自身のコライダーも検出されるため、マスクなしで足元を判定すると、常に接地していると判定されます。プレイヤーとその子オブジェクトをPlayerレイヤーに設定し、判定に使うマスクからPlayerを除外してください。コードでは、LayerMask.GetMask("Ground", "Platform")でレイヤー名からマスクを作成でき、マスクの前に~を付けると、そのマスクに含まれていないすべてのレイヤーに反転します。

challenge icon

チャレンジ

中級

偵察役は前方にあるものを報告するはずですが、LookAhead()は常にLanternを返します。Rayは、内部から始まっているScoutの体を通り抜け、その後、Scoutが前方に掲げているランタンに当たります。ScoutとそのLanternはPlayerレイヤーにあります。SpotterのLookAhead()を修正しましょう:

  • LayerMask.GetMaskを使って、コード内でPlayer以外のすべてのレイヤーのマスクを作成します。
  • そのマスクをRaycastに渡します。rangeはそのまま使い、Rayがランタンを通り抜けて、その先にある最初のものを報告するようにします。

Playを押して、矢印キーで偵察役の向きを変えます。Consoleに見えているものが記録されます。その後、Checkを押します。

自分で試してみよう

using UnityEngine;

public class Spotter : MonoBehaviour
{
    public float range = 10f;
    private string last = "";

    void Update()
    {
        string seen = LookAhead();
        if (seen != last)
        {
            Debug.Log("Ahead: " + seen);
            last = seen;
        }
    }

    // 前方のrange内で最初に見つかったものの名前。見つからなければ"nothing"。
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

物理演算とゲームプレイのすべてのレッスン