読者です 読者をやめる 読者になる 読者になる

いんでぃーづ

個人でゲーム開発してる上で吸収したモノたち紹介。UnityからGIMPまでなんでも。デザインとかゲーム論まで語っちゃうよ的なアレ。

MENU
{スポンサーリンク}

Unity : レイヤーマスク値のつくりかた

Tips Unity

Physics.Raycast などで当たり判定を使う場合、レイヤーマスクを使うと余分な当たり判定処理を防ぐことができます。
で、レイヤーマスクを扱う方法が色々ありますよという、お話。



1. インスペクターから指定する

LayerMask型の変数を定義すれば、インスペクタでセレクトボックスを表示できます。

public class LayerMaskTest : MonoBehaviour {


  public LayerMask mask;

  void Start () {
  }

}

f:id:sugar_affordance:20150209183308p:plain

さらにこの変数の値は、マスク値として直接使うことができるのです!

using UnityEngine;
using System.Collections;

public class LayerMaskTest : MonoBehaviour {


  public LayerMask mask;

  void Start () {

    // LayerMask型の変数をそのまま使う
    if (Physics.Raycast(transform.position,
      transform.forward,
      float.PositiveInfinity,
      mask.value) ) {

      Debug.Log("Raycast Hit!");
    }

  }

}


これを読んでいるアナタ、これでもう不要なビット演算とはおさらばですne!

2. 文字列から指定する

レイヤー名を文字列で持っているという場合もあるでしょう。
その場合、文字列からレイヤーマスクを作ることができます。
LayerMask.GetMask関数を使いましょう。

using UnityEngine;
using System.Collections;

public class StringLayerMaskTest : MonoBehaviour {

    const string LayerName = "TestLayer";

    void Start () {
        // 文字列からレイヤーマスクを作る
        int mask = LayerMask.GetMask(new string[] {LayerName});

        if (Physics.Raycast(transform.position,
                            transform.forward,
                            float.PositiveInfinity,
                            mask)) {
            
            Debug.Log("Raycast Hit!");
        }

    }
    
}


これでレイヤー番号からビット演算なんて手間をこさえる必要もないですne!

3. レイヤー番号から指定する

どういう理由かレイヤー番号だけは値として持っている、なんて状況もあるかもしれません。
その場合も用意されている関数を使えばビット演算なんてしなくていいのです
LayerMask.LayerToName関数でレイヤー名を取得し、文字列からレイヤーマスクを作りましょう。


using UnityEngine;
using System.Collections;

public class IntegerLayerMaskTest : MonoBehaviour {

    // レイヤー番号
    const int LayerNumber = 8;
    
    void Start () {
        // レイヤー名のリストを作る
        string[] MaskNameList = new string[] {
            LayerMask.LayerToName(LayerNumber)
        };

        // 文字列からレイヤーマスクを作る
        int mask = LayerMask.GetMask(MaskNameList);
        
        if (Physics.Raycast(transform.position,
                            transform.forward,
                            float.PositiveInfinity,
                            mask)) {
            
            Debug.Log("Raycast Hit!");
        }
        
    }
}

これでもうビット演算をする理由は皆無です!
一人ドヤ顔でビット演算して職人気取るのはやめましょうne!

Amazon.co.jpアソシエイト