【初心者向け】#4 〔開発編〕プレイヤーを動かす|スマホ用 2D防衛アクションゲームを作ろう!

スマホ用 2D防衛アクションゲームを作ろう!

本記事で紹介している情報は執筆時点のものであり、閲覧時点では変更になっている場合があります。また、ご利用の環境によっては本記事の情報通りに動作しない場合がございます。あらかじめご了承ください。

筆者の声 –本文はもう少し下にあります-

 こんにちは、シィグです。前回は、スマホでプロジェクトを動かす設定を行いました。

 今回からいよいよ​〔開発編〕​ということで、本格的にゲーム開発を進めていきます。今回は、プレイヤーを作成し、動かす部分を実装していきます。

 難しいと感じる部分があるかもしれませんが、最初から全て理解しようとする必要はありません。記事の内容の丸コピから始めて、楽しながら進めていければと思います。

今回の目標

 この記事では最終的に次のようなものを作成することを目標に進めていきます。
※gif画像の影響でオブジェクトが移動した際に白い跡が残っていますが、Unity上ではきれいに動きます。

作成するもの

プレイヤーなるオブジェクトを設置する

 まずは、プレイヤーとなるオブジェクトを設置していきます。

 前回の「ゲーム画面にオブジェクトを置く」で書いたことの繰り返しになりますので、簡単に書いています。詳しく知りたい方はリンク先を参照してください。

 Untiyを開き、右上の「」をクリックしてください。
 「2Dオブジェクト」→「スプライト」→「サークル」をクリックし、オブジェクトを作成してください。

プレイヤーオブジェクトの設置

前回作成したオブジェクトが残っていると思いますが、そのまま残しておいて大丈夫です。

プログラムの作成準備

 プレイヤーとなるオブジェクトが設置できたら、次にプレイヤーを動かすためのプログラムを書く準備を進めていきます。

 正確に言うと、プレイヤーを動かすといったゲームの一部は「プログラム」ではなく「スクリプト」と呼び、「プログラム」はゲーム全体を管理するものを指します。使い分けによる表現のわかりにくさの回避のため、この記事ではどちらも「プログラム」と表現しています。


 このサイトでは、プログラムを書く際に「Visual Studio」と呼ばれるソフトを使用します。同じ環境で進めていきたい方は以下の記事を参考に、「Visual Studio」のインストールと設定を行ってください。


プログラムを入れるフォルダを作る

 まずは、整理しやすくするためのフォルダを作ります。

 下側の開いている部分を右クリックしてください。

 次に「作成」→「フォルダ」の順番でクリックしてください。

プログラムを入れるフォルダの作成

 フォルダが作成されますので、フォルダの名前を「Scripts」にしてください。

プログラムを入れるフォルダの命名

プログラムを書くためのファイルを作る

 次にプログラムを書くためのファイルを作っていきます。先程作成した「Scripts」フォルダをダブルクリックし、フォルダを移動します。

プログラムを書くためのファイルとは?
 「C# スクリプト」と呼ばれるもので、Unityで使用するプログラミング言語「C#」を書くためのテキストファイルです。拡張子「.cs」でプロジェクト内に保存されます。

 開いている部分を右クリックし、「作成」→「C#スクリプト」の順番でクリックしてください。

プログラムファイルの作成

 作成されたファイルの名前を「PlayerController」に変更してください。

プログラムファイルの命名

オブジェクトを移動させるプログラムを書く

 いよいよプログラムを書いていきます。先程作成したC# スクリプト「PlayerController」をダブルクリックしてください。

 しばらくすると「Visual Studio」が起動します。

Visual Studioの画面

 まずは以下のプログラムを、「Visual Studio」に記入してください。内容については後述します。

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

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f; // 移動速度

    private void Start()
    {
        
    }

    private void Update()
    {
        // キーボードの入力を取得
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // 移動ベクトルを計算
        Vector2 moveDirection = new Vector2(horizontalInput, verticalInput).normalized;

        // オブジェクトを移動させる
        Vector2 newPosition = (Vector2)transform.position + moveDirection * speed * Time.deltaTime;
        transform.position = newPosition;
    }
}

 記入すると画像のようになります。

Visual Studio入力後画面
「PlayerController」のプログラム

 記入し終わりましたら「Ctrl」と「S」キーを同時押しし、保存してください。

プログラムの保存
 「Visual Studio」ではプログラムを書いただけではUnity側に反映されません。反映させるために、プログラムを書いたら「Ctrl」+「S」で保存する癖をつけましょう。

テストプレイでオブジェクトを動かしてみる

 プログラムを記入し終わりましたら、オブジェクトが移動するかの確認といてテストプレイを行います。

オブジェクトにプログラムをアタッチする

 Unityの画面に移動し、動かしたいオブジェクト(Circle)をクリックしてください。

オブジェクトとプログラムの関連付け1

 次に、先程作成したPlayerController」をインスペクタービューまでドラッグ&ドロップしてください。

オブジェクトとプログラムの関連付け2

インスペクタビューとは?
 オブジェクトの名前やタグ、レイヤー、コンポーネントなどといった情報が見れる部分です。

コンポーネントとは?
 オブジェクトの持つ要素です。オブジェクトの見た目や色、当たり判定、プログラム等が該当します。

画像のように「Circle」のインスペクターにプログラムが追加されます。

インスペクターの画面

以上でオブジェクトを動かす準備が整いました。

オブジェクトを動かす

 上側にある「▶(再生ボタン)」をクリックしてください

再生ボタン

ゲームビュー」に画面が切り替わりますので、「W,A,S,D」キーを押してみてください。

 オブジェクトは動きましたか?

ゲームビュー

オブジェクトが移動しない場合
上記の手順通りに進めてもオブジェクトが移動しない場合、以下のことを試してみてください。
・ゲームビューをクリックする。
・プログラムが保存されているか確認する。
・プログラムが動かしたいオブジェクトにアタッチされているか確認する。
上記を試しても解決しない場合は、お手数ですがコメントにて連絡してください。

プログラムの解説

 ここからは、先程書いたプログラムの解説を行っていきます。

この記事では、プログラムを完璧に理解するのではなく、どのように動いているかの雰囲気を掴むことを目的に書いているため、厳密に言うと異なる部分がある点に注意してください。

プログラムの構造

 プログラムの構造について解説します。プログラムの構造は一見難しそうに感じますが、最初のうちは画像の緑色で囲んだ部分にプログラムを書くということを覚えるだけで大丈夫です。


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

usingディレクティブ」:赤で囲んだ「using ~~~」という部分は、このプログラム以外で実装された機能を使用するために記述します。もう少し噛み砕いて説明すると、Unity側が提供している便利な機能を使用するためのものです。

「Visual Studio」を使用することで、必要な機能を自動で記入してくれます。そのため最初の頃は、プログラムを作った際のまま、変更しなくて大丈夫です。


public class PlayerController : MonoBehaviour

クラス宣言」:青で囲んだ「public class PlayerController : MonoBehaviour」という部分は、簡単に言うとプログラムの枠組みを宣言している部分です。

  1. public」:他のプログラムからこのプログラムにアクセスできるようにするために記述されます。最初は変更しなくて大丈夫です。
  2. class PlayerController」:「PlayerController」という名前のプログラムを作りました、と宣言している部分です。最初は変更しなくて大丈夫です。
  3. MonoBehaviour」:Unityエンジンと連携してゲームプレイを制御するために記述されます。最初は変更しなくて大丈夫です。

クラス本体(クラス定義)」:緑色で囲んだ部分にプログラムを記述していきます。基本的にこの部分だけ変更していくと覚えてもらえればと思います。

クラス定義-プログラムの構造

プログラムの内容

 次に「クラス本体」に記述した内容について解説していきます。各項目に詳細な説明を加えていますが、最初のうちは完全な理解は難しいです。ゲーム開発を進めていくことで理解が深まっていきますので、難しく考えずに進めてもらえればと思います。


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

 この部分は、オブジェクトの移動速度を決定するための変数を表しています。詳細な内容は以下のとおりです。

変数とは?
 なにかモノを入れて保存する箱のようなものを想像してください。箱の中に入れたものを他のところで使ったりします。箱の中に入れるものは数字だったり、オブジェクトだったりと様々です。

この部分の詳細な説明

 グローバル変数と呼ばれ、同じクラス内(中括弧で囲まれた部分)のどこからでもアクセスできるものです。

  1. public」:この部分に書くものは「アクセス修飾子」と呼ばれ、どこからアクセスできるかを表す部分です。「public」は同じクラス内だけでなく、どこからでもアクセス可能であることを表します。
  2. float」:この部分に書くものは「データ型」と呼ばれています。変数の中に何を入れるか(整数や少数、オブジェクト等々)を宣言するためのもので、「float」は浮動小数点数(≒少数)を表すものです。
  3. speed」:この部分に書くものは「変数名」と呼ばれています。変数の名前を決める部分です。自由に決められます。(※使用できない言葉や文字がある点に注意してください)
  4. = 5.0f」:この部分は「変数の初期値の代入」と呼ばれています。変数の中に最初何を入れておくかを決定する部分です。今回は、「5.0f」の浮動小数を最初に保存しています。
  5. ;」:セミコロン(;)は、文の終了を表しています。

    private void Start()
    {

    }

 この部分は「スタート関数」と呼ばれ、中括弧の中のプログラムをゲーム開始時に一度だけ実行する予約関数です。プレイヤーを動かすために最初にすることは特にないため中括弧の中は何も記入していません。詳細な内容は以下のとおりです。

関数とは?
 再利用可能なプログラムの固まりです。関数を使うことで、同じコードを繰り返し書かずに済みます。入力に対して入力を処理し、結果を返すことができます。
 通常、関数は自分たちで用意する必要がありますが、「予約関数」と呼ばれるUnity側が用意してくれている特別な動きをする関数が存在します。

この部分の詳細な説明
  1. private」:この部分に書くものは「アクセス修飾子」と呼ばれ、どこからアクセスできるかを表す部分です。「private」は同じクラス内だけでアクセス可能であることを表しています。「約関数」は通常「private」です。
  2. void」:この部分に書くものは「戻り値の型」と呼ばれています。関数が返す結果の形(整数や少数、オブジェクト等々)を表しています。「void」は、返り値が無い、つまり、結果を返さず関数内だけで処理が完了する場合に用います。「予約関数」は通常「void」です。
  3. Start()」:この部分に書くものは「関数名」です。「予約関数」の場合は特定の言葉が決められており、そうでない場合は自由に名前を決めれます。(※使用できない言葉や文字がある点に注意してください。)

    private void Update()
    {
        // キーボードの入力を取得
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // 移動ベクトルを計算
        Vector2 moveDirection = new Vector2(horizontalInput, verticalInput).normalized;

        // オブジェクトを移動させる
        Vector2 newPosition = (Vector2)transform.position + moveDirection * speed * Time.deltaTime;
        transform.position = newPosition;
    }

 この部分がオブジェクトを動かすプログラムの根幹です。

  • 「private void Update()」:オブジェクトが存在している間、繰り返して実行する予約関数です。繰り返す頻度は、機器の処理速度によって変化します。
  • 「float horizontalInput = Input.GetAxis(“Horizontal”);」:上下のキーがどの程度押されているかを取得する部分です。
  • 「float verticalInput = Input.GetAxis(“Vertical”);」:左右のキーがどの程度押されているかを取得する部分です。
  • 「Vector2 moveDirection = new Vector2(horizontalInput, verticalInput).normalized;」:オブジェクトをどの方向に動かすかを計算している部分です。詳しく説明すると
  • 「Vector2 newPosition = (Vector2)transform.position + moveDirection * speed * Time.deltaTime;」:オブジェクトの新しい位置を計算する部分です。詳しく説明すると
  • 「transform.position = newPosition;」:先程で計算した位置にオブジェクトの座標を変化させる部分です。
この部分の詳細な説明
  1. 「float horizontalInput = Input.GetAxis(“Horizontal”);」:
    ・Unityにおいてキーボードやジョイスティックなどの入力デバイスから「Horizontal」という名前の入力軸の値を取得し、それを浮動小数点数に変換して変数「horizontalInput」に代入します。
    ・パソコンの場合は「W,S,↑,↓」が該当し、「W,↑」を押しているときに「1」に近づき、「S,↓」を押しているときに「-1」に近づき、何も押していないときは「0」を変数「horizontalInput」に代入します。
  2. 「float verticalInput = Input.GetAxis(“Vertical”);」:
    ・「Horizontal」と同様でパソコンの場合は、「A,D,←,→」が該当し、「A,←」を押しているときに「-1」に近づき、「D,→」を押しているときに「1」に近づきます。
  3. 「Vector2 moveDirection = new Vector2(horizontalInput, verticalInput).normalized;」:
    ・変数「horicontalInput」と変数「verticalInput」値を正規化(=大きさを1に)した2次元ベクトル変数(Vector2)として変数「moveDirection」に代入します。
    ・「.normalized」の部分で2次元ベクトルを正規化(=大きさを1に)しています。
  4. 「Vector2 newPosition = (Vector2)transform.position + moveDirection * speed * Time.deltaTime;」:
    ・「(Vector2)transform.position」は現在のx,y座標を表します。
    ・先程計算した「moveDirection」の方向に変数「speed」分だけベクトルを伸ばし、その位置を新しい位置として代入しています。
    ・「Time.deltaTime」は、前のフレームから現在のフレームまでの時間経過を秒単位で表現し、機械によって動く速度が変わらないように調整する役目を担っています。

 プログラムの解説は以上です。これでパソコン上でプレイヤーを動かす部分の実装は完了です。

 次回は、スマホでもプレイヤーが動くように変えていきます。

終わりに -読まなくてもOKです-

 最後まで読んでくださりありがとうございます。今回は、プレイヤーを作成し、動かす部分を実装しました。初めてプログラムを書きましたが、どうだったでしょうか。プログラムは難しいですが、何度も作っていくうちになんとなくわかってくるものですので、一回で覚えようとするのではなく少しずつ身に付けていければと思います。

 記事の内容などについて、質問や感想等がありましたら気軽にコメントしてくれればと思います。



コメント

タイトルとURLをコピーしました