Unity 6の2Dでオブジェクトを自動的に右へ移動させる方法(transform.positionとTime.deltaTime)
この記事は「Unity 6 2D移動の総合ガイド」の一部です。このシリーズの最初の記事として、もっとも簡単な移動から始めます。
ゲームを再生すると、オブジェクトが自動的に右へ動き続ける。たったそれだけのスクリプトを書いて、ゲームオブジェクトを動かす基本の考え方をつかみましょう。
この記事で分かること
transform.positionを使った座標による移動Vector3.rightという方向の表し方Time.deltaTimeを掛ける理由- 方向を変える方法と、斜め移動で
normalizedが必要な理由
1. 完成する動き
ゲームを再生すると、Player(四角いスプライト)が左から右へ、一定の速さで自動的に動き続けます。キー操作はありません。
2. 前提と準備
共通の準備(プロジェクト作成とPlayerの作成)は、総合ガイドの「共通の準備」をご覧ください。
この記事ではキー入力を使いません。そのためInput Systemの設定も不要です。また、Rigidbody 2DやColliderも付けなくて構いません。
確認することは、次の2点だけです。
- Hierarchyに
Player(2D Object → Sprites → Square)がある - 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. 練習問題
次の移動に変更してみましょう。
- 左方向へ移動する
- 上方向へ移動する
- 右上方向へ移動する
ヒント
- 左や上の方向を表すベクトルもあります。入力ボックスで
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で方向ベクトルの長さをそろえる
次の記事では、キー操作でプレイヤーを左右に動かします。









ディスカッション
コメント一覧
まだ、コメントがありません