ゴマちゃんフロンティア

気まぐれと勢いで作るUnityゲーム開発日記です。

【開発メモ】体力0でミスとなった場合の処理の実装

time 2016/07/23

というわけで、最近Googleアナリティクスを見ていると、「モグフィー」という検索ワードで来る方がいるようです。
自分としてはブログ3キャラの内の1匹に適当に付けた名前なのですが、どうやら離乳食の製品名と被ってしまっていたようです。
半分検索妨害のような感じですが、今更被ったからと名前を変えるのもアレなので、このまま行かせていただきます!

今回は「体力がなくなりミスとなった時」の処理について考えてみます。
前回の「落下時のダメージ処理」に続き、ゲームとしての体裁を保つためには必須の処理ですね。

shot2ss20160723090956792

要するに「体力なくなって死んだとき」の処理ですが、直接死亡と書くのはこの手のゲームでは避けたいので、ミスと表記することにします。
「倒れた」とか「ちからつきた」とかそんなニュアンスです。
最近のRPGでは「戦闘不能」とか「気絶」とかで、死亡扱いしているのはドラクエや硬派なゲームだけな気がします。

前回の記事はこちらになります。

【開発メモ】ステージ外へ落下した際の処理について

ミスとなった場合の処理

ゲームとしてはシンプルにゲームオーバーにします。
但し無限にコンティニューが可能で、コンティニューした場合は体力を全回復させて復帰させます。

コンティニューをしなかった場合はタイトルにでも飛ばせば良いでしょう。
まだまともなタイトル画面は作っていませんが・・・。
ちなみに Unity5.3 からシーン遷移が Application 系から SceneManager を使ったものに変わっているようなので注意します。

キャラクター的にはフラフラと倒れるようなアニメーションをさせればそれっぽくなりそうです。
また当たり前ですが、体力が0になった段階で操作できなくする必要があります。
とりあえず CharacterControoler の canControl をfalseに設定して動けないようにはしておけば、最低限の体裁は整えられそうな感じ。

ゲームオーバー時のUI作成

まずゲームオーバー時のロゴを作ってしまいます。
GIMP で適当にやります。

20160723_gameover

ゲーム開発ってデザインセンスも求められるわけですよ。
自分の水準以下のデザインセンスでこの先ゲームを作っていけるのか心配になってきます。
そんなクオリティです。
まあキャラクターデザインとかも割と適当なので、今に始まったことではありませんが。

shot2ss20160723091447812

最低限必要なものはゲームオーバーのロゴ、コンティニューボタンとENDボタンです。
それだけでは不親切なので、コンティニューボタンとENDボタンの説明文なんかも欲しいところです。
ロゴはただの画像なので配置するだけですが、コンティニューボタンとENDボタンは押下時にイベントを走らせる必要があります。
なので UI の Button として作成します。

shot2ss20160723091050222

ゲームオーバー専用の UI としてまとめて管理したいので、上のように空オブジェクトの子にしました。
その場合、親となる空オブジェクトも Transform から RectTransform にしておいた方が良いようです。

shot2ss20160723092244763

uGUI であればクリック時の処理や各種イベント処理が簡単に登録できます。
UI 上から実行したいスクリプトのオブジェクトとメソッドを選択するだけ!
OnGUI() で頑張っていた4.1の頃と比べると便利になったものです。

ボタンが反応しない場合、ヒエラルキーに「EventSystem」が存在するか確認します。
ない場合、メニューバーから「GameObject→UI→EventSystem」で追加します。

shot2ss20160723091142622

そのまま実行すると例外が発生し、「Input Button Submit is not setup.」とか言われます。
Standalone Input Module の各項目に対応する入力が InputManager 上に存在する必要があります。
上記エラーの場合、InputManager で新しく「Submit」を作成するか、モジュールの項目名を InputManager に存在する入力の何れかに変更して対応します。

ゲームオーバー時のスクリプト処理

ゲームオーバー時の処理の UI 制御をまとめたスクリプトを作成します。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
using System.Collections;

/// <summary>
/// ゲームオーバー時のUIを制御するクラス
/// </summary>

public class GameOverUI : MonoBehaviour {

    private Text description;
    private StageManager stageManager;

    void Start () {
        stageManager = GameObject.Find("StageManager").GetComponent<StageManager>();
        description = transform.FindChild("MenuDescription").GetComponent<Text>();
    }

    /// <summary>
    /// コンティニューボタンを押下した際の処理
    /// </summary>
    /// <param name="continueButton"></param>
    public void OnClickContinue(GameObject continueButton) {
        stageManager.toContinue();
        Destroy(this.gameObject);
    }

    /// <summary>
    /// ENDボタンを押下した際の処理
    /// </summary>
    public void OnClickEnd() {
        stageManager.toEnd();
    }

    /// <summary>
    /// コンティニューボタンにカーソルを合わせた際の処理
    /// </summary>
    public void OnPointerEnterContinue() {
        String message = YamlUtility.getMessageValue("gameover.continue");
        description.text = message;
    }

    /// <summary>
    /// ENDボタンにカーソルを合わせた際の処理
    /// </summary>
    public void OnPointerEnterEnd() {
        String message = YamlUtility.getMessageValue("gameover.end");
        description.text = message;
    }

    /// <summary>
    /// コンティニューボタンからカーソルを離した際の処理
    /// </summary>
    public void OnPointerExitContinue() {
        description.text = null;
    }

    /// <summary>
    /// ENDボタンからカーソルを離した際の処理
    /// </summary>
    public void OnPointerExitEnd() {
        description.text = null;
    }
}

どうしても関数が多くなってしまうので、コメントをしっかり書いて分かるようにしておきます。
Visual Studio ならスラッシュ3回入力で自動的にsummaryが入ってくれるのでラクラクです。

メッセージにある Yaml 系に関しては以下の記事をご参照下さい。

【Unity】YAMLファイルの読み込みと表示用メッセージの管理

UI 制御とは別で、ゲームオーバー時やコンティニュー時の処理を行うマネージャクラスを作成します。
ステージ上のゲーム進行を担うので、「StageManager」と命名してみました。
GameOverUI から呼ばれた処理はこちらで行います。

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

/// <summary>
/// ステージの進行・状態を管理するマネージャクラス
/// </summary>

public class StageManager : MonoBehaviour {

    public GameObject playerPrefab;
    public Transform checkPoint;
    public GameObject gameOverUI;
    private GameObject canvas;

    private GameObject playerObject;
    private Player player;

    void Awake() {
        playerObject = Instantiate(playerPrefab, checkPoint.position, Quaternion.identity) as GameObject;
        player = playerObject.GetComponent<Player>();
    }

    void Start () {
        canvas = GameObject.Find("Canvas");
    }

    public void toGameOver() {
        GameObject gameOver = Instantiate(gameOverUI) as GameObject;
        gameOver.transform.SetParent(canvas.transform);
        gameOver.GetComponent<RectTransform>().localPosition = Vector3.zero;
    }

    public void toContinue () {
        player.initToContinue(checkPoint.position);
    }

    public void toEnd() {
        // タイトル画面に戻す
        SceneManager.LoadScene("title");
    }
}

プレイヤーキャラの処理は Player クラスに initToContinue() メソッドを作っておき、それを呼んで処理させます。
いろいろ処理が絡み合っているので割愛しますが、スタート地点への移動や無敵判定の解除、パラメータ類のリセットを行っています。

あとは死んで動作チェック!
プレイヤーの体力100に対し、接触時の被ダメを1000に設定した無慈悲なウニに突撃してテストします。

20160723_01

死亡するとゲームオーバー画面が表示されること、プレイヤーが動かせなくなること、コンティニュー押下時にスタート地点へ戻されることを確認します。
GIFアニメーションにこれら全て入れるのは難しかったので、画像的にはぶっ倒れるマリンパだけですが・・・。
とりあえず動作に問題はなさそうです。

チェックポイントの作成

基本的に復帰地点はスタート地点ですが、チェックポイントに触れていればそこから再開にします。
これまたアクションゲームではよくあるシステムです。
中間ポイントのようなものを設けるのが手っ取り早いですが、どこまで進むとチェックポイントを通ったか分かりにくいので、私的には好きな形式ではないです。

となれば、チェックポイントと分かるようなオブジェクトが必要ですね!
これまた適当に作ります。

shot2ss20160723091606072

貝殻!
某ヒトデのマリンアクションもチェックポイントは貝殻だった気がします。
マーメイドとかそれに類するものは入っていないので問題ないかと思われます!
触れたのか分かりやすくするため、アニメーションで貝殻を開くようにしておきます。

で、貝殻にチェックポイント用のスクリプトを追加します。

using UnityEngine;
using System.Collections;

public class CheckPoint : MonoBehaviour {

    public Transform returnPoint;

    private StageManager stageManager;
    private Animator animator;

    void Start () {
        stageManager = GameObject.Find("StageManager").GetComponent<StageManager>();
        animator = this.GetComponent<Animator>();
    }

    void OnTriggerEnter(Collider c) {
        if (c.gameObject.tag == "Player") {
            animator.SetTrigger("open");
            stageManager.checkPoint = returnPoint;
        }
    }
}

貝殻に触れるとパカっと開き、コンティニュー時の復帰地点を触れた貝殻にします。
貝殻自体を復帰地点に登録すると地形にめり込んでしまうので、復帰地点用の空オブジェクトを指定し、そこに戻すようにしています。
見た目が猛烈に地味なので、そのうちエフェクトとか付けます!

まとめ

そんなわけで、ミス時の処理とゲームオーバー処理について作ってみました!
これで最低限のゲームとしてのルールはできたと思われます。
この状態でステージ上に敵やトラップを配置すればそれっぽくはなるので、そこまで作ってしまいたいです。

にしても uGUI は使いやすいですね!
特にイベント系の処理が簡単に実装できるようになったので、メニュー画面などの複雑なUIの作成も捗りそうです。

スポンサーリンク

down

コメントする



ツイッター