ミニゲームを作ってUnityを学ぶ![3Dマインスイーパー編]
###第1回目: 下準備
3Dマインスイーパーを作るにあたって、まずはプロジェクトに必要な土台部分を先に用意していきます。
#新規プロジェクト
Unityプロジェクトを新しく作成します。
3Dにチェックが入っていることを確認したら名前を決めて新規プロジェクトを作成。
- プロジェクト名: CsgUnitySweeper
- 画面比率: FreeAspect
- エディタレイアウト: 2by3でProjectウインドウをOneColomnに変更
↑このあたりは自分の使いやすいように変更してください。
#アセットのインポート
プロジェクトに必要なアセットを予めインポートしておきます。
今回はタンクウォーズ編でも利用した以下の無料アセットをマスのテクスチャとして使用します。
UnityのAssetStoreウインドウからインポートする場合は以下のように行ってください。
- 「上部メニューのWindow」→「Asset Store」
- 「Sci-Fi Texture Pack」のワードで検索をかける
- 上記アセットのページへ移動して「ダウンロード」・「インポート」を選択
- さらに表示されたウインドウで「Import」を選択
#_MyFolderの作成とシーンの保存
新しいフォルダ「_MyFolder」を作成した後、その中にさらに「Scenes」というフォルダを作成し、そこに現在のシーンを「main」という名前で保存します。
以後、上の画像のように自作したスクリプトやマテリアルなどは_MyFolderの中にそれぞれ対応したフォルダを作成して格納していきますが、これは単純にこの方が使いやすいという個人的な好みですので他の方法に慣れている場合はそちらを優先してください。
#ゲームコントローラーの作成
プロジェクト全体を管理するためのスクリプトを作成します。
- スクリプト「GameController」を作成
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameController : MonoBehaviour
{
// 初期化タイミングでインスタンスを生成
private static readonly GameController mInstance = new GameController();
// コンストラクタをprivateにすることによって他クラスからnewできないようにする
private GameController() { }
// 他クラスからこのインスタンスを参照する
public static GameController Instance
{
get
{
return mInstance;
}
}
public void Init()
{
// フレームレートの設定
Application.targetFrameRate = 30;
}
}
GameControllerは特殊なクラスで、プロジェクト全体を通して1つしかインスタンスを生成することができません。
また同時に、その唯一のインスタンスをプロジェクト内の全てのスクリプトから呼び出すことができます。
この特性を利用することで本来はシーンが切り替わる際に破棄されてしまう値やクラスを残したり、複数のスクリプトから呼び出される定数などを一元管理することが主な役割です。
#シーンマネージャーの作成
続いて、先ほど保存したmainシーンを制御するためのスクリプトを作成します。
- 空オブジェクト「SceneMain」をゼロポジションに配置
- スクリプト「SceneMain」を作成して上記の空オブジェクトにアタッチ
【ゼロポジション】
TransformのPositionとRotationが全て0でScaleの値が全て1のオブジェクトを
シーンに配置する場合に、記事内では「ゼロポジションに配置」と表記しています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SceneMain : MonoBehaviour
{
private GameController mGame;
void Awake()
{
mGame = GameController.Instance;
mGame.Init();
}
//-------------
// 状態と更新 //
//---------------------------------------------------------------------------------
private enum STATE
{
DEFAULT = 0
}
private STATE mState = STATE.DEFAULT;
void Update()
{
switch (mState)
{
}
}
}
SceneMainはフィールドmStateを持ち、このmStateの値によってUpdate()での処理を分岐させています。
今はまだDEFAULTという値しかありませんが、これに例えばPLAYやRESULTといった新しい状態を追加していくことでゲームの進行状況にあった処理を実行できるようになります。
またゲーム起動直後の処理としてAwake()でGameControllerのインスタンスを取得してInit()を呼び出すことでゲームのフレームレートを30に設定しています。
これによって各スクリプトに実装されたUpdate()が1秒間に30回だけ呼び出されるようになります。
GameControllerは初めて呼び出されたこのタイミングで自分のインスタンスを生成します。
オブジェクトにアタッチされているわけではないのでシーンの切り替わりで破棄されず、プロジェクトが終了するまで同じインスタンスを利用することができます。