Unity 6の2Dでオブジェクトを自動的に右へ移動させる方法(transform.positionとTime.deltaTime)

広告

この記事は「Unity 6 2D移動の総合ガイド」の一部です。このシリーズの最初の記事として、もっとも簡単な移動から始めます。

ゲームを再生すると、オブジェクトが自動的に右へ動き続ける。たったそれだけのスクリプトを書いて、ゲームオブジェクトを動かす基本の考え方をつかみましょう。

この記事で分かること

  • transform.positionを使った座標による移動
  • Vector3.rightという方向の表し方
  • Time.deltaTimeを掛ける理由
  • 方向を変える方法と、斜め移動でnormalizedが必要な理由

1. 完成する動き

ゲームを再生すると、Player(四角いスプライト)が左から右へ、一定の速さで自動的に動き続けます。キー操作はありません。

四角いオブジェクトがtransform.positionで画面の右へ自動的に移動していく動作

2. 前提と準備

共通の準備(プロジェクト作成とPlayerの作成)は、総合ガイドの「共通の準備」をご覧ください。

この記事ではキー入力を使いません。そのためInput Systemの設定も不要です。また、Rigidbody 2DやColliderも付けなくて構いません。

確認することは、次の2点だけです。

  1. HierarchyにPlayer(2D Object → Sprites → Square)がある
  2. PlayerのPositionが(0, 0, 0)になっている

3. スクリプトを作る

Projectウィンドウで右クリックし、Create → MonoBehaviour Scriptを選びます。名前をAutoMoveにし、Playerにドラッグアンドドロップで取り付けます。

AutoMove.csを開いて、次のように書き換えます。

using UnityEngine;

public class AutoMove : MonoBehaviour
{
    [SerializeField] float speed = 3f;

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

保存してUnityに戻り、ゲームを再生すると、Playerが右へ動き始めます。

4. コードの解説

① [SerializeField] float speed = 3f;

移動速度を表す変数です。[SerializeField]を付けると、Inspectorから値を変更できます。ゲームを再生しながらInspectorで数値を変えて、速さが変わるのを確かめてみましょう。

speedは1秒間に移動する距離です。speed = 3なら1秒間に約3ユニット移動します。

② void Update()

Updateは、ゲームのフレームごとに毎回呼ばれるメソッドです。パラパラ漫画の「1コマ」ごとに、この中身が実行されるイメージです。毎コマ少しずつ位置をずらすと、オブジェクトは滑らかに動いて見えます。

③ Vector3.right

Vector3.rightは、右方向を表すベクトルです。次の値と同じです。

new Vector3(1, 0, 0)

つまり、X方向に1だけ進む方向を示します。ここにspeedを掛けると、「右へ、この速さで」という意味になります。

④ Time.deltaTime

Time.deltaTimeは、前のフレームから今のフレームまでにかかった時間(単位は秒)です。

たとえば1秒間に60フレームで動くパソコンでは、Time.deltaTimeは約1/60秒(約0.017)です。これを掛けると、1フレームの移動量は3 × 0.017 ≈ 0.05になり、これを毎秒60回繰り返すとちょうど3ユニット進みます。

もしTime.deltaTimeを掛けないと、フレーム数が多いパソコンほど速く動いてしまいます。Time.deltaTimeを掛けることで、フレームレートが違っても移動速度をほぼ一定にできます。

⑤ transform.position +=

transform.positionは、オブジェクトの現在位置です。+=で、現在位置に移動量を足して新しい位置にします。

5. よくあるつまずき

症状確認すること
何も動かないスクリプトをPlayerに取り付けたか。InspectorでSpeedが0になっていないか
スクリプトを取り付けられないクラス名とファイル名(AutoMove)が一致しているか
コンパイルエラーが出る;の抜けや、Vector3.rightの大文字・小文字の間違いがないか
すぐ画面外に出てしまうspeedを小さくする。カメラに映っている範囲をSceneビューで確認する

また、この移動はtransform.positionを直接変更しているため、壁のようなColliderがあっても自動的に止まりません。衝突を正しく扱いたい場合は、Rigidbody2Dを使う移動(④)を学びましょう。

6. 練習問題

次の移動に変更してみましょう。

  1. 左方向へ移動する
  2. 上方向へ移動する
  3. 右上方向へ移動する

ヒント

  • 左や上の方向を表すベクトルもあります。入力ボックスでVector3.と打つと、候補が表示されます。
  • 右上は、次のように書けます。
Vector3 direction = new Vector3(1, 1, 0).normalized;

normalizedは、ベクトルの長さを1にそろえる機能です。(1, 1, 0)の長さは約1.414です。そのままだと斜めだけ約1.4倍速くなってしまうため、長さを1にして速さをそろえます。

解答例(まず自分で試してから見ましょう)

void Update()
{
    Vector3 direction = new Vector3(1, 1, 0).normalized;

    transform.position += direction
                        * speed
                        * Time.deltaTime;
}

左はVector3.left、上はVector3.upです。

7. まとめ

  • 座標を直接変えるにはtransform.positionを使う
  • 方向はVector3.rightなどのベクトルで表す
  • 速度 × Time.deltaTimeで、フレームレートに関係なく同じ速さで動かせる
  • 斜め移動ではnormalizedで方向ベクトルの長さをそろえる

次の記事では、キー操作でプレイヤーを左右に動かします。

訪問数 6 回, 今日の訪問数 6回

広告