前回、ゲームの素材であるフィールドとボールを作成していきました。
前回の記事↓
衝突判定/重力処理の作成
今回は、Unityの機能である衝突判定の解説および衝突判定を用いてボールに重力処理を加える方法について説明していきます。
【解説】衝突判定
衝突判定は、現実の物理現象をゲーム上で表現するための機能です。
例えば、ボール同士がぶつかる動作や重力によって物体が地面に落ちる動作などに使用されます。
Unity上で作成したゲームオブジェクトには、衝突判定に使用するコンポーネント(コライダー)が割り当てられています。
キューブを作成した場合にはCubeColliderが、ボールを作成した場合にはSphereColliderが割り当てられます。
これらのコライダーは、ほかの物体がぶつかったかどうかを判定し、その衝撃に合った動作をします。
例えば、コライダーが割り当てられたボール同士がぶつかると、お互いが跳ね返るような方向に移動します。
また、コライダーが割り当てられていないボール同士がぶつかった場合には、ボール同士はぶつかったような動作はしないで貫通します。
コライダーのほかにも、重力の処理を加えることのできるコンポーネント(Rigidbody)があります。これは、通常作成した場合には割り当てられていません。
そのため、重力処理を加えたいゲームオブジェクトに対してインスペクタ―からRigidbodyを追加する必要があります。
コライダーとRigidbodyを組み合わせることによって、衝突判定の基本的な処理は作成可能です。
ボールに重力処理を加える方法
それでは、ボールに対して重力処理を加える方法について説明していきます。
まず、前回までに作成した画面は下図のようになっています。
この状態で画面上にある再生ボタンを押してみましょう。
この状態ではボールにRigidbodyが追加されていないため重力がかかりません。そのため、何も動かないことが分かります。
それでは、Rigidbodyを追加してみましょう。
Ballプレハブのインスペクタ―からAdd Component > Rigidbodyを選択して追加してください。
(ボールの色とか見え方が少し変わってますが気にしないでください)
このとき、ヒエラルキーのBallではなく、プレハブのBallオブジェクトに設定してください(ヒエラルキーのBallに変更を加えてもプレハブのBallオブジェクトに変化が反映されないため)。
追加出来たら他の設定は特にしないでもう一度再生ボタンを押してみましょう。
すると、今度はボールが重力に従って落下するようになりました。ここで注目すべき点は、フィールドの位置で落下が終わっている点です。
これは、フィールドのコライダーとボールのコライダーが衝突判定により「衝突した」と判定しているために起こります。
しかし、このままではボールがフィールドにぶつかったときに弾まずに停止してしまいます。
スーパーボールのような弾む動作をさせたいためには、Physics Materialを追加する必要があります。Physics Materialは、衝突時のゲームオブジェクトの動作を調整できるマテリアルです。
新しい用語が増えて頭がこんがらがるかもしれませんが、簡単に言うと、次のようなことを設定できるマテリアルです。
- Dynamic Friction:移動中の物体の摩擦(動摩擦係数)
- Static Friction:停止中の物体の摩擦(静止摩擦係数)
- Bounciness:衝突時の弾みやすさ(弾性係数)
Dynamic FrictionやStatic Frictionは力学の知識が多少必要になるのでここでは省略します。今回メインに使用するのはBouncinessのみです。
Bouncinessの説明をするため、早速Physics Materialを作成してみましょう。ProjectからPhysicsMaterialsフォルダを作成し、Ballという名前のPhysics Materialを作成してください。
インスペクタ―を確認してみましょう。すると、先ほど説明したDynamic Friction、Static Friction、Bouncinessがあることが分かります。
初期設定ではDynamic FrictionとStatic Frictionが0.6、Bouncinessが0となっています。
Bouncinessは0~1の範囲で設定でき数値が大きいほど跳ね返る大きさが大きいことを意味します。
現在は0なので全く跳ね返らないことが分かります。
ここで、Bouncinessを0.5に設定してみましょう。
変更後に、プレハブのBallのインスペクタ―からSphereColliderがあることを確認してください。
Sphere Colliderの中にMaterialという空欄があると思います。
そこにPhysics Materialを追加できます。
Physics Material(Ball)をドラッグ&ドロップし、インスペクターに設定しましょう。これで、ボールにPhysics Materialが割り当てられます。
それでは、この状態で再生ボタンを押してみましょう。
すると、ボールがフィールドとぶつかったとき、少しだけ弾む処理が確認できます。これで、ボールに重力処理を加える部分は完成です。
【Tips】弾性係数の調整
先ほど説明したBouncinessは弾性係数とも呼びます。
弾性係数を違う値にすることにより弾む大きさが変化します。
例えば、Bouncinessを違う値に設定した3つのボールを並べてみたとしましょう。この状態で再生ボタンを押すと、下のようになります。
おさらいと次回予告
今回は、ボールに重力処理を加える方法について説明していきました。
次回からはC#を使ったコーディングを行っていきます。
次回の記事↓
パズルゲーム講座が動画になりました。
動画も合わせてチェック!
コメント