Unityを使うとコードをあれこれ書かなくても2D/3Dゲームを簡単につくることができます。Rigidbody を使うと、ゲームオブジェクトを物理特性によって制御する事ができるようになります。重力の影響を加えたり、それ以外の力を与えることでどのように動くかをシミュレーションすることができるようになるのです。

ボールを地面におとすと反発します。反発係数が1.0であれば永久にボールは跳ね続けます。実際には反発係数は1.0よりも小さいのでボールは動かなくなってしまうのですが、どれくらいの反発係数でどれくらいボールは跳ね続けるのでしょうか? Unityをつかってシミュレーションするプログラムをつくってみました。

まずUnityのプロジェクトをつくり、ヒエラルキーで「空のオブジェクトを作成」。するとGameObjectが生成されます。つぎにassetsを右クリックして「C#スクリプトを生成」、名前は適当でかまいません。スクリプトの名前は「GameObjectScript1」に変更しました。

GameObjectScript1をダブルクリックするとVisualStudioが立ち上がります。このとき「public class GameObjectScript1」と書かれている部分、クラス名はファイル名と同じにしてください。

これをヒエラルキーのGameObjectにドラッグアンドドロップしましょう。

次にこのファイルをもう一度開いて編集します。

まず床をつくります。球体の落下実験をしたいのですが、床がないと球体はそのままどこまでも落下してしまいます。

次に球体をつくります。場所はY座標5、Z座標0、X座標は少しずつ変更させて10個表示させます。球の大きさはlocalScaleはnew Vector3(0.7f, 0.7f, 0.7f);として1よりも少し小さい値にします。これは10個横に並べると幅をとるからでそれ以外にたいした意味はありません。

球を作ったらコンポーネントでRigidbodyとSphereColliderを追加します。Rigidbodyを追加することで重力の影響をうけます。

そのあと自作メソッド SetBouncinessを呼び出します。これは反発係数を設定するためです。最初は10個の球体に0から1.0までの値を設定しています。

Update()メソッドはとくに書くことはありません。これで実行してみましょう。

上記のコードを実行すると反発係数が0.6まではほとんど反発しないことがわかります。反発係数が1.0にすると永久に跳ね続けますが、ちょっとおかしな部分があります。だんだん跳ね上がる高さが高くなっていきます。これは物理学的にはありえないことです。物理学的現象に忠実再現することができるわけではないようです。

SetBouncinessメソッドを変化させれば反発係数の違いがどのように影響するかだいたいであればわかります。

0.6まではほとんど跳ねなかったので0.8から0.02刻みで実験してみましょう。SetBouncinessメソッドを以下のように書き換えます。

0.8から0.02刻みの実行結果

これなら0.9から0.01刻みで検証することができます。

0.9から0.01刻みの実行結果