Good morning! Let's work hard today!

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

今回は下記の記事の発展編になります。

例をそれぞれ紹介していきます。

反復運動

public class Test : MonoBehaviour
{
    bool flag;//[1]
    // Start is called before the first frame update
    void Start()
    {
     flag = false;//[2]
    }

    // Update is called once per frame
    void Update()
    {
        if (flag)
        {
            if (this.transform.position.x > 3.0f)//[3]
            {
                flag = false;
            }
            this.transform.position += new Vector3(0.1f, 0, 0);//[4]
        }
        else
        {
            if (this.transform.position.x < -3.0f)//[5]
            {
                flag = true;
            }
            this.transform.position += new Vector3(-0.1f, 0, 0);//[6]
        }
    }

Cubeを左から右、右から左へと往復して移動させています。
ソースコードの簡単に説明をすると、
[1].変数「flag」をBool型で宣言しています。
[2].void start()で「flag」の初期値をfalseと設定しています。
[3].CubeのX座標が3より大きくなった場合に、「flag」をfalseにします。
[4].CubeのX座標に0.1加算します。
[5].CubeのX座標が-3より小さくなった場合に、「flag」をtrueにします。
[6].CubeのX座標に-0.1を加算します。
つまり、CubeのX座標が3.0より大きくなると-0.1の加算、-3.0より小さくなると0.1の加算に変化するものになります。

Cubeを「Duplicate」で複製し、Y軸の値をそれぞれ変えると次のような演出を行うことができます。ソースコードは何一つ変えていません。


キーボード入力でオブジェクトを動かす

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))//[1]
        {
            this.transform.position += new Vector3(-0.2f, 0f, 0);
        }
        else if (Input.GetKey(KeyCode.RightArrow))//[2]
        {
            this.transform.position += new Vector3(0.2f, 0f, 0);
        }
    }

こちらはキーボードの「←」ボタンを押している場合、左へキューブが移動し、
「→」ボタンを押している間、右へキューブが移動するスクリプトになります。
外部入力に対する動作はスクリプトで動作させる上で有用な点になります。アニメーションではできないため、ゲームを作る上ではかかせないですね。

スクリプトの説明をします。
[1]Input.GetKey(KeyCode.LeftArrow)は「←(左矢印キー)」を押している場合にtrueを返します。そのため、そのままif文の条件文として利用することができます。
[2]Input.GetKey(KeyCode.RightArrow)は「→(右矢印キー)」を押している場合にtrueを返します。

ゲームの操作にもこのInput.GetKey系を使っていることが多々あります。


オブジェクトを回転・拡大縮小させる

public class Test : MonoBehaviour
{
    float speed;
    bool flag;
    // Start is called before the first frame update
    void Start()
    {
        speed = 0;
        flag = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (flag)
        {
            if(this.transform.localScale.x > 2.0f)
            {
                flag = false;
            }
            this.transform.localScale += new Vector3(0.1f,0.1f,0);//[1]
        }
        else
        {
            if (this.transform.localScale.x < 0f)
            {
                flag = true;
            }
            this.transform.localScale -= new Vector3(0.1f, 0.1f, 0);//[2]
        }

        this.transform.Rotate(0,0,speed);//[3]


        if (Input.GetKey(KeyCode.LeftArrow)&&speed > 0)//[1]
        {
            speed -= 0.1f;
        }
        else if (Input.GetKey(KeyCode.RightArrow))//[2]
        {
            speed += 0.1f;
        }
    }
}

今までpositionにVector3型を加算して移動させる方法でしたが、角度と大きさの変更を行う場合の例を取り上げてみました。
こちらはCubeの大きさ(拡大率)が0~2倍を行き来しています。「←」を押している間は徐々に回転速度が遅くなり、「→」を押している間は徐々に回転速度が速くなるようになっています。

角度は[3]で変化させています。角度は「transform.localRotate」で設定できますが、Vector3型ではなくQuatenion型で扱われているため、「new Vector3()」を加算することはできません。(Quatenion型をVector3型に変換、逆変換に関する方法は存在しますが、今回は割愛します。)

[3]は引数の値だけ、オブジェクトを回転させます。
[1],[2]は「transform.position」と同様に「new Vector3()」を加算することができます。


以上、あくまで一例ですがご参考にして頂けたなら幸いです。