【Unity】バウンドのお手軽な実装例と、反発係数の調べ方

Unity
Unity

バウンドを設定したい人

よし、あとはバウンドを設定すればいいだけ…って、どこで設定するんだ?
バウンドの設定久々すぎて忘れたわ…。

こういった疑問にお答えします。

 

本記事の内容

●バウンドの設定方法
●バウンドの値、真の意味
●なぜColliderがバウンドの設定に必要なのか

この記事を書いている私は12才からフルスクラッチでゲームを作っています。
東京大学の理科一類を現役で合格しており、1年次の物理、特に力学は9割の評点をいただいています。

 

本記事ではバウンドを簡単に設定する方法を紹介します。
またバウンドの数値の意味を解説し、微調整をしたいときはどういうアプローチがよいのかをお伝えします。

※実行環境
Unity2021.3.1f1
Windows 10

 

バウンドの設定方法

必要なゲームオブジェクトを準備する

1.「Hierarchy」ウィンドウの余白で「右クリック > 3D Object > Sphere」
2.「Hierarchy」ウィンドウの余白で「右クリック > 3D Object > Cube」
3.「Inspector」ウィンドウで各「Transform」を下図のように設定

 

4.「Hierarchy」ウィンドウで、追加したSphereをクリック
5.「Inspector」ウィンドウ最下部の「AddComponent」ボタンをクリック
6.「rigidbody」と入力すると「Rigidbody」が出てくるのでクリック

 

今回はCubeを床に見立てて、Sphereをバウンドさせる予定です。
この状態で実行すると、床に向かってボールが落ちていくような動作になるハズ。

 

Physic Materialを設定する

1.「Project」ウィンドウで「Assets」フォルダをクリック
2.「Project」ウィンドウの余白で「右クリック > Create > Physic Material」

3.「New Physic Material」をクリック
4.Bouncinessを「0.8」と入力

 

5.「Sphere」の「Inspector」ウィンドウにて、「Sphere Collider」の「Material」の右をクリック
6.「new physic material」と入力すると「New Physic Material」が出てくるのでクリック
7.同様に、「Cube」の「Box Collider」に「New Physic Material」を設定

 

これで実行すると、球技のボールのようなイメージでバウンドする動作が確認できると思います。
「Inspector」で直接数値を設定できない仕様なので見落としやすいですが、以上がバウンドの設定です。

 

バウンドの値、真の意味

ここまででバウンドの動作が実装出来ましたが、もう少しバウンドを小さくしたり大きくしたり、工夫をしたくなると思います。
もちろん「Cube」と「Sphere」でBouncinessを変更したり、「Bounce Combine」を変更することになるのですが、これらの値を闇雲に触ってもなかなか思い通りに動かないと思います。

そこで余裕がある方は今触った「Bounciness」の意味を、物理的なところから野球などの具体的な所まで把握してしまいましょう。
ちょっとした知識さえそろってしまえば、あとはググるだけでいい感じの演出が作れるハズです!

 

「Bounciness」って何?

物理でいうところの、「反発係数」に当たる数値です。
記号では「e」と表されたりするので、英語の「Bounciness」が反発係数と訳せるということではありません。

さて、同じ重さのボールがぶつかるシーンを作るとして、物理の問題などでこのような図を見かけたことはありませんか?

 

今回注目していただきたいのは左のボール①です。
これはぶつかる前とぶつかる後で速度が変わります

 

この速度の変化の事を反発係数という決まりになっており、例えば以下のようなイメージです。

●同じ速度で跳ね返る…反発係数は1
●0.8倍の速度で跳ね返る…反発係数は0.8
●半分の速度で跳ね返る…反発係数は0.5
●止まってしまう…反発係数は0

もちろんぶつかったもの同士の重さが違ったり、反発係数が違ったりすることが多いので、あくまでこれは特殊な場合です。

 

反発係数をググれば実装が簡単、ともいかない

反発係数をなんとなく理解できたので、さっそくスーパーボールを実装したい、と思ったとします。
「スーパーボール 反発係数」などで検索すると、Wikipediaに衝撃の文言が書いてあるハズです。

そう、「0.8…」などと、反発係数に決まった数値は存在しません

 

実は反発係数は、物理の法則で簡単に計算できるものではないのです。
これに関しては野球のボールなどが分かりやすいです。

野球の試合で使えるボールには、反発係数による制限があります。
この反発係数はボールが製造された時点で分かるものではなく、調べてみると分かる通り何回か飛ばして速度を測ることで計算しています。

 

もちろんザックリとした情報でも実装には十分なので、まずは「ボール 反発係数」のように検索することがオススメです。
あとは手元にあるものをなにかバウンドさせて速度を測ってあげると、大体の値を割り出せると思います。

 

なぜColliderがバウンドの設定に必要なのか

Colliderは当たり判定をつかさどるコンポーネントです。
実はそれだけではなく、当たり判定を取る際にどの点で接触して、どれぐらいの力がかかるかを計算する基準の役割も果たしています。

その計算はRigidbodyの計算に伝えられます。
完全に物理演算の中のお話しなので、詳しく知りたい方は以下を参考にしてください。
参考:【コピペでUnity】Rigidbody(リジッドボディ)の分かりづらいスクリプト制御を攻略

 

この力に関する物理演算を、先ほどの図で考えてみましょう。
内容を詳しく理解する必要はありませんが、以下のような式変形が出来ます。

 

ボール①、ボール②の運動方程式を立てると、

$$m_1a_1 = F$$
$$m_2a_2 = -F$$

2式を足し合わせて、

$$m_1a_1 + m_2a_2 = F + (-F) = 0$$

運動量保存則、すなわち両辺を積分して、

$$ m_1v_1 + m_2v_2 = C$$

 

反発係数をeとして、

$$ e = -\frac{v’_1 – v’_2}{v_1 – v_2}$$
$$ e(v’_1 – v’_2) = v_1 – v_2$$

 

以上より衝突後の速度\(v’_1, v’_2\)を求める式をまとめると、

$$ m_1v’_1 + m_2v’_2 = C$$
$$ ev’_1 – ev’_2 = v_1 – v_2$$

 

衝突する2つのオブジェクトの情報を同時に参照できるのはColldierだったハズなので、反発係数もColliderに渡してしまった方がおそらく無駄が少ないと考えられます。
Unityの公式のソースが分からないのでこれ以上は定かではありませんし、単純なゲームを作る上ではここまでの知識は関係ないかもしれません。

物理シミュレーションがメインの演出だったり、細かいエフェクトにこだわりたい場合は、高校物理の範囲を少し学んでみるといいかもしれません。

 

今回は以上です。

力学はいいぞ。

コメント

タイトルとURLをコピーしました