2Dアクションゲームでプレイヤーを左右に動かす(velocity)【Unityゲーム制作】

今回はUnityのrigidbody-velocityを利用し、アクション系ゲームに必須ともいえる「キーボード入力」で、キャラクターを動かすのを簡単に実装していきます。まずは左右に動かすのを作成してみます。

はじめに

使用する「Unityのバージョンは2021.3.14f1」で、テンプレートで2Dを選択しています。

今回は特に画像は用意せず、初期状態で利用できる基本の図形を使い実装していきます。

オブジェクトの配置

まずはオブジェクト(地面と動かすプレイヤー)を作成していきます。

フィールド(地面)を作成

まずは地面(フィールド)を作成です。ヒエラルキーメニューで右クリック、「2DObject」→「Sprites」→「Square」を選択します。

名前をGroundに変更、TransformのPositionとScaleを変更して画面の下の方に配置。SpriteRendererのColorも分かりやすくと黒色に変更しておきます。

プレイヤーを作成

次はプレイヤーを作成します。同じように「2DObject」→「Sprites」→「Square」を選択します。ただの白い四角ですが、とりあえずこれを動かすプレイヤーとします。

上がシーンビュー。下がゲームビューです。

ColliderとRigidbodyを設定

次に配置した地面とプレイヤーに「Collider」と「Rigidbody」をアタッチします。

プレイヤーを設定

Playerインスペクターの「Add Component」から「Rigidbody 2D」と「Box Collider 2D」を追加します。

「Rigidbody」は物理エンジンと言われたりします、簡単に言うと質量や重力を与えたり「動かす」のに必要な設定ですね。「Collider」は衝突設定と言われるもので、これを設定しないと全てすり抜けてしまいます。

フィールドを設定

次にフィールドを設定していきます。

プレイヤーの設定をした後に実行すると重力で下に落ちていきますが、地面をすり抜けます。ということでGroundにも「BoxCollider 2D」をアタッチ。

これで一度再生してみて、フィールドに着地すればOK。

スクリプトの作成

次に「左右のキー入力した時にプレイヤーが動く」設定をしていきます。プロジェクトのAssetsフォルダ内で右クリック。「Create」→「C#Script」を選択し、名前をPlayerにします。

スクリプトをダブルクリックで開いて、下記の様に中身を変更します。

using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] private float _PlayerSpeed;
    
    private Rigidbody2D _rb;
    private float _inputX;

    void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        _inputX = Input.GetAxisRaw("Horizontal");
    }
    void FixedUpdate()
    {
        _rb.velocity = new Vector2(_inputX * _PlayerSpeed, _rb.velocity.y);
    }
}

Unityではキーボード入力やゲームパット入力をサポートしています。あくまでも一例ですが、こんな感じにスクリプトを作成。

左右キーを入力するとInputXに1か-1が入り、Rigidbody2Dのvelocityでプレイヤーを動かしてます。初期設定の状態だとキーボードの「A」、「D」、「←」、「→」に反応します。

実行

このスクリプトをPlayerにアタッチして、PlayerSpeedに適当な値を入力します。

とりあえずこれで下記の様にキー入力でPlayerが左右に動きます。とりあえず今回は超基本の基本、左右の動きだけ。

補足

スクリプトリファレンスには「非現実的な動作になる可能性があるため、velocityは直接変更しないでください。代わりに AddForce を使用してください」となっています。

AddForceを使用した場合、下記の様な感じのスクリプトになります。実際に動かすと徐々に加速する感じの現実的な動作になります。ゲームによっては「あえて非現実的な動作」というケースもありますね。

using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] private float _PlayerSpeed;
    [SerializeField] private Rigidbody2D _rb;

    private float InputX;
    void Update()
    {
        InputX = Input.GetAxisRaw("Horizontal");
    }
    private void FixedUpdate()
    {
        if (InputX != 0)
        {
            _rb.AddForce(new Vector2(InputX * _PlayerSpeed, 0));
        }
    }
}
タイトルとURLをコピーしました