クイックノート

ちょっとした発見・アイデアから知識の発掘を

Unity で物体を動かしてみる

Unityとはゲーム開発環境の一つですが、
物理演算も内包しているので、
物理シミュレーションをして遊ぶという使い方もできます。

とはいえ、遊ぶには色々と複雑で、
ハードルが高そうという印象があると思います。

そ子で、Unityの操作に慣れるため、
ここでは、簡単なシミュレーションを作ってみようと思います。

完成系は下の動画のように、
地球と月の重力化でジャンプするというシミュレーションです。


地球と月のジャンプ力

Unityをインストールする

まずは、Unityをインストールするところからです。

Unityのダウンロードページから、
Unity をダウンロードして、
インストーラーの支持に沿ってインストールします。

インストールできたらunityで3Dのテンプレートを開いて、
準備完了です。

オブジェクトの設置

何も配置されていないまっさらな空間からスタートします。

f:id:u874072e:20191129161159p:plain
初期のシーン

ここに、オブジェクトと呼ばれるモノを置いていき、
それぞれのオブジェクトの動き方を指定していきます。

まずは、いくつかオブジェクトを置いてみましょう。

まず、舞台となる地面を設置します。
左側にあるHierarchyウィンドウから、
オブジェクトを追加することができます。

Hierarchyウィンドウを右クリックすると、
メニューが表示されるので、
「3D Object」→「Cube」
を選択します。

f:id:u874072e:20191126123126p:plain:h300
Hierarchyウィンドウを右クリック

すると立方体(Cube)が生成されるので、
今度は、この物体を薄く広げてみます。

右側のInspectorウィンドウで物体の設定を変えることができます。
Inspectorウィンドウの「Transform」の欄の数値を、
下の図のように設定してみましょう。

f:id:u874072e:20191129162222p:plain
舞台の設定値

Positionは物体の座標、
Rotationは物体の角度、
Scaleは物体の大きさを表しています。

今は舞台となるように台を大きくしたいので、
Scaleを大きく設定しています。
Y方向が垂直方向を、X,Zが水平方向を表すので、
水平方向のscaleの値を大きくすることで広い舞台が作れます。

f:id:u874072e:20191126123258p:plain
設置された舞台

物体

舞台ができたので、
その上に物体を置きましょう。
今回は、この物体がジャンプします。

先ほどと同様に、
Hierarchyウィンドウを右クリックして、
「3D Object」→「Cube」を選択します。

そして、Inspectorウィンドウから、
物体の設定をします。
今回は下のような値に設定しました。

f:id:u874072e:20191129162543p:plain
物体の設定値

ちょうど台の上に乗るような設定です。

f:id:u874072e:20191126123540p:plain:h300
設置された物体

この物体の動きをシミュレーションしたいのですが、
物体がどういう動き方をするかを決める必要があります。

Unityではコンポーネントと呼ばれる単位を物体に設定することで、
物体の様々な動きの処理を指定できます。

今回は、
Inspectorウィンドウから「Add Component」をクリックして、
「Rigidbody」(剛体)を選択してみます。

f:id:u874072e:20191126123609p:plain:h300
Rigidbodyのコンポーネントを追加する

Rigidbodyは一番シンプルな動きのモデルで、
これを設定すると、
重力や衝突時の跳ね返りなどをシミュレートするようになります。

ジャンプのスクリプト

ジャンプするためには、
力を加える必要があります。

そこで、力を加えるスクリプトを書きます。

「Add Component」から「New script」を選択して、
「jumping」という名前の新しいコンポーネントを作りましょう。

f:id:u874072e:20191126123716p:plain
スクリプトを追加する

生成されたスクリプトファイルを開いて、
下のようなスクリプトを記述します。

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);
        }

    }
}

スクリプトでは、StartUpdateがメインになります。
Startはシミュレーション開始時に一回だけ、
Updateはシミュレーションの間に定期的に呼び出されます。

ここでは、Start内で物体の色を赤色に変更し、
Update内でタイミングに応じて上向きの力を加えることで、
物体をジャンプさせています。

また、二回目のジャンプの時には、
重力を月の重力に変更しています。

以降は、スクリプトで使っている要素についての捕捉です。

Material

Materialはunityで物体をどのように描画するかを決定するコンポーネントです。

今回は、物体の色を設定するためにcolorの値を設定しています。
色は、R,G,B,alphaの4つの数値で設定していて、
それぞれ、レッド、グリーン、ブルー、透明度を表しています。

Physics

重力を変更するために、
Physics.gravityの値を変更しています。

重力は、働く向きと大きさをベクトルで設定していて、
今の場合、鉛直下向きに重力を働かせたいので、
Y方向に負の値を設定しています。

Rigidbody.AddForce

Rigidbody(剛体)のコンポーネントに対して、
AddForceで力を加えています。

力はベクトルで大きさと向きを指定していて、
ForceMode.Impulseはその力が瞬間的に働く力であることを表しています。

まとめ

Unity の使用感を掴むための簡単なシミュレーションの作り方をみてきました。

自分で書いたスクリプトは、二回力を加えるという記述をしただけで、
ジャンプの動き方や、重力による落下は物理エンジンが処理してくれています。
上手く物理エンジンに外注できれば、
楽に物理シミュレーションができそうですね。

プライバシーポリシー