2D&3Dの着地検知

アクションゲームなどで「空中ジャンプは使えないようにしたい」といったときに着地検知が必要になる。そのとき使えばいいもの。テキストだけでごめんなさい。ちなみにこの記事を書いてたときのversionはUnity 4.5。コードはC#

3Dの着地検知

 3Dの着地検知は2つの方法を紹介する。

CharacterControllerを使う方法

一つ目の方法はCharacterController。簡単に実装できる。着地検知をしたいオブジェクトにAdd Component -> Physics -> CharacterControllerを追加。inspectorでの細かい調整はここでは省略。このオブジェクトに割り当てられているスクリプトに以下を加えると着地検知できる

  CharactorController controller;

void Start(){
  controller = GetComponent();  //CharacterControllerコンポーネントを取得
}
・
・
・
  if (controller.isGround) //isGroundで着地している場合にtrueを返す。着地していなければfalse
  { 
    //着地時の処理
  }
 

これでできるはず。

Physics.Raycast()を使う方法

 もう一つはPhysics.Raycast()で検知する方法もある。こちらを使うメリットは特定のオブジェクトを検知できる点。Physics.Raycast()はオブジェクトから見えない光を飛ばしてこの光が他のColliderに接触すればtrueを返すというもの(接触していなければfalse)。以下のようにPhysicsコンポーネントを追加した状態でスクリプトに加える。

  int LayerMask = 1 << 8; //1 << 8で10000000と同じになる。

  Physics.Rayecast(Vector3 , Vector3 direction, float distance, LayerMask);

 第1引数 Vector3は光の始点。第2引数 Vector3は光を飛ばす方向。第3引数 float は光を飛ばす距離。第4引数のLayerMaskは特定のオブジェクトの接触を感知するためのもの。第4引数は省略しても問題ない。

 LayerMaskについて。RayCast関数で指定するレイヤー番号は内部ビット演算をするため、8番目のLayer(Layerは Edit -> Project Settings -> Tags and Layersで設定できる)のみに検知をしたい場合は 1 << 8 で8番目のLayerに光が当たったときだけ検知できるようになる。ただし検知したいオブジェクトにLayerを設定することを忘れないように。


2Dの場合

 2Dは残念ながらCharacterControllerにあたるものは無いらしい。なので 着地検知をするには3DでのPhysics.Raycast() と似たような Physics2D.Linecast()を使う。接触できないことにはどうしようもないのでcolliderはつける。着地検知したいオブジェクトに Add Component -> Physics2D -> Box Collider2D でBox Collider2Dコンポーネントをつける。これで着地はできるようになったはず。 着地検知するには以下のようにスクリプトに書く

  int LayerMask = 1 << n; //n番目のレイヤーマスク

  Physics2D.Linecast(Vector2 start, Vector2 end, LayerMask);


 これでできる。第1引数が始点。第2引数が終点。第3引数は上記と同じレイヤーマスク。特定のLayerのみ検知したい場合に使う。第3引数はなくてもok。
 その間にColliderがあれば着地を検知してtrueを返す。



 2DにもCharacterControllerみたいなのあればいいのにね(´・ω・`)