Unity不定期便

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

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

f:id:masatolan:20140511215637j:plain

 「前編」からの続きです。

まだ、前編を見ていない方はコチラをチェック!

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

 

 「OnCollisionEnter2D」の使い方!

シチュエーションは、下記の通り「前編」と同じです。

f:id:masatolan:20140512161459j:plain

「爆弾」オブジェクトに、以下のようなスクリプトを貼り付ければ「OnCollisionEnter2D」の場合は「爆弾」が消えてくれます。

    function OnCollisionEnter2D(col:Collision2D){
	    Destory(gameObject);
    }

 「OnTriggerEnter2D」と違って、事前に何かを準備する必要はありません。

 

また、接触時に複数のキャラクターを判別するには、「前編」でやったように「タグ」を設定することも可能です。

f:id:masatolan:20140513112707j:plain

 

 スクリプトは以下のような感じ。

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

引数が「Collision」系なので、「OnTriggerEnter2D」と違い「col.gameObject」から「tag」の情報を入手する点に注意が必要です。

 

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

    function OnCollisionEnter2D(col:Collision2D){
		Destroy(col.gameObject);
    }

 

「OnCollisionEnter2D」の特徴!

 「OnCollisionEnter2D」の大きな特徴としては、先ほども述べましたが…引数が「Collision」系である点でしょう。

そのため、「OnTriggerEnter2D」では取得できないような情報も入手可能です。

 

例えば、今回の例だと「爆弾」と「キャラクター」が接触したポイント(座標)を取得することも簡単です。

f:id:masatolan:20140514220318j:plain

 

スクリプト

    function OnCollisionEnter2D(col:Collision2D){
	    Debug.Log(col.contacts[0].point);
    }

 

他にも、「爆弾」と「キャラクター」の相対速度を取得したりもできます。 

    function OnCollisionEnter2D(col:Collision2D){
	    Debug.Log(col.relativeVelocity.magnitude);
    }

 その他、コチラに取得できる情報が掲載されています!

  

「OnCollisionEnter2D」の仲間たち! 

「前編」でも紹介しましたが、使い方は同じで「機能」だけが少し違うモノが2つありますので、簡単に紹介だけしておきます。

OnCollisionExit2D

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

OnCollisionStay2D

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

 

 少しの違いですが、ゲーム製作の幅は広がるかと思います。

 

「Physics2D.Linecast」の使い方!

 「Physics2D.Linecast」の簡単な使い方に関しては、以下の記事で紹介していますが…

Unityの2D機能を使った「ジャンプ」を実装するのに最適だった方法! - Unity不定期便

もっと便利に使える方法があります!

 

少し前準備が必要なのですが…

まず、「爆弾」の子要素に空のゲームオブジェクト「check」を配置して、爆弾の少し下へ設置しておきます。

f:id:masatolan:20140514231646j:plain

「Physics2D.Linecast」を使って、この「check」部分をセンサーのように使い、「当たり判定」を取得するようになります。

 

ちなみに、「check」オブジェクトを分かりやすくするために、アイコンを設定しておくと便利です。

f:id:masatolan:20140514232630j:plain

 

そして「Physics2D.Linecast」は、レイヤー情報を取得できるので各オブジェクトに別々のレイヤーを設定します。

f:id:masatolan:20140514232636j:plain

 

あとは「爆弾」オブジェクトに、以下のようなスクリプトを貼り付けます。

var check : boolean = false;
var ground : LayerMask;
private var gndcheck : Transform;

function Start () {
	gndcheck = transform.Find("check");//「check」オブジェクト取得	
}

function Update () {
	transform.Translate(Vector3.up * -0.1);//爆弾の落下処理
	check = Physics2D.Linecast(transform.position, gndcheck.position, ground);
	if(check){
		Destroy(gameObject);
	}
}

 

「Physics2D.Linecast」を使うには、以下のような設定が必要です。

f:id:masatolan:20140514235253j:plain

①「爆弾」の現在地を開始点にする。

②「check」オブジェクトの位置を終了点にする。

③「キャラクター」に設定したレイヤーを指定する。

 

上記を設定すると、「開始点」から「終了点」まで見えない線が引かれて、この線に指定したレイヤが接触すると「true」が引数として取得できます。(接触が無ければfalse)

f:id:masatolan:20140514235425j:plain

 

プログラムを実行する前に、レイヤーを設定するのを忘れないようにしましょう。

f:id:masatolan:20140514234145j:plain

複数のキャラクターを判別する際には、レイヤーをそれぞれ指定するだけでOKです。

ちなみに、「Physics2D」から得られる他の情報は、コチラに詳しく掲載されているので見ておくと便利です! 

 

「Physics2D.Linecast」の特徴!

この方法は、少し準備が必要ですが、設定してしまえば非常に便利な使い方が出来るのが大きな特徴です!

例えば、「当たり判定」の位置を少し変えたい場合には、「check」オブジェクトを直接移動させるだけで簡単に編集できてしまうわけです。

f:id:masatolan:20140515000219j:plain

また「check」オブジェクトを複数配置して、様々な「当たり判定」を作ってしまうことも簡単に実現できます。

 アイデア次第では、さらに応用が効きそうな方法ではないでしょうか…。

 

おまけ!

設定した複数のレイヤーは、マトリックス機能を使えば各レイヤーを制御して、お互いに接触「する」「しない」を任意に操作できます。

f:id:masatolan:20140515001119j:plain

「Edit」→「Project Settings」→「Physics2D」から設定できるようになっています。

使いこなせば、さらにゲーム製作の幅が広がりますね。

ぜひ、チャレンジしてみてください! 

 

前編】の記事はコチラ!

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

 

 

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

 

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

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