パート⑥:アイテムを入手してHPを回復できるようにする@2Dローグライク公式tutorial解説【Unity2018】

このパートで行うこと

今回のパートでは新たにプレイヤーにHPの概念を追加する。

このゲームは一歩歩くごとにHPが消費される。ローグライクではよくある飢餓システムだ。
そして、HPはアイテムを入手することで回復することができる。風来のシレンでいう「おにぎり」のことである。

また、この記事でこのゲームの完成まで半分、折り返し地点まできたことになる。
君が遊んだことがあるローグライクゲームに徐々に近づいてきたはずだ。

f:id:snoopopo:20180722140424g:plain


前回の記事はこちら。
パート⑤:あたり判定をつけて壁を破壊できるようにする@2Dローグライク公式tutorial解説【Unity2018】


※この記事は、unity公式チュートリアル「2D Roguelike tutorial」を解説した連載記事です。
この連載記事共通の事項(実施している環境等)は以下の記事を参照ください。
表紙:2Dローグライク公式tutorial解説【Unity2018】


uGUIで文字を描画する

このゲームでは、HPを表示したいが、まだ文字の表示方法を知らないので、
単純に固定文字を表示することからやっていこう。

unityにはuGUIという、ボタンやスクロール、文字などのユーザーインタフェースを簡単に描画できる仕組みがある。 今回はそれを利用する。

文字を表示するには、文字の描画機能をもつゲームオブジェクトを作成することから始まる。

(ヒエラルキーで)右クリック -> UI -> Text 

「Text」というゲームオブジェクトが作成されるが、名前をわかりやすく「FoodText」に変えておこう。

f:id:snoopopo:20180722175801p:plain

まず「FoodText」作成時に、「Canvas」と「EventSystem」というゲームオブジェクトが自動で作成されている点に注目しよう。

「Canvas」ゲームオブジェクトはCanvasコンポーネントを持ち、
今回作成した「FoodText」のようにuGUIの仕組みを持ったゲームオブジェクトは、全てCanvasコンポーネントを持つゲームオブジェクトの子オブジェクトにしなけらばならない。

「EventSystem」は、uGUIで作成されたゲームオブジェクトのイベント処理を管理する。
例えばボタンを押した、とかスクロールした、という動作を不都合ないようにする役割を担っている。
uGUIのイベント処理を使いたい場合はこのゲームオブジェクトが存在することが必須となるので覚えておこう。


「FoodText」ゲームオブジェクトには、RectTransformTextコンポーネントがアタッチされている。

今まで作成してきたゲームオブジェクトにはTransformという位置やスケールを調整できるコンポーネントがついていたが、 uGUIの仕組みを使うゲームオブジェクトは、代わりにRectTransform となる。

RectTransformTransformの大きな違いは、矩形の大きさ(Width/Height)や中心点(Pivot)などを指定できることだ。 uGUIではこれを意識して配置を行えるのである。

このゲームでは、HPの文字は常にどのような画面サイズだったとしても、画面中央下部に配置したいので、
以下のように設定する。

f:id:snoopopo:20180722180932p:plain


Textコンポーネントはその名の通り、文字の描画機能をもったコンポーネントである。

このゲームで必要な以下の設定を行おう。

設定項目 設定値 説明
Text Food:100 描画する文字
Font PressStart2P-Regular フォントの設定を行う
FontSize 24 フォントサイズの指定
Alignment 水平・垂直方向とも中央 矩形サイズ内のテキストの位置を設定する
Horizonal Overflow Overflow Overflowに設定した場合は矩形横幅サイズに依存しない。
Vertical Overflow Overflow Overflowに設定した場合は矩形縦幅サイズに依存しない。
Color #FFFFFF(白) 色の指定

f:id:snoopopo:20180722180627p:plain

歩くごとにHPを減らす

ここまでで文字を表示する方法はわかった。

次は、プレイヤーにHPを追加し、歩くごとにHPを1減らしていく。
そしてプレイヤーの現在のHPを文字で描画しよう。 Playerスクリプトはこのようになる。

Player.cs
using UnityEngine.UI; //uGUIのnamespaceはこれなので、忘れずに追加すること!

public class Player : MovingObject {
    private int food = 100; //現在のHP
    public Text foodText;
    //その他のフィールドは変更なしなので省略
  
    protected override void Start(){
        base.Start();

        this.foodText.text = "Food:" + this.food;
    }

    protected override void AttemptMove<T>(int xDir, int yDir) {
        
        food --;
        foodText.text = "Food: " + food;

        base.AttemptMove<T>(xDir, yDir);
        GameManager.instance.playersTurn = false;
    }
    //その他のメソッドは変更なしなので省略
}

int型のfoodという現在のHPを保持する変数を追加し、歩くごとにデクリメント、つまり−1していく。
先ほど作成した「FoodText」ゲームオブジェクトにアタッチされたTextコンポーネントの文字をfoodの値で更新していく。

難しいところはないだろう。

今度はUnityエディタ側でPlayer#foodTextに「FoodText」ゲームオブジェクトを設定しよう。

f:id:snoopopo:20180721231742g:plain

こんな感じに歩くごとにHPが減っていけばOKだ。

f:id:snoopopo:20180721231314g:plain

アイテムでHPを回復させる

今度はアイテムを入手し、HPを回復させる処理を作成しよう。

MonoBehaviour#OnTriggerEnter2D()は、コライダー同士が当たった際に呼ばれるメソッドである。

MonoBehaviour.OnTriggerEnter2D(Collider2D) - Unity スクリプトリファレンス

Player.cs
public class Player : MovingObject {
    public int pointPerFood = 10;
    public int pointPerSoda = 20;

    private void OnTriggerEnter2D(Collider2D other) {
        if(other.tag == "Food"){
            food += pointPerFood;
            other.gameObject.SetActive(false);
            this.foodText.text = "+" + pointPerFood + " Food:" + this.food;
        
        } else if(other.tag == "Soda"){
            food += pointPerSoda;
            other.gameObject.SetActive(false);
            this.foodText.text = "+" + pointPerSoda + " Food:" + this.food;
        }       
    }
}

プレイヤーと当たったものはCollider2D型で入手できる。
上記のソースは、FoodかSodaかを判断し、それぞれの回復量分HPを回復し、HPの文字を更新している。
入手後はアイテムを非アクティブにし画面から消す。

アイテムプレハブの設定

ここでUnityエディタ側に戻り、「Food」と「Soda」プレハブに必要な設定に行おう。

上記のソースをみると、Collider2D#tagというプロパティで当たったものがなんなのかを判定している。
このtagは、インスペクターで設定できる。

f:id:snoopopo:20180722135730p:plain

また、MonoBehaviour#OnTriggerEnter2D()は、コライダー同士の当たり判定で呼ばれるメソッドなので、
BoxColloder2Dコンポーネントをアタッチし、IsTriggerにチェックを入れておくこと。
こうすることで、MonoBehaviour#OnTriggerEnter2D()が呼ばれるようになる。

f:id:snoopopo:20180722141353p:plain

プレハブ名 Tag BoxColloder2D#IsTrigger
Food Food True
Soda Soda True

ここまでの設定で準備は完了した。ゲームを起動して確認しよう。

f:id:snoopopo:20180722140424g:plain

次回予告

このパートでアイテムの実装も終了し、プレイヤーのHPの概念も追加された。
しかし、現在はプレイヤーのHPが0以下になってもゲームは続行されてしまう。

そこで次のパートでは、ステージに切り替えられるようにし、 HPが0になればゲームオーバーにする。
これでゲームは回るようになる。

⇒ 次パート:7/30(月) AM7:00 アップ予定! ※7/25(水)はお休みです。