見出し画像

【Unity 初心者向け】オブジェクトの移動① | Transformのpositionを変更してオブジェクトを動かす方法

Unityでゲームを作ると、キャラクターや敵、アイテムなど、さまざまなオブジェクトを動かすことになります。

Unityにはオブジェクトを動かす方法がいくつもあります。

例えば、

  • Transformのpositionを変更する

  • Transform.Translateを使う

  • Rigidbodyを使う

  • AddForceで力を加える

今回はその中でも、一番基本となる「Transform の position を変更してオブジェクトを動かす方法」を確認していきます。

まずは「座標を変えればオブジェクトは動く」というところから始めていきましょう。


今回やること

まずは、Cubeを右方向へ自動的に移動させてみます。

最終的には、次のようなコードを作ります。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
    }
}

まだコードの意味が分からなくても大丈夫です。
順番に確認していきましょう。



Transformとは?

Unityでオブジェクトを作成すると、Transformコンポーネントが付いています。
例えばCubeを選択すると、InspectorにTransformが表示されます。

Transformでは、主に次の3つを管理しています。

  • Position:位置

  • Rotation:回転

  • Scale:大きさ

今回は、この中のPositionを使います。


Positionはオブジェクトの位置

Positionには、

  • X

  • Y

  • Z

という3つの値があります。

例えば、

X = 0
Y = 0
Z = 0

なら、オブジェクトは座標 (0, 0, 0) にあります。

Xの値を、

X = 3

に変更すると、オブジェクトはX方向へ移動します。

同じように、

  • Xを変更する → 左右方向

  • Yを変更する → 上下方向

  • Zを変更する → 前後方向

へ位置が変わります。

つまり、Unityでオブジェクトを動かす一番基本的な考え方は「Positionの値を変更する」ことです。


実際にPositionを変更してみる

まずはUnity上で確認してみましょう。

作成したCubeを選択し、Transform の Position を確認します。

最初に、以下の値になっているのを確認します。
0 になっていない場合は、直接数字を入力して座標を調整します。

X = 0
Y = 0
Z = 0

次にXを、

X = 3

に変更します。
すると、Cubeが右方向へ移動します。
さらに、

X = -3

にすると、今度は反対方向へ移動します。

このように、Positionの値によってオブジェクトが表示される場所が決まっています。


スクリプトからPositionを変更する

今度は、このPositionをスクリプトから変更してみます。

ObjectMove というスクリプトを作成し、Cubeにアタッチしてください。

ObjectMove を立ち上げて次のように書きます。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    void Start()
    {
        transform.position = new Vector3(3, 0, 0);
    }
}

ゲームを実行すると、Cubeが座標(3,0,0)へ移動します。


transform.positionとは?

この部分を見てみましょう。

transform.position

transformは、このスクリプトが付いているオブジェクトのTransformを表します。そして、

.position

を付けることで、その Transform の Position を指定しています。

つまり、

transform.position

は、「このオブジェクトの現在位置」と考えることができます。


Vector3とは?

次はこちらです。

new Vector3(3, 0, 0)

Positionには、

  • X

  • Y

  • Z

の3つの値があると、冒頭に説明しました。
そのため、スクリプトでも3つの値をまとめて指定します。

new Vector3(X, Y, Z)

という形です。
今回の場合は、

new Vector3(3, 0, 0)

なので、

X = 3
Y = 0
Z = 0

という位置を表しています。

例えば、

new Vector3(0, 3, 0)

なら上方向、

new Vector3(-3, 0, 0)

なら左方向へ移動します。


positionを少しずつ変更する

ここまでは、オブジェクトを指定した場所へ移動させただけです。
次は、オブジェクトを動き続けるようにしてみます。
コードを次のように変更します。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    void Update()
    {
        transform.position += new Vector3(0.01f, 0, 0);
    }
}

ゲームを実行すると、Cubeが少しずつ右方向へ移動します。


なぜ動き続けるのか?

ポイントはUpdate()です。

void Update()
{
}

Updateは、ゲーム中に何度も繰り返し実行されます。

その中で、以下のコードをを実行しています。

transform.position += new Vector3(0.01f, 0, 0);

このコードでは、現在の Position に対して、X方向へ 0.01ずつ追加しています。

イメージとしては、

最初        X = 0

1回目       X = 0.01

2回目       X = 0.02

3回目       X = 0.03

4回目       X = 0.04

          ↓

少しずつ右へ移動

となります。

Positionが少しずつ変わり続けるため、画面上ではオブジェクトが移動しているように見えるわけです。


+= の意味

今回使っている、

+=

も確認しておきましょう。

例えば、

transform.position += new Vector3(0.01f, 0, 0);

は、現在の position に Vector3(0.01f, 0, 0) を追加する という意味です。

つまり、

transform.position =
    transform.position + new Vector3(0.01f, 0, 0);

と同じ意味になります。
+=を使うことで、短く書くことができます。


移動する方向を変えてみよう

Vector3の値を変更すると、移動する方向も変更できます。

右へ移動

transform.position += new Vector3(0.01f, 0, 0);

左へ移動

transform.position += new Vector3(-0.01f, 0, 0);

上へ移動

transform.position += new Vector3(0, 0.01f, 0);

下へ移動

transform.position += new Vector3(0, -0.01f, 0);

3Dゲームなら、Zの値を変更することで前後にも移動できます。

前へ移動

transform.position += new Vector3(0, 0, 0.01f);

いろいろな値を入れて、実際にどの方向へ動くのか試してみましょう。


移動速度を変数にする

毎回、

0.01f

とコードの中に直接書くよりも、移動速度を変数にしておくと変更しやすくなります。

public float speed = 5f;

これを使って、次のように書きます。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        transform.position +=
            new Vector3(speed * Time.deltaTime, 0, 0);
    }
}

publicにしているため、Inspectorからspeedを変更できます。

例えば、

Speed = 2

と、

Speed = 10

では移動速度が変わります。

実際に値を変更して確認してみてください。


Time.deltaTimeについて

コードの中に、

Time.deltaTime

が出てきました。

speed * Time.deltaTime

とすることで、パソコンやスマートフォンなどの環境によるフレームレートの違いに影響されにくい移動にできます。

Time.deltaTimeについては以前の記事で詳しく解説していますので、今回は詳しい説明は省略します。

今回覚えておきたいのは、

speed * Time.deltaTime

とすることで、speedを「1秒間にどれくらい移動するか」という値として扱いやすくなる、という点です。
処理が速いパソコンでも、遅いパソコンでも同じ速さで移動させることができます。


今回の完成コード

今回の完成コードはこちらです。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        transform.position +=
            new Vector3(speed * Time.deltaTime, 0, 0);
    }
}

このスクリプトをCubeなどのGameObjectに追加すると、右方向へ自動的に移動します。


今回のまとめ

今回は、Transformのpositionを変更してオブジェクトを動かす方法を確認しました。


次回予告

今回は、オブジェクトを自動的に動かしました。

しかしゲームでは、「右キーを押したら右へ動く」のように、プレイヤーの操作に合わせて動かしたいことが多くあります。

次回は、「入力されたときだけ動かす」をテーマに、キーボードの入力を取得してオブジェクトを動かす方法を確認していきます。


こちらはUnity初心者向けの記事をテーマ別にまとめています。
▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!