【第2回】Rigidbodyと物理特性マテリアルで跳ね返りを表現するのだ
- 2018.04.07
- Unityチュートリアル
- Rigidbody, Unity, チュートリアル

前回、Unityに触れて間もない方向けに、物体を自由落下させるチュートリアルをお届けしました。
この記事ではもう少し内容を発展させて、物体が地面に落ちた後バウンドする様子まで確認してみましょ。
ちょっとずつ出来ることを増やしていくのが楽しいんです。Unityさんは。
今回の目的
Sphereオブジェクトを地面に衝突させ、バウンドする様子を観察します。
プロジェクトの準備
上の記事で作ったプロジェクトがそのまま使えます。
このページに先にたどり着いた方は、新規にプロジェクトを作成し、任意のシーンを作成してください。そのシーン内に『Sphere』オブジェクトを作成して『Rigidbody』コンポーネントをアタッチすればOKです。
地面を作る
物体にRigidbodyコンポーネントをアタッチすると、以下のように自由落下するようになります。

これだけだと寂しいので、地面を用意します。『Hierarchy』ウィンドウ内で右クリックまたは二本指タップし、[3D Object] -> [Plane] を選択。

もしPlaneオブジェクトを作った際、Transformに何らかの値が入っていたらリセットすることを推奨。公式のチュートリアルでもこの点は徹底されていました。

リセットはコンポーネントの右上、歯車のアイコンで開くメニューから実行します。Position, Rotationが0に、Scaleが1に揃えられます。

さて、地面として使うPlaneオブジェクトの高さは、TransformのYの値である0です。これに合わせてSphereオブジェクトの高さも高くした方が良いかな。
Sphereオブジェクトを選択して、TransformのYを5にしましょ。

さらにカメラの位置も変えておきましょうか。Main Cameraを選択して、TransformのYを2.5、Zを-10あたりにしておきましょう。

だいたいこんな感じの画面になりました。

この状態でゲームを実行してみるとこのようになります。

自由落下した球が地面に落ちるところまで作れました。まだ反発係数などの物理的なパラメータを持っていないため、衝突してもそのままの状態になっています。なので、次はその物理的なパラメータを準備。
物理特性マテリアルの作成
反発係数や摩擦力を演算するために使われるのが、この物理特性マテリアルです。これ自体がゲームに出てきそうな名前。防具の物理防御力を高めるアーティファクト的な感じで。
まずは物理特性マテリアルを作成します。Projectウィンドウ内で右クリックまたは二本指タップ、コンテキストメニューから[Create] -> [Physic Material]を選択します。画面上のメニューバーを使って[Asset] -> [Create] -> [Physic Material]からでも同じように作れます。

跳ね返りアイコンが特徴的な物理特性マテリアルのファイルができました。分かりやすく名前を変えておきます。まんま『Bound』で。

『Bound』を選択してInspectorウィンドウを見てみると、下のような設定が。

これらの設定の詳細は公式のマニュアルを見てもらうとして、ざっくり説明すると以下のようなイメージ。
- Dynamic Friction …… 動摩擦力の設定。0に近いほど動き続ける。
- Static Friction …… 静止摩擦力の設定。0に近いほどすぐ動き出す。
- Bounciness …… 反発係数の設定。0に近いほど跳ね返らない。
- Friction Combine …… 衝突する物体同士の摩擦力の処理方法。
- Bounce Combine …… 衝突する物体同士の反発の処理方法。
今回の跳ね返りで必要なのは、『Bounciness』と『Bounce Combine』の2つ。特に『Bounciness』によってどれだけ跳ね返るかが決まるので、こちらが大事です。
実際に『0.5』くらいの値を入れてみましょ。

物理特性マテリアルを設定したら、物体にセットします。物理特性マテリアルは装備しないと効果がありません。ゲームをしている感覚でゲームを作れる、それがUnity(過言)
Hierarchyウィンドウで『Sphere』を選択し、『Sphere Collider』コンポーネント内の『Material』右にある丸ボタンをクリック。物理特性マテリアルの選択ウィンドウが開きます。
ここで先ほど作成した物理特性マテリアルの『Bound』を選択してウィンドウを閉じれば、『Material』に『Bound』がセットされます。

『Plane』の方にも同様に『Bound』をセットします。衝突する2つの物体にセットしないと、思ったように動かなかったりも。というのは、上でちょっと出てきた『Bounce Combine』による計算方法が『Average』になっているので、反発係数0の物体と平均されることになっちゃうんです。

跳ね返りの確認
両方に物理特性マテリアルをセットしたところでゲームを実行してみます。ポチッとな。

無事に跳ね返るようになりました。物理特性マテリアルの『Bounciness』を変えれば跳ね返る高さも変わるので、色々試してみると楽しめます。
注意点としては、Unityで使っている物理エンジンはパフォーマンスや安定性を重視して位置の計算をシミュレーションするため、必ずしもエネルギーが保存される訳ではありません。(Unity公式のマニュアルに記述あり)
例えば、今回作ったBoundの反発係数を1にしてみると、最初の位置よりも高いところまで球が跳ね返る様子が確認できます。衝突するたびにだんだん跳ね返る高さが上がっていくのは中々シュール。
物理エンジンは現実を反映したものではなく、ゲームのためにそれっぽくシミュレーションしているもの、という心積もりでいると良さそう。むしろゲームだし、現実にない物性を表現できると思えば、メリットにもなりますもんね。
まとめ
今回は自由落下する物体が地面と衝突する際の跳ね返りを実装しました。
自由落下、跳ね返り共に物理エンジンを使っているため、私たちはスクリプトを書かずに済んでいます。サンキュー物理エンジン。
物理特性マテリアルは複数作れるので、地面用、落下する物体用と、複数に分けることも可能です。これによって複雑な表現も可能になっていきます。
次は鉛直方向だけでなく、斜方投射にも挑戦してみます。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【第1回】初めてのUnity! 最初は物体の自由落下をさせることから 2018.04.06
-
次の記事
GitHubに登録してソースコードを共有しやすくする 2018.04.08
コメントを書く