フリーキーズ | 独学プログラミング

Unityで初心者でも簡単!超基本的でシンプルな移動の実装方法

リンドくん

リンドくん

たなべ先生、Unityでゲームを作りたいんですけど、キャラクターの移動ってどうやって実装するんですか?
コードとか難しそうで...

たなべ

たなべ

実はUnityでのキャラ移動は思ったより簡単なんだよ。初心者でも数行のコードで実装できるし、コンポーネントを使えばコードは最低限書くだけで動くんだ。
今日はそれを一緒に見ていこう!

ゲーム開発をする上で最も基本的な要素と言えば「キャラクターの移動」ではないでしょうか。
Unityでゲーム開発を始めたばかりの方にとって、この移動の実装は最初の大きな壁になりがちです。

「コードが難しそう」「物理エンジンの仕組みがわからない」「どのコンポーネントを使えばいいの?」など、様々な不安を抱えていることでしょう。

でも、ご安心ください!
今回の記事では、Unityで最もシンプルにキャラクターを移動させる方法を、初心者の方にもわかりやすく解説します。
最小限のコードを使った方法をご紹介しますので、プログラミングの経験が少ない方でも実装できるはずです。

Transformコンポーネントで最速実装

リンドくん

リンドくん

移動を実装するのに、何かプラグインとか追加で必要なものはあるんですか?

たなべ

たなべ

Unityには最初から「Transform」というコンポーネントが全てのオブジェクトについているんだ。
これを使うだけで、最も基本的な移動は実装できるよ!

Transformとは何か

Unityで作成するすべてのゲームオブジェクトには、デフォルトでTransformというコンポーネントが付いています。
このTransformは、オブジェクトの位置(Position)回転(Rotation)大きさ(Scale)を管理する基本的なコンポーネントです。

移動を実装する最もシンプルな方法は、このTransformコンポーネントを直接操作することです。

Transformコンポーネント

Transformコンポーネント

基本的なTransform移動のコード例

以下は、キャラクターを矢印キーで移動させる最もシンプルなコード例です。

using UnityEngine;

public class SimpleMovement : MonoBehaviour
{
    public float speed = 5.0f; // 移動速度
    
    void Update()
    {
        // 水平方向の入力(左右キー)
        float horizontalInput = Input.GetAxis("Horizontal");
        
        // 垂直方向の入力(上下キー)
        float verticalInput = Input.GetAxis("Vertical");
        
        // 移動量を計算
        Vector3 movement = new Vector3(horizontalInput, 0, verticalInput) * speed * Time.deltaTime;
        
        // 位置を変更
        transform.position += movement;
    }
}

このコードを解説すると以下のようになります。

  1. Input.GetAxis - 矢印キーやWASDキーからの入力を-1.0〜1.0の値で取得します
  2. Vector3 - X軸(左右)とZ軸(前後)の移動量を指定します
  3. transform.position - オブジェクトの位置を直接変更しています

このコードをC#スクリプトとして作成し、移動させたいオブジェクトにアタッチするだけで、シンプルな移動が実装できます!
Time.deltaTimeを掛けることで、どのようなフレームレートでも一定の速度で動くようになります。

なぜTransformが初心者におすすめなのか

Transformによる移動は以下の理由で初心者におすすめです。

  • シンプルで理解しやすい - 位置を直接変更するだけなので概念が簡単です
  • 少ないコード - 数行のコードで実装できます
  • 確実な動き - 物理演算に比べて予測しやすい動きになります

ただし、Transformによる移動は物理的な衝突や摩擦などを考慮しないため、より自然な動きが必要な場合は次に紹介する方法が適しています。

Rigidbodyで物理ベースの移動を実装

リンドくん

リンドくん

物理エンジンを使った移動ってどういう感じなんですか?
Transformとどう違うんですか?

たなべ

たなべ

物理エンジンを使うと、重力、摩擦、衝突など、現実世界に近い動きを実現できるんだ。
Transformは直接位置を変えるけど、Rigidbodyは「力」を加えて動かすイメージだね。

Rigidbodyコンポーネントとは

Rigidbody(剛体)は、物理シミュレーションを適用するためのコンポーネントです。
これを使うと、重力の影響を受けたり、他のオブジェクトと自然に衝突したりする動きが実現できます。

Rigidbodyコンポーネント

Rigidbodyコンポーネント

Rigidbodyを使った移動の基本手順

  1. コンポーネントの追加 - 移動させたいオブジェクトに「Rigidbody」コンポーネントを追加します
  2. Collider(衝突判定)の追加 - 通常はBox ColliderやSphere Colliderも追加します
  3. コードの実装 - 物理ベースの移動用のコードを記述します

Rigidbodyによる移動のコード例

using UnityEngine;

public class PhysicsMovement : MonoBehaviour
{
    public float speed = 5.0f;
    private Rigidbody rb;
    
    void Start()
    {
        // Rigidbodyコンポーネントを取得
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate() // 物理計算には Update ではなく FixedUpdate を使用
    {
        // 入力を取得
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");
        
        // 移動量を計算
        Vector3 movement = new Vector3(horizontalInput, 0, verticalInput) * speed;
        
        // 物理ベースの移動を適用
        rb.velocity = movement;
    }
}

このコードの特徴は以下です。

  1. FixedUpdate - 物理計算には Update ではなく FixedUpdate を使います
  2. rb.velocity - 速度を直接設定することで移動を制御しています
  3. Time.deltaTime不要 - FixedUpdateは一定間隔で呼び出されるため不要です

Transformとの違いと利点

Rigidbodyを使った移動は以下の点でTransformとは異なります。

  • 物理法則に従う - 重力や摩擦などの影響を受けます
  • 衝突判定が自動 - 他のColliderとの衝突を自動的に処理します
  • より自然な動き - 特に3Dゲームでは自然な挙動になります

プラットフォーマーゲーム(一般的には横スクロールゲーム)や、現実的な動きが必要なゲームでは、Rigidbodyを使った移動がおすすめです。
ただし、完全に物理に依存させると制御しづらい場面もあるため、ゲームの種類によって適切な方法を選ぶことが大切です。

移動実装のトラブルシューティングと最適化

リンドくん

リンドくん

移動を実装したけど、思ったように動かなかったり遅かったりする場合はどうすればいいですか?

たなべ

たなべ

よくある問題と解決法をいくつか紹介するね。実は「なぜ動かないのか」というトラブルにはパターンがあるんだ。
一つずつ解決していこう!

1. キャラクターが全く動かない

  • スクリプトがアタッチされていない → オブジェクトにスクリプトをアタッチしましょう
  • コンポーネントが取得できていない → GetComponent部分を確認しましょう
  • Input名が間違っている → Project Settings > Input Managerで設定を確認しましょう

2. キャラクターが滑る、または移動が不自然

  • 摩擦が足りない → Rigidbodyの場合はPhysics Materialを調整しましょう
  • 速度が速すぎる/遅すぎる → speed変数の値を調整しましょう
  • Time.deltaTimeの使い忘れ → フレームレート依存の動きにならないよう、Time.deltaTimeを掛けましょう

3. 衝突判定がうまく機能しない

  • Colliderがない → オブジェクトにColliderコンポーネントを追加しましょう
  • Triggerになっている → ColliderのIs Triggerチェックを外しましょう
  • レイヤー設定によるフィルタリング → Physics設定のレイヤーマトリックスを確認しましょう

まとめ

リンドくん

リンドくん

いろんな方法があるんですね!
自分のゲームではどれを選べばいいんでしょうか?

たなべ

たなべ

それぞれのゲームジャンルや目的によって最適な選択肢が変わってくるよ。
ざっくりまとめてみるね!

Unityでの移動実装には様々な方法があることがお分かりいただけたかと思います。
ここで、どのような場合にどの方法を選ぶべきかをまとめておきましょう。

ゲームタイプ別おすすめの移動実装練習課題

  • 2Dゲーム(プラットフォーマー): Rigidbody2D + 力を加える
  • トップダウンゲーム: Transform直接移動またはRigidbody
  • レーシングゲーム: Rigidbodyに力を加える

Unityでの移動実装は、ゲーム開発の基礎的かつ重要な部分です。
この記事で紹介した方法を参考に、ぜひあなただけのユニークなゲームを作り上げてください!

関連するコンテンツ