03 %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88 - ruccho/first-step-to-unity GitHub Wiki

03 スクリプト

さて、玉転がしは玉とステージの基盤ができました。次は玉を操作できるようにしてみましょう。

Sphereに「キーボードで操作される」振る舞いを与えたいですね。前節で説明したGameObjectとコンポーネントの関係を考えると、「キーボードで操作される」機能を持ったコンポーネントを取り付ける必要がありそうです。

……しかし実は、Unityでは標準でそのようなコンポーネントは実装されていません。それではどうするのかというと、コンポーネントを自分で作る必要があります。

1 スクリプトを書く

1.1 スクリプトの作成

コンポーネントを作るには、スクリプトを記述する必要があります。スクリプト、つまりプログラミングの出番です。

Projectウィンドウの適当なフォルダで右クリックし、Create > C# Scriptを選択します。

image

スクリプトの名前の入力を求められるので、Ballとでもしておきましょう。

image

作成したスクリプトをダブルクリックすると、編集することができます。

テンプレートが表示されるので、以下のように編集してみます。忘れずに保存をしておいてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

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

    //----ここから追加----

    void FixedUpdate()
    {
        GetComponent<Rigidbody>().AddForce(new Vector3(10, 0, 0));
    }

    //---- ここまで ----
}

コードの意味は置いといて、ひとまず動かしてみましょう。 Unityに戻り、作成したスクリプトをSphereのInspectorにドラッグ&ドロップすると……

image

これで作成したBallコンポーネントがSphereに取り付けられました。

このままPlayしてみると……?

image

あれ~~~~

ボールが一直線にステージ外へ! さきほど編集したコードを見てみましょう。

    //ゲームの実行中、0.02秒間隔で実行される
    void FixedUpdate()
    {
        //GetComponentでRigidbodyコンポーネントを取得し、AddForceで右方向へ力を加える
        GetComponent<Rigidbody>().AddForce(new Vector3(10, 0, 0));
    }

スクリプトにFixedUpdate()というメソッドを記述すると、その内容は0.02秒間隔で繰り返し実行されます。

GetComponent<Rigidbody>()は、このスクリプトが取り付けられているGameObjectからRigidbodyコンポーネントを取得できるメソッドです。Rigidbodyは物体の物理的な挙動をおこなうコンポーネントでしたね。

次にAddForce()メソッドですが、これはRigidbodyに対し力を加えるメソッドです。加える力はベクトルで表され、ここではnew Vector3(10, 0, 0)となっています。

Vector3はUnityにおける3次元ベクトルを表現する構造体で、new Vector3(x, y, z)のように定義します。X軸は横軸、Y軸は鉛直軸、Z軸が奥行軸です。ついでにそれぞれの正の方向は、X軸+が右、Y軸+が上、Z軸+が奥となります。これはUnityにおける例ですが、他の3Dソフトウェアでは異なることもあるので注意が必要です。

new Vector3(10, 0, 0)は右方向への大きさ10のベクトルを示していたわけですね。

1.2 入力を受け取る

さきほどは右方向へ常に一定の大きさの力を加えていました。これをユーザーのキーボード入力に対応させたいところです。 先ほどのFixedUpdate()を編集します。

    void FixedUpdate()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        GetComponent<Rigidbody>().AddForce(new Vector3(horizontal, 0, vertical) * 10);
    }

さて、なにやら記述が増えていますね。

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");

Input.GetAxis()は、キーボードの入力を取得する記述です。引数に"Horizontal"を指定することで左右入力が、"Vertical"を指定することで上下入力がそれぞれ取得できます。取得できる値の範囲は-1~1です。

これで入力が取れたので、Rigidbodyに力を加えます。

GetComponent<Rigidbody>().AddForce(new Vector3(horizontal, 0, vertical) * 10);

注目すべきはnew Vector3(horizontal, 0, vertical) * 10ですね。Xに横入力、Zに縦入力を設定し、ベクトルを10倍しています。

image

ボールが動くようになりました!

⚠️ **GitHub.com Fallback** ⚠️