Unity不定期便

Unityエンジンを使って、いろいろ勉強したことをメモ代わりにまとめてます。

Unityの2Dゲームで「当たり判定」の基本を30分で理解するコツ!(前編)

f:id:masatolan:20140511215637j:plain

Unityによる2Dゲームを試作している時に、「当たり判定」について…基本的な内容をいろいろ調べたので、その結果をログ代わりにまとめておきます。

ちょっと…ボリュームがあるので「前編」「後編」に分けてます。

 ご興味ある方は、参考にどうぞ!

Unityの「当たり判定」について

Unityでゲームを作る場合、例えばキャラクターを「地面の上に立たせたい!」と思ったら、「地面」と「キャラクター」それぞれに「Collider」を貼り付けるだけで完了します。

(キャラには、重力を持たせるためのRigidbodyも付けてます…)

f:id:masatolan:20140512150839j:plain

 

これだけで、基本的な「当たり判定」が完成し、ちゃんと地面の上に立つことができます。

f:id:masatolan:20140512151018j:plain

他にも、上空からモノを落としたり、キャラ同士を衝突させるようなこともコレで簡単に実現できるわけです。

しかし、ゲームとして成立させるためには、モノと接触した時に…「爆発させる」「アイテムを消す」「移動させる」など、何らかの「指示」を出さなければいけません。

 

つまり、Unityでの「当たり判定」は、この「指示」をどのような方法で与えるか?…について考えることが多いのではないでしょうか。

一般的な指示の与え方として、以下の3つの方法を覚えておくと、ほとんどのケースに対応できるようになるかと思います。

  •  「OnTriggerEnter2D」を使う!
  • 「OnCollisionEnter2D」を使う!
  • 「Physics2D.Linecast」を使う!

 

そこで、同じシチュエーションを用意して、それぞれの使い方をまとめておきたいと思います。

 

シチュエーションを用意! 

 今回は、例として上空から「爆弾」が落下してくるシチュエーションを想定します。

f:id:masatolan:20140512161459j:plain

指示させたい処理

 「爆弾」が「キャラクター」に当たると、爆弾のオブジェクトが消えるようにしたい。

設定情報

※「爆弾」には「Collider」、「キャラクター」には「Collider」「Rigidbody2D」を設定した状態で、「爆弾」は単純なスクリプトで落下させるようにしてます。

(参考:transform.Translate(Vector3.up * -0.1)、もちろんRigidbodyで落下もOK)

 

「OnTriggerEnter2D」の使い方!

爆弾に「OnTriggerEnter2D」を使う場合は、爆弾オブジェクトの「Collider」にある「Is Trigger」のチェックボックスを選択します。

f:id:masatolan:20140512161505j:plain

 コレをしないと「当たり判定」が検出されないので注意…。

 

そして、同じく爆弾オブジェクトに以下のような「新規スクリプト」を追加します。

    function OnTriggerEnter2D(col:Collider2D){
	    Destroy(gameObject);
    }

これで、爆弾がキャラクターに当たった瞬間に、爆弾オブジェクトが消えます。 

ただし、このままだと爆弾が何に当たっても消えてしまう状態になっています。

 

例えば、以下のように複数のキャラクターがいて、任意のキャラクターに爆弾が当たった時だけ処理させたいケースがあったとします。

f:id:masatolan:20140513112700j:plain

 

この場合に有効なのは、キャラクターに「タグ」を設定して区別するという方法。

f:id:masatolan:20140513112707j:plain

 

すると、以下のようなコードで区別が出来るようになります。 

    function OnTriggerEnter2D(col:Collider2D){
	    if(col.tag == "Player1"){
		    Destroy(gameObject);
	    }
    }

引数には、様々な情報を取得することが出来るのですが、上記の場合は「col.tag」とすることでタグの情報を取得できます。

これで、「Player1」に当たった時だけ爆弾が消えてくれます。

 

ちなみに、爆弾ではなく「キャラクター」の方を消したい場合は以下のようになります。 

    function OnTriggerEnter2D(col:Collider2D){
	    if(col.tag == "Player1"){
		    Destroy(col.gameObject);
	    }
    }

今度は、「col.gameObject」 とすることで、爆弾に接触してきたオブジェクトを取得できます。

このように「col.◯◯◯」とすることで得られる情報は、コチラに掲載されているので見ておくと便利ですよ。

 

「OnTriggerEnter2D」の特徴! 

「OnTriggerEnter2D」での大きな特徴として、最初に述べた通り「is Trigger」を選択するという点が挙げられます。

実は、この「is Trigger」の選択を「オフ」にするか「オン」にするかで、オブジェクトの挙動が変わります。

f:id:masatolan:20140513121839j:plain

「is Trigger」を選択して「オン」の状態にすると、オブジェクトの当たり判定が無くなり、スクリプト側からの制御のみになります。 

これを応用すると、横スクロールのアクションゲームなどにも応用できそうです。

 

例えば、「Collider」だけ貼り付けた空のゲームオブジェクトを設置します。

f:id:masatolan:20140513121848j:plain

 キャラクターが、ここを通過すると「◯◯◯の処理を行う!」というような動作を簡単に行えるわけです。

「 秘密の入り口」を作ったり、途中までの経過を「自動セーブ」させたり…など、いろいろなアイデアに使えますね。

 

 「OnTriggerEnter2D」の仲間たち!

使い方は同じですが、機能が少し違うモノが2つあるのでご紹介しておきます。

 

OnTriggerExit2D 】 

・今回の例だと、「爆弾」と「キャラクター」が接触して、離れた時に処理を実行します。

 

OnTriggerStay2D

・今回の例だと、「爆弾」と「キャラクター」が接触している間は、処理が実行され続けます。

 

これらも、アイデア次第では面白いゲームのネタになりそうです。

 

 

少し長くなってきたので、続きは「後編」へ!

 

「当たり判定」について解説してるベスト書籍! 

 

Unity4ゲームコーディング 本当にゲームが作れるスクリプトの書き方

Unity4ゲームコーディング 本当にゲームが作れるスクリプトの書き方