こんにちは!布浦です。
Unityの2D機能をつかう企画、4回目です。
今日は、
「4. 2D物理エンジンでキャラクターを動かす(Physics2D設定編)」
をやっていきたいと思います。
全5回の予定だったのですが、色々あって全6回になりました・・・
- 画像をSpriteとして画面に配置する
- Spriteにコマアニメを設定する(Animation View の使い方)
- 複数のアニメを切り替える仕組みをつくる(Mecanim)
- 2D物理エンジンでキャラクターを動かす(Physics2D設定編)
- 地面に当たったかどうかを判定する(Physics2Dスクリプト前編)
- キー操作によるキャラクターの移動を実装する(Physics2Dスクリプト後編)
どうしてキャラクターに物理エンジンをつかうのか
Unityには、物理エンジンが最初から組み込まれています。
物理エンジンを適用するのは簡単で、GameObjectにRigidbodyというコンポーネントをはりつけると、適用されます。
また、Colliderというコンポーネントをはりつけると、重力が適用されるだけでなく、床に当たったときに止まる、といった「衝突判定」も自動でやってくれます。

こういうもの?がコード無しでつくれる
そこで、キャラクターがフィールドを動き回るタイプのゲームですが、
キャラクターは地面や壁との衝突判定はもちろん、ジャンプなどの実装が必要になります。
これらは自分でコードを書くと結構大変ですが、上記の仕組みを利用すれば、基本的な動きをUnityのエンジンにお任せすることができるのです。

複雑な地形でも大丈夫
UnityのRigidbodyとColliderには、質量や空気抵抗、摩擦係数や跳ね返り係数などパラメータが色々用意されています。
値を変更することで、物理エンジンによる動きでも、色々とカスタマイズできるのが魅力です。
ちなみに、「おミソわけ S」のみそだや、「minamo」の魚も物理エンジンを使っています。

ジャンプして脳みそに乗る部分は、物理エンジンによる動き

物理エンジンのおかげで、魚の群衆シミュレーションが比較的簡単に実装できた
今回は、Unity4.3で新しく追加された「Rigidbody2D」をつかって、
ことりが、重力で下に落ちたり、壁や床にあたると停止するような構造を作っていきたいと思います。
キャラクターのセットアップ
キャラクターのGameObjectに、当たり判定のためのColliderコンポーネントと、
物理エンジンを適用するためのRigidbodyコンポーネントを「Add Component」します。
この辺の要領は、3Dゲームと変わりません。
今回は2Dなので、「Physics 2D」グループのコンポーネントを使います。
- Rigidbody2D
- BoxCollider2D
- CircleCollider
パラメータの値で、変更が必要な部分について少し見ていきます。
Rigidbody2Dについて
「FixedAngle」というプロパティは、チェックを入れておきます。
これは、「物理による回転を無効にする」というプロパティです。
チェックを入れておかないと、「ことり」が移動時に転がってしまいます。

ことりがコケてしまうのを防ぐ
Collider2Dについて
SceneViewでみると、緑の線が表示されますが、これがColliderの枠です。
Collider同士がぶつかったときに、この形で衝突判定が行われます。
今回、BoxCollider2DとCircleCollider の2つをはりつけました。
Colliderは、種類が違うもの(今回はBoxとCircle)の組み合わせであれば、
同じGameObjectに複数はりつけることができます。
上の画像のように、足下にCircle、体部分をBoxで補完するように
「Radius」「Size」「Center」を調整してください。
地面に足がついているかどうかを調べる(接地判定する)のに、
地面との接点が小さい方がわかりやすいので、足下にCircleColliderを使っています。
Animatorについて
前回、前々回と使用しているAnimatorコンポーネントですが、
Apply Root Motionのチェックを外しておいてください。
これは、アニメーションの動きを、実際のGameObjectの座標移動に適用するときにチェックを入れます。
今回のように、Rigidbodyをつかって動きを制御する場合は、外した方がいいでしょう。
ステージの構築
一旦、再生してみます。
キャラクターにRigidbody2Dをはりつけたので、物理エンジンによって重力がかかって下に落ちます。

受け止める床が無いので落ち続けることり
受け止めるためのステージを、Cubeを組み合わせてつくりましょう。
Cameraは、パースを切る(2D表示にする)ために「Projection」を「Orthographic」にします。

床、壁、天井をCubeを組み合わせてつくる

カメラの設定を変更

Cubeだけど2Dステージ
もちろん、ステージ用の素材を用意してSpriteでつくってもいいのですが、
今回は楽をするためにCubeでやってしまっています。
Cubeでやる場合は、Directional Lightを置くのと、
Colliderを BoxCollider -> BoxCollider2D に変更するのを忘れないようにしてください。

Physics系とPhysics2D系はお互いに干渉しないので、2D同士でぶつけたい場合は両方にCollider2Dをはりつける必要がある
再生すると、今度は落下することりが床で止まると思います。

床で止まります
次回は、地面に着地したときにアニメーションを切り替えたりします。
やっと、プログラムも書きます!