
スイカゲームみたいな落ち物パズルを作ってみたいけど、どうやったら落ちていく動きを作れるのかな?
本記事の内容
・物体の重力や加速させたいなら、Rigidbodyを使おう!
・ゲーム内のオブジェクトを物理的な挙動をさせるRigidbody
・ゲーム内のオブジェクトをバウンドさせるPhysicsMatrialの設定方法


物体にスピードをつけて移動させる方法
多くのゲームでは、ゲーム内のオブジェクトが移動をしています。プレイヤーキャラクター、敵キャラクター、ボール、弾、ミサイル、車、アイテム・・・。
こうしたオブジェクトを移動させるには、2つ方法があります。
- アニメーションを使った挙動
- Rigidbodyを使った物理演算による挙動
アニメーションについてはこちらの記事で作り方解説していますので、よかったら参照してください。


今回は「Rigidbodyを使った物理演算による挙動」を解説していきます。
現実の動きをシュミレーションしよう
Unityでは現実世界をシミレーションする物理挙動が簡単に作れます!
ゲーム内で、自然落下やボールとボールのぶつかり合いなど、物理的な挙動を入れるケースは多々あります。


そんなときに大活躍するのが、Rigidbodyという機能です。Rigidbodyを使うことで以下のようなことが可能になります。
- 重力:ぷよぷよのように、モノが落ちるという表現が可能になります
- 衝突と反発:スイカゲームのように、物体と物体がぶつかり合う表現が可能になります
- 加速と摩擦:レースゲームのように、アクセルで進み、ブレーキを掛けたら摩擦でスピードを落とすといった表現が可能になります
- 回転:動いている野球ボールは回転していますよね。野球ボールのように回転を掛けて弾を発射するといったことが可能になります
今回の記事ではこのうち、「重力」、「衝突と反発」の2つを解説したいと思います。
Rigidbodyの設定方法
Rigidbodyの設定手順
設定手順はメチャクチャ簡単です。1分で出来ます!
このマリトッツォ(古い・・・)にRigidbodyを付けてみましょう。付け方はとても簡単。
今回の解説に使用する画像はいらすとやでダウンロードしました。
物理演算を追加するには、Rigidbody2D
というコンポーネントを追加するだけです。


・RigidbodyとRigidbody2Dというニ種類があります。2Dゲームの場合はどちらでも可能ですが、名前の通りRigidbody2Dの方が2Dゲーム用に最適化されているので、2Dをおすすめします。
3Dゲームの場合はRigidbody2Dは使用出来ないということを覚えておきましょう。
重力
このRigidbodyを設定するだけで、すでに重力は適用されています。具体的には重力スケールが0より大きくなっていれば重力が適用されます。


宇宙空間のように、重力を軽くしたければ、この重力スケールを調整すれば良さそうですね!
重力スケールが設定されている状態で、プレイしてみましょう。


ちゃんと落下していきましたね!
物体の落下速度は、以下で求まります。
速度[m/s] = 初速[m/s] + 9.8 × 秒数[s]
[m/s]は、1秒に何メートル進むか、という単位です。質量をいくら重くしても落下速度は速くなりません。
ゲーム作りに活用出来るなら、学校の勉強も悪くないかも!?
衝突の設定
さきほどのマリトッツォ達ですが、地面を貫通して消滅してしまいましたね。ただ、落下した後に地面に接地して欲しいこともあると思います。そこで必要になるのが、Collider(コライダー)です。
Colliderを使うことで、物体同士がぶつかり合う、ということが表現することが出来ます。よくゲームで言う当たり判定のことですね。なので今回は、この地面に当たり判定を設定して、マリトッツォを受け止められるようにしてみましょう。
当たり判定を付けるには、ぶつかり合う両方のオブジェクトに、Colliderが設定されている必要があります。
これも、設定方法は超カンタン!
まずは、当たり判定を持った地面を作ってみましょう。
ヒエラルキーウィンドウを右クリックして、正方形を追加します。


正方形を画面全体に広がるように横に伸ばします。


追加した四角形のオブジェクトに、Box Collider2Dを設定します。


・Rigidbody2Dの場合は、XXX Collider2D
と2Dが付いている方でないと設定ができません。
・Capsule Colliderの場合は、当たり判定がカプセル型に(プレイヤーキャラクターなどはカプセル型のことが多いです)、Circle Colliderの場合は、当たり判定が円状になります。色々試してみましょう。
次にマリトッツォにも当たり判定を付けてみましょう。マリトッツォは丸いのでCircleCollider2Dを付けてみます。


はい、設定おわり!これだけ!
この状態で再生してみましょう。


マリトッツォが接地してくれるようになりました!とっても簡単!
反発
マリトッツォのような物体は、地面に落ちてもバウンドしませんが、サッカーボールを地面に落としたらどうでしょうか?ボールは地面にぶつかると弾みますよね!では、自然なバウンドをさせる方法について解説します。
まずは、プロジェクトウィンドウ(エディタ下部のウィンドウ)から、
右クリック > 作成 >「Physics Material 2D」を選択。


適当な名前を付けておきましょう。私は「BoundPhysicsMatrial2D」という名前にしました。
設定できる値を確認してみましょう。


ここでは摩擦の強さ、弾性力を設定出来ます。
項目 | 機能 |
---|---|
Friction | 摩擦の強さ。値が大きいほど摩擦大(通常0~1) |
弾性力 | 跳ね返り係数。1を超えると、元いた地点よりも大きく弾み、0に近づくにつれ徐々に地面に近づいてくようなバウンドになる。 |
3Dゲームの場合は、3D用の「物理マテリアル」から設定します。2Dと3Dで互換性がないので気をつけましょう。
今回、弾性力は0.7で設定してみます。
そして、弾ませたいRigidbody2Dに、いま作成したBoundPhysicsMatrial2D
を設定します。
Rigidbodyのコンポーネントの中から、マテリアルを選択して、先程つくったBoundPhysicsMatrial2D
を設定します。


これでおわりです。再生してみましょう。


自然にバウンドしていますね!
このように、プログラムコードを一切書かずに、物理的な挙動をゲーム内で再現することが出来ました!
まとめ
物理挙動を入れることで、一気に現実のシミュレーションに近いことが可能になります!ぜひマスターしましょう。
物理挙動のうちの、「加速と摩擦」と「回転」については次の記事で解説しますのでよければこちらも見てください。


それでは素敵なゲーム制作ライフを!
コメント
コメント一覧 (1件)
[…] 【プログラム不要!】UnityのRigidbody・Colliderを使って現実の動きを再現しよ… […]