Unityとはゲーム開発環境の一つですが、
物理演算も内包しているので、
物理シミュレーションをして遊ぶという使い方もできます。
とはいえ、遊ぶには色々と複雑で、
ハードルが高そうという印象があると思います。
そ子で、Unityの操作に慣れるため、
ここでは、簡単なシミュレーションを作ってみようと思います。
完成系は下の動画のように、
地球と月の重力化でジャンプするというシミュレーションです。
Unityをインストールする
まずは、Unityをインストールするところからです。
Unityのダウンロードページから、
Unity をダウンロードして、
インストーラーの支持に沿ってインストールします。
インストールできたらunityで3Dのテンプレートを開いて、
準備完了です。
オブジェクトの設置
何も配置されていないまっさらな空間からスタートします。
ここに、オブジェクトと呼ばれるモノを置いていき、
それぞれのオブジェクトの動き方を指定していきます。
まずは、いくつかオブジェクトを置いてみましょう。
台
まず、舞台となる地面を設置します。
左側にあるHierarchyウィンドウから、
オブジェクトを追加することができます。
Hierarchyウィンドウを右クリックすると、
メニューが表示されるので、
「3D Object」→「Cube」
を選択します。
すると立方体(Cube)が生成されるので、
今度は、この物体を薄く広げてみます。
右側のInspectorウィンドウで物体の設定を変えることができます。
Inspectorウィンドウの「Transform」の欄の数値を、
下の図のように設定してみましょう。
Positionは物体の座標、
Rotationは物体の角度、
Scaleは物体の大きさを表しています。
今は舞台となるように台を大きくしたいので、
Scaleを大きく設定しています。
Y方向が垂直方向を、X,Zが水平方向を表すので、
水平方向のscaleの値を大きくすることで広い舞台が作れます。
物体
舞台ができたので、
その上に物体を置きましょう。
今回は、この物体がジャンプします。
先ほどと同様に、
Hierarchyウィンドウを右クリックして、
「3D Object」→「Cube」を選択します。
そして、Inspectorウィンドウから、
物体の設定をします。
今回は下のような値に設定しました。
ちょうど台の上に乗るような設定です。
この物体の動きをシミュレーションしたいのですが、
物体がどういう動き方をするかを決める必要があります。
Unityではコンポーネントと呼ばれる単位を物体に設定することで、
物体の様々な動きの処理を指定できます。
今回は、
Inspectorウィンドウから「Add Component」をクリックして、
「Rigidbody」(剛体)を選択してみます。
Rigidbodyは一番シンプルな動きのモデルで、
これを設定すると、
重力や衝突時の跳ね返りなどをシミュレートするようになります。
ジャンプのスクリプト
ジャンプするためには、
力を加える必要があります。
そこで、力を加えるスクリプトを書きます。
「Add Component」から「New script」を選択して、
「jumping」という名前の新しいコンポーネントを作りましょう。
生成されたスクリプトファイルを開いて、
下のようなスクリプトを記述します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class junping : MonoBehaviour { int tcnt = 0; float F = 4; // Start is called before the first frame update void Start() { Material mat = this.GetComponent<Renderer>().material; mat.color = new Color(1.0f, 0.0f, 0.0f, 1.0f); } // Update is called once per frame void Update() { tcnt += 1; Debug.Log(tcnt); if (tcnt == 1) { var rb = this.GetComponent<Rigidbody>(); rb.AddForce(new Vector3(0, F, 0), ForceMode.Impulse); }else if(tcnt == 60*2) { Physics.gravity = new Vector3(0, -1.62f, 0); var rb = this.GetComponent<Rigidbody>(); rb.AddForce(new Vector3(0, F, 0), ForceMode.Impulse); } } }
スクリプトでは、Start
とUpdate
がメインになります。
Start
はシミュレーション開始時に一回だけ、
Update
はシミュレーションの間に定期的に呼び出されます。
ここでは、Start
内で物体の色を赤色に変更し、
Update
内でタイミングに応じて上向きの力を加えることで、
物体をジャンプさせています。
また、二回目のジャンプの時には、
重力を月の重力に変更しています。
以降は、スクリプトで使っている要素についての捕捉です。
Material
Materialはunityで物体をどのように描画するかを決定するコンポーネントです。
今回は、物体の色を設定するためにcolor
の値を設定しています。
色は、R,G,B,alphaの4つの数値で設定していて、
それぞれ、レッド、グリーン、ブルー、透明度を表しています。
Physics
重力を変更するために、
Physics.gravity
の値を変更しています。
重力は、働く向きと大きさをベクトルで設定していて、
今の場合、鉛直下向きに重力を働かせたいので、
Y方向に負の値を設定しています。
Rigidbody.AddForce
Rigidbody(剛体)のコンポーネントに対して、
AddForce
で力を加えています。
力はベクトルで大きさと向きを指定していて、
ForceMode.Impulse
はその力が瞬間的に働く力であることを表しています。
まとめ
Unity の使用感を掴むための簡単なシミュレーションの作り方をみてきました。
自分で書いたスクリプトは、二回力を加えるという記述をしただけで、
ジャンプの動き方や、重力による落下は物理エンジンが処理してくれています。
上手く物理エンジンに外注できれば、
楽に物理シミュレーションができそうですね。