【第2回】Rigidbodyと物理特性マテリアルで跳ね返りを表現するのだ

【第2回】Rigidbodyと物理特性マテリアルで跳ね返りを表現するのだ

前回、Unityに触れて間もない方向けに、物体を自由落下させるチュートリアルをお届けしました。

この記事ではもう少し内容を発展させて、物体が地面に落ちた後バウンドする様子まで確認してみましょ。

ちょっとずつ出来ることを増やしていくのが楽しいんです。Unityさんは。

 

今回の目的

Sphereオブジェクトを地面に衝突させ、バウンドする様子を観察します。

プロジェクトの準備

上の記事で作ったプロジェクトがそのまま使えます。

このページに先にたどり着いた方は、新規にプロジェクトを作成し、任意のシーンを作成してください。そのシーン内に『Sphere』オブジェクトを作成して『Rigidbody』コンポーネントをアタッチすればOKです。

地面を作る

物体にRigidbodyコンポーネントをアタッチすると、以下のように自由落下するようになります。

自由落下の様子
自由落下させることができた

 

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

平面の追加
平面を追加するのだポッター

 

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

Transformのリセット
よく分からない値なのでリセットしたい

 

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

Transformのリセット
すべてがゼロになる

 

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

Sphereオブジェクトを選択して、TransformのYを5にしましょ。

球のTransform
球の初期位置を上に

 

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

Main CameraのTransform
カメラさん、こちらへお願いしまーす

 

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

Gameウィンドウ
上手に置けましたー

 

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

地面に落下する球
ひゅー……ぽすん

 

自由落下した球が地面に落ちるところまで作れました。まだ反発係数などの物理的なパラメータを持っていないため、衝突してもそのままの状態になっています。なので、次はその物理的なパラメータを準備。

 

物理特性マテリアルの作成

反発係数や摩擦力を演算するために使われるのが、この物理特性マテリアルです。これ自体がゲームに出てきそうな名前。防具の物理防御力を高めるアーティファクト的な感じで。

まずは物理特性マテリアルを作成します。Projectウィンドウ内で右クリックまたは二本指タップ、コンテキストメニューから[Create] -> [Physic Material]を選択します。画面上のメニューバーを使って[Asset] -> [Create] -> [Physic Material]からでも同じように作れます。

物理特性マテリアルの作成
作れるファイル多いなぁ

 

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

物理特性マテリアル
名前も『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の物体と平均されることになっちゃうんです。

Planeの設定
こちらも忘れずに

 

跳ね返りの確認

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

跳ね返り
無事、跳ね返るように

 

無事に跳ね返るようになりました。物理特性マテリアルの『Bounciness』を変えれば跳ね返る高さも変わるので、色々試してみると楽しめます。

注意点としては、Unityで使っている物理エンジンはパフォーマンスや安定性を重視して位置の計算をシミュレーションするため、必ずしもエネルギーが保存される訳ではありません。(Unity公式のマニュアルに記述あり)

例えば、今回作ったBoundの反発係数を1にしてみると、最初の位置よりも高いところまで球が跳ね返る様子が確認できます。衝突するたびにだんだん跳ね返る高さが上がっていくのは中々シュール。

物理エンジンは現実を反映したものではなく、ゲームのためにそれっぽくシミュレーションしているもの、という心積もりでいると良さそう。むしろゲームだし、現実にない物性を表現できると思えば、メリットにもなりますもんね。

まとめ

今回は自由落下する物体が地面と衝突する際の跳ね返りを実装しました。

自由落下、跳ね返り共に物理エンジンを使っているため、私たちはスクリプトを書かずに済んでいます。サンキュー物理エンジン。

物理特性マテリアルは複数作れるので、地面用、落下する物体用と、複数に分けることも可能です。これによって複雑な表現も可能になっていきます。

次は鉛直方向だけでなく、斜方投射にも挑戦してみます。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!