Good morning! Let's work hard today!

【Unity】C#スクリプトでオブジェクトを動かす

今回はC#スクリプトでオブジェクトを動かす方法についてです。
Play中にオブジェクトを動かかす方法としては「スクリプト」と「アニメーション」と「物理演算」の3つがあります。自分の意図的に動かす方法としては「スクリプト」と「アニメーション」の2つになります。それぞれメリット・デメリットがあります。

スクリプトとアニメーションの違い

事項①スクリプト②アニメーション利便性
作成方法ソースコードAnimationウィンドウ
動作確認ゲームを起動させるAnimationウィンドウのシークバーを動かす
可変性×
再利用同じソースコードを読み込ませるAnimationオブジェクトをPlayする
動作設定ソースコードオプション
複数動作各オブジェクトに対してソースコードを追加するまとめてAnimationウィンドウで確認可能

上の表からすると「アニメーション」の方が使いやすいように見えます。はい、使いやすいです。固定化された動作なら間違いなくアニメーションを利用した方がよいでしょう。私もそうしています。

ですが、「動的に移動先が変わる」場合はアニメーションでは表現することができません。アニメーションは作成された動きに従って動くので動きが固定化されているためです。

機能による表現の制限を少なくするために、スクリプトでの動かし方を覚えておくとよいでしょう。

事前準備

実際に動かして確認を行いましょう。
Unityを起動し、Hierarchyウィンドウ上で右クリック「3D Object」-「Cube」を作成しましょう。
Projectウィンドウ上で右クリック「Create」 – 「C# Script」でスクリプトを作成してください。ファイル名は「Test」とします。作成したTestをWクリックしてください。Wクリック後、開発環境が起動します。(Unityインストール時にVisual studioをインストールしていればVisual studioが起動する。)

Unity画面に戻ります、先程作成した「Cube」をクリックしInspectorウィンドウ内の「Add Component」ボタンをクリックします。「Scripts」から「Test」を選択します。これでオブジェクト「Cube」とスクリプト「Test」のリンクができました。

初期ソースコードの構成

開発環境の画面を確認します。すでにデフォルトの記載がされています。この記載内容について軽く説明します。
※今回usingについては触れないので割愛します。

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()----A----
    {
        
    }

    // Update is called once per frame
    void Update()----B----
    {
        
    }
}

・「—-A—-」の「void Start()」はコメントにも記載がされていますが、最初のUpdateフレームより前に呼ばれる部分になります。つまり、Update(){ — 処理 — }が行われる前に一度だけ処理が行われることを指しています。
・「—-B—-」の「void Update()」はフレームごとに一度呼ばれる部分になります。ここでいうフレームとはUnityにてゲーム実行中(Play中)に遷移する単位になります。fps(frame per second)のframeのことを指すと言えばわかりやすいのではないでしょうか

現状なんとなくの理解だけだと思います。そこで、以下のようにコードを入力し、実行してみましょう。
実行ボタンはUnityにてメニュバー下中央の「▶」ボタンになります。

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        this.transform.position += new Vector3(0,2,0);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

実行前と比べてY軸の座標が[+2]されていることが確認できると思います。「void Start()」にて移動処理を利用する機会があるとすれば、動的に初期位置を決める必要があるときになります。

次に以下のコードを記載し、実行してみましょう。

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        this.transform.position += new Vector3(0,2,0);
    }

    // Update is called once per frame
    void Update()
    {
        this.transform.position += new Vector3(0, 0, 0.01f);
    }
}

実行中に「Cube」をクリックして、Inspectorウィンドウを確認すると、TransformのPositionのZ値が0.01順次加算されていることが確認できます。これはUnity実行中に「Z値に0.01を加算する」処理が逐次読み込まれているためです。

スクリプトでオブジェクトを動かす

前章で既に動作確認のために移動させるコードの1つを利用して頂きました。記載したコードについて説明いたします。

・void Start()内に記載した以下のコードですが、「this」は「Cube」のオブジェクトのことを指します。事前準備で「Cube」のコンポーネントに「Test」スクリプトを追加したことで、「Cube」を「this」として扱うことができます。
・「transform.position」は「Cube」の座標位置を指しています。他に角度や大きさなども設定できますが今回は割愛します。
・「this.transform.position」はVector3型で管理されており、「new Vector3()」で同じVector3型で加算処理を行っています。
・Vector3は(X,Y,Z)の順番で制御することができ、下の式ではY座標に2を加算する処理となっています。

this.transform.position += new Vector3(0,2,0);

では、制限を設けた場合の例を紹介します。
以下のコードを入力して実行しましょう。

    void Update()
    {
        if (this.transform.position.x < 3.0f)
        {
            this.transform.position += new Vector3(0.1f, 0, 0f);
        }
    }

実行直後、Cubeが右側に動いてちょっと進んだら停止したかと思います。
これはCubeのX座標が3.0より小さい場合のみ、X軸に0.1が加算される処理が行われることから、途中で加算する処理が呼ばれなくなったためです。

このように制限を設けることで、アニメーションまがいのものはスクリプトで作ることができます。次はもう少し面白いスクリプトによるアニメーションを紹介したいと思います。

1 COMMENT

現在コメントは受け付けておりません。