先週の土日に、ユニティちゃんゲームジャム大阪会場に行ってきましたよ。
疲れましたが、大変楽しいイベントでした。
ゲームジャムなどの感想は、今週の土曜日にあるUnity勉強会にて反省会が行われるそうなので、そのときにまた。
さて、今回30時間という短い時間の中でゲームを作っていたわけですが、その中で学んだ点などを復習していこうかなと思います。
ではまずUnityの基本機能の一つであるCollisionについて復習してみたいと思います。
このようなサンプルプロジェクトを用意しました。
UnityちゃんとブロックのGameObjectには、OnCollisionEnter2D()
とOnTriggerEnter2D()
の関数を記述したスクリプトを埋め込んでおります。
各関数が呼ばれたら下のテキストにメッセージを送るよ、という簡単プロジェクトです。
ではまず最初にUnityちゃんとブロックのGameObjectにColliderのみ埋め込んでみましょう。
その状態でUnityちゃんをブロックにぶつけてみましょう。
何もおこりませんね。
Triggerフラグの有無も関係ありません。
ではUnityちゃんのGameObjectにRigidbodyを付けてみましょう。
Unityちゃんがブロックにぶつかって、それ以上先に進めなくなっています。
ではUnityちゃんのGameObjectからRigidbodyを外し、ブロックのGameObjectにRigidbodyを付けてみましょう。
Unityちゃんがブロックを押し出しました。
両方のGameObjectにRigidbodyを付加した場合も同じ現象が起きますが、
UnityちゃんのGameObjectにRigidbodyがあるときに比べるとスムーズには動きません。
ではUnityちゃんのColliderのTriggerフラグをOnにしてみましょう。
見事に素通りします。
この結果は両方のColliderのTriggerの有無、Rigidbodyの有無に関係なく、
どちらかのGameObjectにRigidbodyがあり、尚且つどちらかのColliderのTriggerがOnになっていれば同じ結果になりました。
まあこの結果は、下記のサイトに詳しく書いてあったんですけどね。
https://code.google.com/p/vga-unity/wiki/GP10UnityCourse08
とりあえず結論としては、
Colliderだけでは機能しないよ。Rigidbodyが必要だよ。
ということですね。
ちなみに今回のゲームジャムにて、OnTriggerEnter2Dが呼ばれないというエラーが発生しました。
もともとスクリプトに書いてあったOnCollisionEnter2Dの関数をコピペして、
OnTriggerEnter2Dの処理を記述したのですが、何故かOnTriggerEnter2Dが呼ばれない。
理由はこちら。
'void OnCollisionEnter2D(Collision2D coll)'
'void OnTriggerEnter2D(Collider2D other)'
引数の型が違うのかよぅ……。
コピペミスには気をつけよう!!