Unity 2Dゲームの移動方法を解説!短いプログラムですぐできる【サンプルあり】

九十九すい

こんにちは!九十九すいです!Unityで2Dゲームをつくるなら必須級の仕組み、キャラクターの移動方法を解説してもらうよ!

こんな疑問をもったあなたにおすすめ!
  • 2Dゲームのキャラクターを移動させるのは難しそう…
  • 移動させるプログラムをすぐに知りたい!
  • 物理的な移動と座標的な移動の違いとは?

Unityで2Dのキャラクターを移動させるのはとても簡単です!プログラムはたったの数行書くだけで、誰でも実装できます。

完成イメージ

この記事の通りに実装をするだけで、思い通りに2Dキャラクターを操作できるようになります。

さらにアクションゲームなどで主に使用する物理的な移動と、シューティングゲームなど正確な移動を求められる座標的な移動も解説。

2つの移動方法を使い分けて、あなたのゲームに実装してみてください。

本格的なゲーム開発ができるUnityのスキルを最速で身につけたいならUdemyの動画学習がおすすめです!

実際にUnityを動かしている画面を見ながら勉強できるので、迷うことが少なく高効率で学べますよ。

Udemy一般的な
ITスクール
値段1,500円~
※毎月割引あり
平均
100,000円以上
講座数210,000講座以上平均10コースほど
受講時間
(期間)
約10~[h]
(最短1日から)
約200[h]
(平均2~3ヶ月)
講師への質問講座によるできる
Udemyと一般的なITスクールの比較

\【視聴期限なし】 今だけ1,500円~すぐに学べる

30日以内なら返金無料!

目次

Unity 2Dゲームの移動実装【簡単:5ステップ】

Unity 2Dゲームの移動実装【簡単:5ステップ】

C#とは・・・JavaやC++などと同じ、プログラミング言語の1つです。Webサービスやアプリ開発、ゲーム開発等に使用されています。C++よりも簡単で、プログラムも少なくて済む利点があります。

九十九すい

プログラミングは読むだけじゃなくて、実際に作成して思うままに改造してみると覚えやすくなるよ!

1|キャラクターを準備

ジャンプさせたいキャラクターの画像をUnityに取り込み、表示させます。

キャラクターを準備
キャラクター準備
  • 取り込みたい画像を「Assets」にドラッグ・アンド・ドロップ
  • 「Assets」にある画像を「Scene」もしくは「Herarchy」へドラッグ・アンド・ドロップ

準備はたったこれだけで完了です。

とーるくん

このキャラクターの画像はぼくです!ぼくが”異世界”を冒険する小説『つくもの語り』の連載をしていますので、ぜひご覧ください!

2|キャラクターに物理法則・当たり判定を付与

このままでは、画像をUnity上に表示させただけになってしまいます。

なので、キャラクターに「物理法則(Rigidbody 2D)」「当たり判定(Box Collider 2D)」を付与していきます。

物理法則(Rigidbody 2D)の追加

キャラクターに物理法則・当たり判定を付与
物理法則(Rigidbody 2D)の追加
  • 先ほどUnityに取り込んだキャラクターを「Hierarchy」で選択
  • インスペクター下部にある「Add Component」の中から、「Rigidbody 2D」を追加

この操作でキャラクターに物理法則を適用することができます。

具体的には重力が働くようになるので、キャラクターが下に向かって落下します。

当たり判定(Box Collider 2D)の追加

当たり判定(Box Collider 2D)の追加

物理法則を追加したときとやり方はほとんど同じです。

当たり判定(Box Collider 2D)の追加
  • 先ほどUnityに取り込んだキャラクターを「Hierarchy」で選択
  • インスペクター下部にある「Add Component」の中から、「Box Collider 2D」を追加

こうすることでキャラクターが当たり判定を持ち、他のオブジェクトにぶつかることができるようになりました。

九十九すい

「Box Collider 2D」を追加しないと、地面に触れることができずに落下していってしまうよ…

3|地面になるBoxを準備

このままではキャラクターが落下するだけですので、キャラクターを立たせるための地面を用意します。

地面のBoxを準備
地面の追加
  • 「Hierarchy」の上で右クリック
  • 開いたメニューから「2D Object」を選択
  • 「Sprites」を選択
  • 「Square」を選択

これでUnityの画面上に、地面になる白い箱が表示されます。

この作成したBoxの名称を「Box」から「Floor」に変更してください。
地面の当たり判定処理のプログラムで使用します。

箱をクリックすると四方に青い点が表示されますので、それを調節することで大きさを変えることができます。

地面の大きさを調節できたところで、地面には「当たり判定(Box Collider 2D)」を設定します。

地面のBoxを準備2
当たり判定(Box Collider 2D)を設定
  • 「Floor」を「Hierarchy」で選択
  • インスペクター下部にある「Add Component」の中から、「Box Collider 2D」を追加

こうすることで地面が当たり判定を持ち、キャラクターのための足場になりました。

とーるくん

地面には物理法則を設定する必要はありません!
設定すると地面まで落ちていってしまいます!

4|キャラクター移動のためのスクリプト(C#)の作成

最後に、キーボードの”A”か”D”もしくは矢印の”←”と”→”を押すことでキャラクターが左右へ移動するプログラムを実装します。

キャラクター移動のためのスクリプト

まずプログラムを記述するための「C#」ファイルを作ります。

下記の順で操作をします。

「C#」ファイルの作り方
  • 「Assets」の上で右クリック
  • 出てきたメニューの中から「Create」を選択
  • 「C# Script」を選択
  • 作成したC#ファイルは「PlayerMove」と名称をつける

作成したファイルを開き、下記プログラムを入力してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    // 移動速度の設定
    public float speed = 5.0f;
    //キャラクターのオブジェクトを入れる箱を作成  
    private Rigidbody2D playerRigidbody;

    void Start()
    {
        //キャラクターのオブジェクトを情報を取得
        playerRigidbody = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // Aキーが押されたら左に、Dキーが押されたら右に移動
        float moveHorizontal = Input.GetAxis("Horizontal");
        
        // キャラクターに移動する力を与える
        playerRigidbody.velocity = new Vector2(moveHorizontal * speed, playerRigidbody.velocity.y);

    }
}

このプログラムはキーボードの”A”か”D”もしくは矢印の”←”と”→”を押すことでキャラクターが左右へ移動する内容になっています。

次に作成したC#のファイルをキャラクターに実装させます。

キャラクター移動のためのスクリプト2
C#ファイルをキャラクターに実装
  • ジャンプさせたいオブジェクトを「Herarchy」で選択し
  • 作成したC#のファイル「PlayerMove」を、キャラクターのインスペクターへドラッグ・アンド・ドロップ

これで完了です。

Unityで実行させる(再生ボタン押す)とキャラクターに物理法則が付与され、スペースキーを押すとジャンプするようになりました。

キャラクター移動のためのスクリプト3

「▶」のボタン以外に、ショートカットキーのWin「Ctrl + P」、Mac「⌘ + P」で実行できます。

5|移動プログラム実行画面

わずかな作業量でキャラクターが移動できるプログラムを実装できました。

動画では重力を働かなくしているので、落下はしていません。

九十九すい

1~3まではまったく同じ方法で、ジャンプも実装できるよ!詳しくは『Unity 2Dゲームのジャンプ方法を複数紹介!』を見てね!

移動スクリプト(プログラム)の解説

移動スクリプト(プログラム)の解説

移動のプログラムで特に重要な記述を解説します。

// 移動速度の設定
public float speed = 5.0f;

キャラクターの移動速度を設定しています。

変数の型を『float』とすることで、小数の数字を扱えるようにしているのです。

たとえば『1.1f』や『0.1f』など、細かい移動速度を設定することができます。


//キャラクターのオブジェクトを入れる箱を作成
private Rigidbody2D playerRigidbody;

オブジェクトのデータを取得するための前準備、箱『playerRigidbody』を用意をしています。

『playrRigidbody』の名称は自由に決めることができますが、複雑なプログラムになったときにも理解しやすいものがおすすめです。


//キャラクターのオブジェクトを情報を取得
playerRigidbody = GetComponent<Rigidbody2D>();

先ほど作成した箱に、オブジェクト『Character』の『Rigidbody2D』データを取得しています。

このプログラムだけで、下図の箇所の情報すべてを『playerRigidbody』へ受け渡しています。

移動スクリプト(プログラム)の解説
項目名説明
Mass
(質量)
物体の質量。物理演算での重力や力の影響を受けやすさを設定できます
Drag
(抗力)
移動する物体に作用する空気抵抗の量。値が大きいほど、速度が抑えられます
Angular Drag
(回転抗力)
物体の回転に対する抗力。値が大きいほど回転が抑制されます
Gravity Scale
(重力の影響度)
物体に適用される重力の強さを調整するスケール。たとえば、0に設定すると重力の影響を受けなくなります
Is Kinematic
(運動学の設定)
設定を外すと物理演算の影響を受けなくなります
Constraints
(拘束条件)
Rigidbodyの動きに対する制約。位置や回転を特定の軸に沿って制限できます
Collision Detection
(衝突検出の設定)
衝突検出の方法の設定。高速で移動するオブジェクトの衝突を正確に検出するために、より詳細な検出方法を選択できます
Velocity
(速度)
物体の現在の移動速度の情報。値が大きいほど移動速度が早くなります
Angular Velocity
(角速度)
物体の回転速度の情報。こちらも値が大きいほど回転が早くなります
GetComponent<Rigidbody2D>()で取得できるデータの例

『GetComponent<Rigidbody2D>()』で情報を取得すれば移動速度だけではなく、様々なデータを書き換えることができるのです。


// Aキーが押されたら左に、Dキーが押されたら右に移動
float moveHorizontal = Input.GetAxis(“Horizontal”);

『Input.GetAxis(“Horizontal”)』では、キーボードやゲームパッドでの水平方向(X軸)の動きを検知しています。

たとえば、キーボードで”A”や”←”を押すと、『-1.0f』の値まで徐々に減算されていきます。

またキーボードで”D”や”→”を押すと、『1.0f』の値まで徐々に加算されていくのです。

とーるくん

『0.001、0.002、0.003、・・・1.0』と徐々に数値が変化するイメージです!

これによりキャラクターの移動スピードが一瞬でMAXにならずに、自然な動きを実現することができます。

しかし変化のスピードがあまりにも早いため、一瞬で1.0へ到達したように見えるのです。

その他『Input.GetAxis(“Horizontal”)』では、ゲームパッドからスティックの動きを読み取る事もできます。

なのでゲームパッドで遊べるゲームをつくるときもUnityであれば簡単に実装が可能です。


// キャラクターに移動する力を与える
playerRigidbody.velocity = new Vector2(moveHorizontal * speed, playerRigidbody.velocity.y);

ここではキー操作から取得した情報を元に、キャラクターに移動する力を与えています。

『Vector2』には下記内容のデータが含まれています。

Vector2( 水平方向(X軸)の移動速度情報 ,  垂直方向(Y軸)の移動速度情報 );

水平方向(X軸)の移動速度情報には、『キーボードが押されたときの出力(1.0f) ✕ 設定した移動スピード(5.0f)』が入ります。

垂直方向(Y軸)の移動速度情報には、『キャラクターの現在の移動速度(0.0)』が入ります。

また『new』は簡単に言えば、新しく実体を持つデータを作成するという意味です。

とーるくん

じっくりとプログラムの内容を勉強したい方には、Udemyの動画講座もおすすめですよ!

九十九すい

プログラムの基本を知っていなければ難しく感じるのも仕方がないね。UdemyでUnity「C#」の基礎を学習することをおすすめするよ!

\【視聴期限なし】 今だけ1,500円~すぐに学べる

30日以内なら返金無料!

様々な移動方法の紹介

様々な移動方法の紹介

下記動画は、上が『物理的な移動方法(Rigidbody)』下が『座標的な移動方法(Transform)』で移動させています。

物理的な移動方法では物理的な挙動を優先しているため、座標的な移動方法にはないズレが生じています。

アクションゲームなどの物理的な挙動を優先するゲームでは『Rigidbody』による移動がおすすめです。

シューティングなどの正確な挙動を優先するゲームでは『Transform』による移動を推奨します。

とーるくん

ここからは、『Rigidbody』と『Transform』のさらに細かな移動方法の違いを紹介してもらいますよ!

物理的な移動方法(Rigidbody)の例

  • Rigidbodyのvelocity: 物理エンジンによって速度を直接制御する
  • RigidbodyのAddForce: 物理エンジンを利用して力を加えて動かす
  • RigidbodyのMovePosition: 位置を滑らかに移動させるが、物理演算を考慮した移動

上の動画のように、動かし方1つで大きく挙動が違います。

あなたのつくりたいゲームのコンセプトに合わせて選んでください。

先程のプログラムの『void Update()』内の記述が異なるのみなので、その部分のみ下記に記します。

Rigidbodyのvelocity: 物理エンジンによって速度を直接制御するプログラム

void Update()
    {
        // Aキーが押されたら左に、Dキーが押されたら右に移動
        float moveHorizontal = Input.GetAxis("Horizontal");
       
        // キャラクターに移動する力を与える
        playerRigidbody.velocity = new Vector2(moveHorizontal * speed, playerRigidbody.velocity.y);

    }

RigidbodyのAddForce: 物理エンジンを利用して力を加えて動かすプログラム

void Update()
    {
        // Aキーが押されたら左に、Dキーが押されたら右に移動
        float moveHorizontal = Input.GetAxis("Horizontal");
       
        // キャラクターに移動する力を与える
        playerRigidbody.AddForce(new Vector2(moveHorizontal * speed, playerRigidbody.velocity.y));

    }

RigidbodyのMovePosition: 位置を滑らかに移動させるが、物理演算を考慮した移動をするプログラム

void Update()
    {
         // 水平方向の入力に基づいた移動量を計算
        float moveHorizontal = Input.GetAxis("Horizontal");
        Vector2 movement = new Vector2(moveHorizontal, 0);


        // 現在の位置に移動量を加算して新しい位置を計算
        Vector2 newPosition = playerRigidbody.position + movement * speed * Time.deltaTime;


        // 新しい位置にキャラクターを移動
        playerRigidbody.MovePosition(newPosition);

    }

座標的な移動方法(Transform)の例

  • Transformのposition: オブジェクトの座標を直接設定する
  • TransformのTranslate: オブジェクトの現在位置から相対的に移動させる

座標的な移動方法(Transform)では『position』も『Translate』も一見すると同じ挙動です。

しかし『position』は指定した座標へ瞬間移動しているため、実際には『Translate』とは移動方法に違いがあります。

上記動画では僅かな距離のため、違いが見えづらくなっています。

処理速度では瞬間移動する『position』の方が若干有利であるため、処理速度のみを考慮するのであれば、『position』が良いでしょう。

Transformのposition: オブジェクトの座標を直接設定するプログラム

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class PlayerMove1 : MonoBehaviour
{
    // 移動速度
    public float speed = 5.0f;
    //キャラクターのオブジェクトを入れる箱を定義  
    private Rigidbody2D playerRigidbody;


    void Start()
    {
        //キャラクターのオブジェクトを情報を取得
        playerRigidbody = GetComponent<Rigidbody2D>();
    }


    void Update()
    {
        // Aキーが押されたら左に、Dキーが押されたら右に移動
        float moveHorizontal = Input.GetAxis("Horizontal");
       
        // 現在の位置に移動量を加算して新しい位置を計算
        Vector3 newPosition = transform.position + new Vector3(moveHorizontal * speed * Time.deltaTime, 0, 0);


        // キャラクターの位置を更新
        transform.position = newPosition;

    }
}

TransformのTranslate: オブジェクトの現在位置から相対的に移動させるプログラム

下記の『void Update()』以外に変更はありません。

void Update()
    {
        // Aキーが押されたら左に、Dキーが押されたら右に移動
        float moveHorizontal = Input.GetAxis("Horizontal");
       
        // Translateを使ってキャラクターを移動する
        // ここでは、X軸の方向に速度に時間を掛けた値で移動させる
        transform.Translate(new Vector2(moveHorizontal * speed * Time.deltaTime, 0));
    }
九十九すい

つくりたいゲームに取り入れたい挙動になるかどうか、試しながら選んでみてね!

Unity 2D 移動のよくある質問

Q&A

キャラクターが予想した方向と異なる方向に移動してしまいます。どうすれば正しく方向制御できますか?

キャラクターの移動方向が間違っている可能性があります。

まずは入力を受け取るコードを確認してください。

たとえば『Input.GetAxis(“Horizontal”)』 または『 Input.GetAxis(“Vertical”)』 が正しく設定されているかを確かめてください。

またキャラクターのローカル軸が期待する方向に合っているかも確認しましょう。

移動中にキャラクターがひっかかることなくスムーズに動かないのはなぜですか?

キャラクターがスムーズに移動しない主な原因は、フレームレートの変動によるものかもしれません。

紹介したプログラムでは、移動計算を行うタイミングが Update() メソッド内で行われています。

なのでこれを解決するには、物理計算に基づく移動は FixedUpdate() メソッド内で行うことです。

 FixedUpdate() では物理演算が必ず一定の間隔(0.02秒)で更新されるので、移動がより滑らかになる可能性があります。

Update() では、端末により物理演算の間隔が左右されてしまいます。

ジャンプ機能を追加したいのですが、どのように実装すればいいですか?

【初心者向け】Unity 2Dゲームのジャンプ方法を複数紹介!【サンプルあり】』で詳しく解説していますのでご覧ください!

【結論】Unityなら様々な方法でキャラクターをすぐに動かすことができる!

Unityなら様々な方法でキャラクターをすぐに動かすことができる!
この記事のまとめ
  • プログラムする内容は少なく、キャラクターを移動させるのはとても簡単!
  • 紹介しているプログラムをコピペすればすぐに動かせる!
  • 物理的な移動は大胆な動きのゲームに、座標的な移動は精密な動きのゲームに活用できる!

Unityならプログラミング初心者でも比較的簡単に2Dゲームの実装方法が理解できます。

物理的な移動と座標的な移動に加え、いくつかの移動方法がありますが、試しながらあなたのゲームに合う方法を選択してみてください。

Unityでのゲーム開発では、キャラクターのスムーズな移動はゲームプレイの快適度やユーザーからの評価を大きく左右します。

つまり遊ぶ人の満足度や売上が大きく、変わるのです。

この記事を活用して、あなたのゲームを遊んでくれる方にとって魅力的なものにしてください。

Unityの学びを効率よく深めたい方は、さらなる学習リソースとしてUdemyの講座も探してみてください!

プログラミングの基礎から応用まで、さまざまなスキルが身につけられますよ。

\【視聴期限なし】 今だけ1,500円~すぐに学べる

30日以内なら返金無料!

TechMoire(テックモワ)では、web3(AI / メタバース)やITスクールの情報などを中心に情報を発信しております。

もしよければ、X(@TechMoire)のフォローなどもよろしくお願いします。

一緒に最新技術を楽しんでいきましょう!

九十九すい

それでは、ありがとうございました! 

管理者情報

ITコンサルタント

あらき きりん

現役ITコンサルタント 兼 Webディレクターとして従事。2015年に未経験からITスクールに入学。その後、EdTech企業にて、IT講師として大手企業や個人受講生に向けた授業(Webデザイン、プログラミング、マーケティング、ディレクションなど)を担当。スクールキャリアカウンセラーとして、述べ1,000人以上のキャリアサポートや授業を経験。現在は、IT系メディアの運営や企業ITサポート、Web制作をしながら、web3についての情報を発信しています。本メディアの記事はすべて、わたしが監修しています。

  • URLをコピーしました!
目次