【はじめてのUnity】第二回:ボールを左右移動させる

2016.05.02

< 前回:【はじめてのUnity】第一回:ボールを操作する
次回:【はじめてのUnity】第三回:フィールドを操作する >

こんぬづは、GW入ってから昨日まで毎日5hほど太極拳をやりまくってる田中です。

前回はキーボードからの操作でボールを前後移動させることをやってみました。
前後移動ときたら、今度は左右移動ですよね。
今回はそれをやっていきましょう

左右移動の仕方

右折左折方法の検討

右折左折の考え方は2つあるかと考えました。

①横移動

13128995_1021124867972583_2050594444_o

②角度を回転させる

13128846_1021124844639252_1003739448_o

今回は角度を回転させる方にします。
理由はW, Sのキーとの併用で微妙な移動が実現できて、「キャラクターを操作するゲームっぽくなるな!」という気がするからです。

回転させるコードの実装

では検討を踏まえてコードに落としていきましょう。

using UnityEngine;
using System.Collections;

public class BallController : MonoBehaviour {

    public float movementSpeed;
    public float amountOfRotation;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKey (KeyCode.W)) {
            transform.position += transform.forward * movementSpeed;
        }
        if (Input.GetKey (KeyCode.S)) {
            transform.position -= transform.forward * movementSpeed;
        }

        if (Input.GetKey (KeyCode.A)) {
            transform.Rotate (Vector3.up, -amountOfRotation);
        }
        if (Input.GetKey (KeyCode.D)) {
            transform.Rotate (Vector3.up, amountOfRotation);
        }
    }
}

今回新しく使う関数はRotate()です。
Transform.Rotate
第一引数に回転軸、第二引数に回転量を代入します。

そしてここで使っているVector3.upについては以下をご覧ください。
Vector3.up
Vector3(0, 1, 0)の省略形のようです。

なのでここでは「GetKeyを検知したらamountOfRotation分、y軸を回転させる」ということになります。
amoutOfRotationは回転量のプロパティとして宣言しました。

Unity上でプロパティを変更

宣言したamountOfRotationプロパティに値をセットします。

スクリーンショット_2016-05-01_23_05_32

完成!

まとめ

前回と合わせて、これでボールを前後左右に動かすことができました!
これでキー入力からオブジェクトを操作して動かすのはバッチリですね!
(多分他にも上下移動とかあるけどね)

おまけ

前回のブログを読んだ友人からこんな指摘をいただきました。
「コードの意味として、位置 += 方向 * スピードで考えると-=というのは位置をマイナスするという意味になる。それはおかしいのではないか」

if (Input.GetKey (KeyCode.S)) {
    transform.position -= transform.forward * movementSpeed;
}

ここのことですね。
確かに、位置に対してマイナスというのは論理的でないかもしれません。

transform.forwardのforwardというのはオブジェクトの向いている方向のベクトルのこと。
向いている方向というと、前方向ということです。
前回のコードであれば、「前方向のベクトルに移動速度分を掛けた分positionを移動する」という意味のコードです。

マイナスをかけるとすればベクトルに対してマイナスをかけてやる方が意味合いとして正しいのでは、ということで以下のように修正してみました。

if (Input.GetKey (KeyCode.S)) {
    transform.position += -transform.forward * movementSpeed;
}

前方向のベクトルにマイナスをかけて後ろ向きの方向のベクトルという意味にしました。
(backwardとか用意してくれたらいいのにナとかちょっと思いましたが、、、)

動作上は変わりありませんがこういう細かいコードの意味を考えてあげることは読みやすいコードを書くことにおいて重要なので、気をつけていきたいです。
ご指摘ありがとうございました!