2Dアクションにおけるステートの切り替え【Unity2D】

今回は、ゲーム全体を管理する監督オブジェクトを作りたいと思います。

Twitterでも書きましたが、ADSLの故障で約1週間ほどPCからネットが出来ませんでした。本当は連続更新が続いていたので、短いスパンで投稿し続けたかったんですけど、ごめんなさい!

本題に戻り、ゲームが開始してからゲームオーバーになるまでの一連の流れを作りますね。

スポンサーリンク

ゲーム全体をコントロールするスクリプトの作成

まずは、プレイヤーコントローラを修正します。敵に接触したらゲームオーバーにする処理を
付け加えるためですね。

プレイヤースクリプトの修正

IsDeadというフラグを用意しました。敵に接触したらtrueとなりゲームオーバーになります。
また、監督スクリプトからチェックすることになります。

ChangeIKメソッドは、isKinematicをオンオフするメソッドで、Unityちゃんがジャンプ出来るのか出来ないのかを管理します。このメソッドは正直絶対必要ではないんですが、こういった事も出来るよという意味で付けておきます。

ゲームスタート時やゲームオーバー時にジャンプ操作を不可にするといった際に便利です。

当たり判定はOnCollisionEnter2Dを使います。敵に「enemy」というタグを用意して敵に接触したかを判別するようにします。

ディレクタースクリプトを作成する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Director : MonoBehaviour
{
public UnitychanController unitychan;
public GameObject enemy;
enum State
{
Ready,
Play,
GameOver
}
State state;
// Start is called before the first frame update
void Start()
{
Ready();
}
// Update is called once per frame
void Update()
{
switch (state)
{
case State.Ready:
if (Input.GetButtonDown("Fire1")) GameStart();
break;
case State.Play:
if (unitychan.IsDead()) GameOver();
break;
case State.GameOver:
if (Input.GetButtonDown("Fire1")) Reload();
break;
}
}
void Ready()
{
state = State.Ready;
unitychan.ChangeIK(false);
enemy.SetActive(false);
}
void GameStart()
{
state = State.Play;
unitychan.ChangeIK(true);
enemy.SetActive(true);
}
void GameOver()
{
state = State.GameOver;
BackScroll[] backscroll = FindObjectsOfType<BackScroll>();
foreach (BackScroll so in backscroll) so.enabled = false;
}
void Reload()
{
SceneManager.LoadScene("2daction");
}
}
view raw directorscript hosted with ❤ by GitHub

ゲームの状態を判別するために、3つのステートを用意します

Readyステート

その名の通り、ゲームスタート時のステートです。この時点で急に敵が出現するのを防ぎます。

enemy.SetActive(false)がその部分です。ちなみに、雲は初期状態からスクロールするようにしています。その方が自然な感じがしたので。

画面がタップされると、Playステートに遷移して敵が出現するようになります。

Playステート

Unityちゃんを操作出来る状態です。敵が出現するので、回避するようにします。
敵に接触したらIsDeadをtrueにして、GameOverメソッドに進みます。

GameOverステート

敵と雲のスクロールを停止して、ゲームオーバーとなります。
スクロールの停止は、Find関数を使ってBackScrollがアタッチされているオブジェクトを探してenabledフラグをfalseにすることで停止させることが出来ます。

今後ゲームオーバー用のテキストを配置するのでよりゲームオーバーっぽくなると思います。この状態で画面がタップされたら、Reloadメソッドにアクセスし自シーンを読み込こんで初期化します。

スクリプトが完成したら新規で空のオブジェクトを作成し、このスクリプトをアタッチします。
アウトレット接続で、UnityちゃんとEnemyオブジェクトを設定してください。

ステート毎の処理を実装した様子

ゲームを実行するとゲームスタートからスクロール停止まで確認出来ます。
次回は、ゲームにテキストの配置を行います。

著者プロフィール
うんくん

IT系に特化した記事がメインです。(Unity多め。)
Udemy講師もやっています。よろしくお願いします。

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

うんくんをフォローする
ループスクロール【2D】
スポンサーリンク
シェアする
うんくんをフォローする