【Unity超初心者向け】2Dシューティングゲームの作り方【全手順画像付きで解説】

Unity
スポンサーリンク
  • ゲームを作りたい・・・
  • なにから始めたらいいか分からない
  • プログラミング未経験でもゲームを作れるようになりたい

ゲームを作りたいと思った初心者が、何をどう始めたらいいのか分からず挫折してしまうケースは多いです

私はゲームエンジニアとして複数タイトルの開発を経験してきました。その経験上、最も効率が良い学習方法は「ゲームを作ること」だと考えています

そこで本記事では、初心者でも真似するだけで簡単にゲームが作れるように、サンプルとなる2Dシューティングゲームの作り方を紹介します

ゲームを作ることでUnityやプログラミングの基礎を学びましょう!

シューティングゲームの完成イメージ

こんな感じの2Dシューティングゲームを作っていこうかと思います

しょぼいと思った方、ちょっとお待ちください

ゲームは結構見た目を作るのも難しく、難易度が高いものです

そのため、この記事では初心者向けにあえて簡素なゲームとしています

余計な工程を作らないことで、初心者が迷うことなく製作できるように工夫しています

まずは、簡素なゲームを作り基礎を身につけて、簡素なゲームをカスタマイズしてオリジナリティを出していきましょう

画像を入れ替えたりすれば、無料でも結構いい感じのゲームにできますよ!

(※この記事では画像の入れ替えなどは解説していませんのでご注意ください。後ほど別記事で追加したいと思っています)


では、さっそく作り方を解説しています!

事前準備

ゼロからでも作成できるように事前準備から解説していきます

なお、前提としてWindowsのパソコンを使用しているものとして解説します

Unityをインストールする

まずは、こちらの記事を参考にUnityをインストールしましょう

【2020】Unity インストール手順 【ダウンロード】

※既にインストールしてある人は不要です

Unityの日本語化についても解説していますが、翻訳に違和感があったりする部分も多いので英語のままでOKです(この記事の解説でも英語のUnityの画像を使用しています)

画像を用意する

まずはゲームに使う画像を用意します

今回は私が用意したものを保存して使用してください

クオリティが低いとかそういうのは受け付けてないです

前述しましたがゲーム画像は差し替えられるので、まずはゲームを作ることを優先していきましょう!

プレイヤー

上の画像の上で右クリックして「名前をつけて画像を保存」しましょう

保存するときのファイル名はテキトーで大丈夫です

画像は次の3つです

  • プレイヤー(自)
  • 弾(赤い棒)

今回作成するのはシューティングゲームなので必要最小限といったところですね

今回は簡略化の都合上なしにしていますが

  • 背景
  • 敵を倒したときの爆発

とかが追加であると映えるかもしれません

シューティングゲームの作り方

さっそくゲームを作成していきましょう!

プロジェクトを作成する

「プロジェクト」を作成します

「プロジェクト」は概ね作業フォルダという認識大丈夫です

だいたい「プロジェクト」「ゲーム」は1対1になります

Unity Hubを起動します

Unity Hubを起動し、右上の新規作成を押しましょう

次に表示される画面では、テンプレートの「2D」を選択してください

また、設定の項目「プロジェクト名」もテキトーにつけましょう。なんでもいいです

私は「SampleShooting」にしました

プロジェクト名の下にある保存先はそのままで大丈夫です(変えてもいいですが)

全て入力が完了したら、右下の作成ボタンを押しましょう

これでプロジェクトの作成は完了です

上手く出来ていれば、Unityが立ち上がります

画面サイズを決定する

次にゲームの画面サイズを設定します

今回は16:9に固定します

まず、中央上のほうにある「Game」タブを選択します

そのあとタブのすぐ下にある「FreeAspect ▼」のあたりを押して「16:9」を選択してください

これでゲーム画面が「16:9」の比率に固定されます

※以降の説明は画面比率16:9を前提として進めるためご注意ください

最近はiPhone、Androidなどいろんな画面の端末が増えているので、画面サイズを決めるのは結構難しいです

様々な画面サイズに対応すると難易度があがってしまうので今回は16:9に固定です

プレイヤーを動かす

次はプレイヤーをキーボードで動かせるようにしていきます

プレイヤーの画像を配置する

プレイヤーの画像をゲームに組み込みます

Unityの真ん中上くらいのタブの「Scene」を選択します


「プレイヤー」画像ファイルをUnity上のシーンエリア(青い枠のあたり)にドラッグします


出来ていれば、青い印をつけたところに「プレイヤー」が作成されます

ちなみに、画像は「自プレイヤー」になっていますが気にしないでください

ファイル名が付くだけなので、例と名前が違っていても気にしなくてよいです

画像左の青丸は「Hierarchy(ヒエラルキー)」メニューといいます

ゲーム中に存在するモノの一覧で、ここにあるものをオブジェクトや、ゲームオブジェクトと呼びます

今回の場合だと「プレイヤー」「弾」「敵」などになります

ゲーム中に見えるもの見えないもの、機能、概念など、ありとあらゆるものが「オブジェクト」になりえるため、あまり深く考える必要はありません

ただ一般的には、今回のようにゲーム中に見えるモノをオブジェクトにすることが多いです


次にプレイヤーの初期位置を若干調整します

青い枠のあたりが「ゲーム画面の範囲」になるので、そこからはみ出ないように、左に「プレイヤー」をドラッグして動かしましょう

私はこんな感じの位置に動かしました。これがプレイヤーの初期位置となります

「ゲーム画面の範囲」の中ならどこでも良いですし、あとから変えることも出来るのであまり気にしなくて大丈夫です

プレイヤーを動かすプログラムを作成する

いよいよプログラムを作成しています

ヒエラルキーメニューでプレイヤーを選択します

プレイヤーを選択した状態で右側の青枠に注目してください

Add Component」を押して検索窓のようなところに「Player」と入力してください

その状態で「New script」を選択します

Create and Add」ボタンが表示されるので押してください

下のほうに「Player」というファイルが出来るのでこれをダブルクリックします

Player.cs」というこのファイルがプログラムを記述するファイルになります

しばらくすると、プログラムを作成するためのエディターがUnityとは別なウィンドウで起動します

Macなどデフォルトで起動するエディタが異なる場合がありますが、基本的な使い方はほぼ変わらないので、自身のパソコンで起動したエディタを使用してもらってかまいません

エディターは一見すると機能がいっぱいあってごちゃごちゃした感じですが、基本的な使い方は「メモ帳」と一緒です

今回やることは「Player.cs」のファイルに文字を書き込んで保存するだけです

私の場合はデフォルトのエディター「Visual Studio」が起動していますが、自分の好みのエディターを使うことも出来るので興味がある方は調べてみてください


ここから、プログラムを記述していきます

プログラムの基礎を一から説明してしまうと膨大な量になってしまうので、まずはコピー&ペーストするだけで動作するように解説していきます

エディターの中央部分に次のような記述が最初からあります

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

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {

    }
}

ここに記述を追加します

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

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey("down"))
        {
            transform.Translate(0, -0.01f, 0);
        }
        if (Input.GetKey("up"))
        {
            transform.Translate(0, 0.01f, 0);
        }
    }
}

Update(){ }と書かれた箇所の内側に記述を追記したしただけになります

コピーして自分のエディタに貼り付けてください

貼り付けるとこんな感じになるはずです

この状態でエディター左上の「ファイル」→「Assets\Player.cs」を押して変更を保存します

Windowsの場合は「Ctrl」+「S」でも保存できます


保存ができたらUnityの画面に移ります

中央の上のほうにある再生ボタン(みたいなやつ)を押しましょう

このように真ん中の画面のタブが「Game」に切り替わります

ここでキーボードの「」や「」を押してみましょう

動きました!

もし動かない場合は次の点確認してみてください

  • プログラムの貼り付けに失敗していないか
  • Player.csのファイルが保存されているか
  • Unityの「Game」タブが選択されているか

もし、それでも動かない場合はこちらの記事を参考にしてみてください。初心者にありがちなミスとその対策についてまとめた記事になります

Unity初心者がついやりがちなプログラミングミス5選


動作が確認できたら、再度再生ボタン(のようなやつ)を押せばゲームが停止します

弾を撃つ

続いてプレイヤーが弾を撃てるようにしていきます

弾の画像を配置する

プレイヤーと同じ手順で弾の画像を配置します

」の画像ファイルをUnityの「Scene」にドラッグします

左のヒエラルキー(Hierachy)、下のアセット(Assets)に弾追加されていることが確認できます

ちなみに、Sceneメニューの弾はゲーム画面内に表示される位置に動かしておいてください

後ほど非表示にするのですが、その前に動作確認に使用します

弾が前方に進むようにする

次に弾が自動的に前方に飛ぶようにしていきます

プレイヤーと同じ感じで弾のプログラムを作成していきます

左側の「」を選択した状態で、右側の「Add Component」を押してください

Bullet」と入力して「New script」を選択します

続けて「Create and Add」を選択します

下のAssetsというエリアに「Bullet」というファイルが追加されているので、これをダブルクリックします

プレイヤーのときと同じようにエディタにて「Bullet.cs」が開きますのでこれを編集していきます

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

public class Bullet : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Bullet.cs」の内容は最初このようになっています

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

public class Bullet : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(0.03f, 0, 0);

        if (transform.position.x > 10.0f)
        {
            Destroy(gameObject);
        }
    }
}

このようにUpdate() { } の中身を追記してください(コピーして貼り付けでOKです)

追記したら「Bullet.cs」の変更を保存します

Unityに戻り再生ボタンを押すと、弾が自動的に前進するようになります

例ではプレイヤーが弾を発射しているように見えますが「プレイヤーの操作によって弾が発射される」機能はまだ作っていないので、この時点では弾が勝手に前進するだけでOKです

弾をプレハブにする

次に弾をプレハブ化します

プレハブ化とは「弾」を複製可能な状態にすることを指します

今回のゲームでは「プレイヤー」「敵」は1個づつですが、「弾」は連射できるので何個も必要になります

最終的に「弾」が何個必要になるかはプレイヤーの操作次第なので、複製可能な状態にしておいてプログラムで自動的に複製します

左のヒエラルキー(Hierarchy)メニューの「」をドラッグして、下のアセット(Assets)のエリアにドラッグしてください

上手くできていれば「」というファイルがもう1つ増えるはずです

これが「」のプレハブになります

画面上に弾を残しておくと、ゲームの開始時に弾が既に発射されている状態から始まってしまうので、画面上に配置してしまった弾を見えなくします

画面左ヒエラルキー(Hierarchy)メニュー内の「」を選択します

その状態で、右側インスペクター(Inspector)メニューのにある箱?のようなアイコンの傍にあるチェックボックスを外します(上の画像の右上の赤丸を参照)

チェックボックスを外すと、真ん中の画面から弾が消えます

弾を発射するプログラムを作成する

プレイヤーが弾を射出できるようにプログラムを作成します

Player.csのファイルをダブルクリックします

エディターが起動してPlayer.csを編集できるようになります

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

public class Player : MonoBehaviour
{
	// Start is called before the first frame update
	void Start()
	{

	}

	// Update is called once per frame
	void Update()
	{
		if (Input.GetKey("down"))
		{
			transform.Translate(0, -0.01f, 0);
		}
		if (Input.GetKey("up"))
		{
			transform.Translate(0, 0.01f, 0);
		}
	}
}

現状Player.csはこんな感じかと思います

ここに追記していきます

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

public class Player : MonoBehaviour
{
	public GameObject bullet;

	// Start is called before the first frame update
	void Start()
	{

	}

	// Update is called once per frame
	void Update()
	{
		if (Input.GetKey("down"))
		{
			transform.Translate(0, -0.01f, 0);
		}
		if (Input.GetKey("up"))
		{
			transform.Translate(0, 0.01f, 0);
		}
		if (Input.GetKeyDown("space"))
		{
			Instantiate(bullet, transform.position, Quaternion.identity);
		}
	}
}

今回は、Start()の上とUpdate() { }の中に追記しています

public GameObject bullet;
if (Input.GetKeyDown("space"))

このあたりですね

追記できたら保存してUnityに移動します

今回はプログラムを書いただけでは動かないので、Unity上でさらに作業をします

左のメニューからプレイヤーを選択します

続いて下にある「弾のプレハブ」を「None(Game Object)」と書いてあるあたりにドラッグします

None(Game Object)」と書いてあるところが「」になっていれば成功です

Unityにてゲームを開始して「スペースキー」を押すと、プレイヤーが弾を撃つようになります

敵を作る

敵を出現させて倒せるようにしていきます

敵の画像を配置する

プレイヤーや弾と同様に敵をゲームに配置します

」の画像ファイルをUnityの「Scene」にドラッグします

左のヒエラルキー(Hierachy)、下のアセット(Assets)などに「」追加されていることが確認できたらOKです

敵が動くようにする

続いて敵がプレイヤーに向かって進むようにしていきます

敵が動くことでプレイヤーの弾が当たりづらくなり、ゲーム性となります

敵の動かし方は弾と同じで、進行方向が逆になるイメージです

左のメニューから敵を選択して、右のメニューの「Add Component」を選択します

プレイヤーや弾を作ったときと同じですね

検索窓ようなところに「Enemy」と入れて、その下の「New script」を押します

さらに「Create and Add」を押します

プレイヤーと弾と同じで「Enemy.cs」が出来ていればOKです

さらに「Enemy.cs」をダブルクリックしてエディターを起動します

Enemy.cs」が開ければOKです

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

public class Enemy : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

最初の状態ではこのような文字が書かれているかと思います

ここに追記していきます

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

public class Enemy : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(-0.03f, 0, 0);

        if (transform.position.x < -10.0f)
        {
            Destroy(gameObject);
        }
    }
}

このようにUpdate() { }中に追記してファイルを保存します

Unity中央の上のほうにある再生ボタン(みたいなやつ)を押すと、敵がプレイヤーの方向に向かって移動します

敵をプレハブにする

続いて敵がたくさん出てくるようにします

弾と同じように「敵」を「プレハブ」にしていきます

左の「」をドラッグして、下のアセット(Assets)エリアにドラッグします

アセット(Assets)エリアにプレハブの「」が増えていればOKです

続いてゲームに中に配置した「」オブジェクトを消します

左側の「」を選択した状態で、右側インスペクター(Inspector)メニューのにある箱?のようなアイコンの傍にあるチェックボックスを外します(上の画像の右上の赤丸を参照)

画面中央の「」オブジェクトが非表示になっていればOKです

敵がいっぱい出現するようにする

次に敵がランダムにたくさん出現するようにしていきます

ここで「プレイヤー」「敵」「弾」とも違うゲームオブジェクトを作成していきます

左のヒエラルキー(Hierarchy)メニュー内に右クリックして「Create Empty」を選択してください

左のヒエラルキー(Hierarchy)メニュー内に「Game Object」が作成されたのが確認できればOKです

このとき作成された「Game Object」はゲーム画面に表示されないオブジェクトですが機能を持たせることが出来ます

この「Game Object」に対して「プレイヤー」「弾」「敵」などと一緒のやり方でプログラムを作成していきます

次に左の「Game Object」を選択した状態で、右の「Add Component」を押してください

検索窓のようなところに「Game Manager」と入力して「New Script」を押します

続いて「Create and Add」を押します

画像のように下のアセット(Assets)に歯車マークの「Game Manager」が出来ていればOKです

続いて敵がたくさん出現するようにプログラムを作成していきます

先ほど作成した「Game Manager」をダブルクリックします

再びエディタが起動して「GameManager.cs」が開かれます

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

public class GameManager : MonoBehaviour
{
	// Start is called before the first frame update
	void Start()
	{

	}

	// Update is called once per frame
	void Update()
	{

	}
}

GameManager.cs」は最初こんな感じになっているかと思います

ここに追記していきます

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

public class GameManager : MonoBehaviour
{
	public GameObject enemyPrefab;
	private float interval = 2.0f;
	private float timeElapsed = 0.0f;

	// Start is called before the first frame update
	void Start()
	{

	}

	// Update is called once per frame
	void Update()
	{
		timeElapsed += Time.deltaTime;
		if (timeElapsed >= interval)
		{
			timeElapsed = 0.0f;
			Vector3 randamPos = new Vector3(11, Random.Range(3.7f, -3.7f), 0);
			Instantiate(enemyPrefab, randamPos, Quaternion.identity);
		}
	}
}

今回はUpdateの括弧の中を追記したのとStartの上にも何文が追加しています

追記したら「GameManager.cs」を保存してUnityに戻りましょう

これだけではまだ動かないので、さらにUnity上で作業を行います

左の「Game Object」を選択した状態にします

下のアセット(Assets)の中にある「敵」のプレハブを右側のNone (Game Object)と書かれた部分にドラッグします

None (Game Object)と書かれていた場所に「敵」がセットされていればOKです

Unityにてゲームを開始すると「」が次々と出てくるようになります

ちなみに、この時点では弾を発射しても敵には命中しませんので、この後作成していきます

だいぶゲームっぽくなってきたので、あともう少しです!

弾と敵が当たるようにする

最後に「」に「」当たったとき、「」が消えるようにしていきます

ここの工程は「衝突判定」を制御していくため、少し複雑になります

最初に「衝突判定」に必要な設定を追加した後、プログラムを作成します

まず「敵」のオブジェクトに変更を加えていきます

メニュー下の「」プレハブを選択した状態で、右の「Add Component」を選択してください

」オブジェクトに対して、衝突判定用の設定をしていきます

Add Component」を押した後に出てくるメニューで「Physics 2D」を選択してください

その後「Circle Collider 2D」を選択してください

右側のメニューに「Circle Collider 2D」が追加されていればOKです

続いて「」と衝突する「」の設定をします

下のメニューの「」のプレハブを選択し、「Add Component」を選択します

Physics 2D」→「Box Collider 2D」を選択します

(※「」のときは「Circle Collider 2D」を選択したので若干異なります)

画像青枠のように「Box Collider 2D」が追加されればOKです

今回はさらに「Add Component」を押してもう1つ設定を追加します

Physics 2D」→「Rigidbody 2D」を選択します

画像のように「Box Collider 2D」、「Rigidbody 2D」が追加されていればOKです

(右側のInspectorメニューが縦に長くなっている可能性があるので、パソコンによってはスクロールが必要です)

さらに設定を追加します

Box Collider 2D」内にある「Is Trigger」のチェックをONにします

また、「Rigidbody 2D」内の「Body type」を「Kinematic」にします

以上にて下準備は完了です

ここからはプログラムを作成します

下の「Bullet.cs」をダブルクリックしてください

エディターで「Bullet.cs」が開ければOKです

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

public class Bullet : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(0.03f, 0, 0);

        if (transform.position.x > 10.0f)
        {
            Destroy(gameObject);
        }
    }
}

Bullet.cs」は現在このような内容かと思います

ここに追記します

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

public class Bullet : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(0.03f, 0, 0);

        if (transform.position.x > 10.0f)
        {
            Destroy(gameObject);
        }
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        Destroy(col.gameObject);
        Destroy(this.gameObject);
    }
}

OnTriggerEnter2Dという部分を追記しました

追記が完了したら変更を保存してUnityに戻りましょう

Unityでゲームを開始すると、弾で敵を打ち落とせるようになります!

以上でこの記事のシューティングゲームの作成は完了です

お疲れ様でした!

最後に

最後まで読んでいただき、ありがとうございます

ここまで作ってみると「ゲームが出来た!」という気持ちもあるかと思いますが、一方で・・・

  • このゲーム、終わらないじゃん!
  • このゲーム、クリアがないじゃん!
  • やっぱり見た目がショボい!

なんて感想を抱いた方も多いでしょう

なので機能を追加するとしたら次のような感じになるかと思います

追加機能
  • 倒した敵の数を表示する
  • プレイヤーが敵と接触したときゲームオーバーにする
  • プレイヤーなどの画像をいい感じのやつに換える

ここまでゲームを作ることができた方なら、この先の機能も調べながら作っていくことが出来るようになっていると思います

Unityによるゲーム製作に興味が出てきた方は、ぜひ追加機能の開発にもチャレンジしてみてください!

Unityのスキルを身につけて、ゲームを自由自在に作れるようになると、とっても楽しいですよ!

以上です。ではまた~

追記:スコア表示の方法を記事にしました!

【Unity初心者向け】スコア表示のやり方

この記事で作成したシューティングゲームにスコアを追加する手順を画像付きで解説しています

さらに追記:ゲームオーバーの作成方法を記事にしました!

【Unity初心者向け】ゲームオーバーの作り方

この記事で作成したシューティングゲームにゲームオーバー処理を追加する手順を画像付きで解説しています

別なゲームに挑戦したい!

【簡単タワーディフェンス】Tower Defense Toolkit 4 (TDTK-4) の使い方【Unityアセット】

こちらの記事では、初心者でも簡単にタワーディフェンスゲームが作れるアセットをご紹介しています

コメント