うまげーむさん

ゲームの情報を主に投稿します。

【Unity】ソースコードコピペ可能!マリオ風2Dアクションゲームの作り方 #3 プレイヤー / 左右移動・ジャンプ

はじめに

どうも。Unity2Dチュートリアル第3回です。

今回からC#スクリプトを書いていくので、記事内にソースコードを載せていきます。

本当は簡単にコピペできるようにコピーボタンを追加したかったのですが、HTMLとかCSSがさっぱりわからない私には無理でした。

申し訳ないですが、コピペする際は手動ですべて選択してコピーする必要があります。ご了承ください。

前回:

www.umagame.info

プレイヤーの作成

プレイヤーオブジェクトの作成

まず最初に、プレイヤーのオブジェクトを作ります。

新規に作成しても良いですが、前回作ったテスト用のオブジェクトを使って作ります。

前回作った「Square」というオブジェクトを右クリックして、「名前を変更」から名前を「Player」に変更します。

新規作成する場合は、シーン内を右クリック→「2Dオブジェクト」→「スプライト」→「正方形」で新しくオブジェクトを作成し、「Rigidbody 2D」と「Box Collider 2D」を追加すればOKです。

テクスチャの設定

新しくプレイヤーのテクスチャを用意します。Assets/Texturesに「Player」という名前のフォルダを作って、

用意したpngファイルをドラッグアンドドロップで追加します。

今回使う画像はこちらです。

32x32ピクセルキタサンブラックウマ娘)のドット絵です。頑張って作りました。

前回同様に、「単位毎のピクセル数」と「フィルターモード」と「圧縮」の設定を変更して「適用する」をクリックします。

今回は32x32の画像を使っているので、単位毎のピクセル数は32にしてあります。それ以外の2つは前回と同じです。

画像をオブジェクトに適用しましょう。

Playerオブジェクトのインスペクターで、「Sprite Renderer」の「スプライト」の所に画像をドラッグアンドドロップします。

これでオブジェクトの見た目が変わりました。

スクリプトの作成(左右移動)

プレイヤーの移動用スクリプトを書いていきます。

Assetsにスクリプト用のフォルダを作ります。名前はScriptsにしておきます。

Scriptsフォルダの中で右クリック→作成→C# スクリプトをクリック。

新しくスクリプトファイルが作られますので、名前を入力します。今回はPlayerにします。

これをダブルクリックすると、ソースコードエディタ(Visual Studio)が開きます。

これがVisual Studioの画面です。基本的にはスクリプトの編集と上書き保存しかしません。

Unityではスクリプトファイル作成時に、Start()とUpdate()というメソッドが追加されます。

Start()はこのスクリプトを適用したオブジェクトがシーン内に現れたときに呼び出され、Update()は毎フレーム呼び出されます。

早速コードを書きます。

//Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), rb.velocity.y);
    }
}

Player.csにはこのあとまたコードを書き足すので、これが完成形ではありません。(今回以降の記事では、記事の最後の方にまとめてソースコードを置いておきます。)

rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), rb.velocity.y);

↑この一文で、プレイヤーの左右移動を制御しています。

このあと説明する入力マネージャーの水平軸入力の値を、Rigidbody2DのvelocityのX値に代入することで左右移動を実装しています。

自身のRigidbody2Dは、StartメソッドでGetComponentを呼び出すことで取得しています。

ちなみに軸を取得する方法としてGetAxisとGetAxisRawがありますが、今回は-1か0か1の三種類で値が返ってくるGetAxisRawを使いました。

(GetAxisは3Dゲームのように、コントローラーのスティックの傾け具合によって移動速度が変わるようなゲームで使います)

先述の入力マネージャーの設定画面を開きます。上部メニューから、「編集」→「プロジェクト設定」をクリックして、

「入力マネージャー」タブを確認します。ここで、キーボード&マウスおよびコントローラーの入力設定を行えます。

赤く囲ってある「水平」(Horizontal)が水平軸です。これはプロジェクト作成時に最初からUnity側で設定されています。

見て分かる通り十字キーの左 / 右キーとWASDのA / Dキーが割り当てられているので、キーボード操作の場合はこれらのキーで操作出来ます。

もちろん、割り当てるキーをこの画面から変更することも出来ます。

今後コントローラー操作にも対応させる予定なので、入力マネージャーを使った操作を実装しています。

スクリプトの適用

作ったスクリプトをオブジェクトに適応します。Player.csをドラッグして、Playerオブジェクトのインスペクターにドロップします。

これでテストプレイを開始し、AまたはDキーを押すと左右移動します。

オブジェクトの回転が有効になっているので、なにかに引っかかるとこのように向きが変わってしまいます。

これを修正するために、プレイヤーのRigidbody2Dの「Constraints」のZにチェックを入れます。これで回転しなくなります。

少し移動が遅いので、移動速度を自由に調整できるようにしましょう。

(下記のコードは一番上のusingを省略しています)

//Player.cs
public class Player : MonoBehaviour
{
    public float MoveSpeed = 5f;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);
    }
}

float型のMoveSpeedという変数を用意して、Horizontal軸の値に掛けています。

MoveSpeedをpublic変数にすることで、このようにインスペクターから直接変数の値を変更することが出来ます。

これはテストプレイ中も変更することができるので、移動速度を調整する際に便利です。

今回はMoveSpeedを3にしておきました。

ジャンプの実装

Player.csに書き足して、ジャンプも実装しましょう。

//Player.cs
public class Player : MonoBehaviour
{
    public float MoveSpeed = 3f;
    public float JumpForce = 15f;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
        }
    }
}

左右移動と同じように、RigidBody2D.velocityのY値を変えることでジャンプを実装しています。

float型のJumpForceという変数を作って、これをジャンプ力としています。

ジャンプボタンが押されたかどうかの判定はInput.GetButtonDownで行います。

この"Jump"は入力マネージャーの「Jump」軸のことで、これも最初から作成されています。デフォルトでSpaceキーが設定されています。

ちなみに、直接キーボード入力を取得する場合は、

Input.GetButtonDown("Jump")

Input.GetKeyDown(KeyCode.Space)

のように書き換えます。

値の調整

最終的にMoveSpeedを3に、JumpForceを15にして、

Rigidbody2Dの「重力スケール」を4にしました。これで2Dマリオと似た操作感になりました。

そして、Rigidbody2Dの「衝突判定」を「連続的」に変更しておきます。これが「非連続的」のままだと、地面に着地した際に少しキャラクターがめり込みます。

キャラクターの当たり判定も変更します。「Box Collider 2D」の「コライダーの編集」をクリックして、

キャラクターの大きさに合うように緑の枠の大きさを変更します。実際の大きさより少し小さめにするといい感じです。

今回の進捗 / ソースコード

(動画に音声はありません)

今回はキャラクターの追加と左右移動 / ジャンプ機能を実装しました。

ジャンプはキーを押したときにいつでもできるようにしてあるので、今の状態だと空中でもジャンプできてしまいます。これは次回に修正します。

また左右移動の移動速度が遅いですが、これも次回ダッシュ機能を実装する予定なので遅めに設定してあります。

今回作成したPlayer.csのソースコードはこちらです。

using UnityEngine;
public class Player : MonoBehaviour
{
    public float MoveSpeed = 3f;
    public float JumpForce = 15f;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        //Player Movement
        rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * MoveSpeed, rb.velocity.y);

        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
        }
    }
}

さいごに

今回は以上となります。

次回は、

  • 空中でジャンプができないように修正(これは第5回にやります)

  • プレイヤーの向きが変わるように設定

  • ダッシュの実装

です。

次回:

www.umagame.info