いんでぃーづ

ゲームいろいろ、いろいろ自由

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!


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。