このパートで行うこと
今回のパートでは新たにプレイヤーにHPの概念を追加する。
このゲームは一歩歩くごとにHPが消費される。ローグライクではよくある飢餓システムだ。
そして、HPはアイテムを入手することで回復することができる。風来のシレンでいう「おにぎり」のことである。
また、この記事でこのゲームの完成まで半分、折り返し地点まできたことになる。
君が遊んだことがあるローグライクゲームに徐々に近づいてきたはずだ。
前回の記事はこちら。
⇒ パート⑤:あたり判定をつけて壁を破壊できるようにする@2Dローグライク公式tutorial解説【Unity2018】
※この記事は、unity公式チュートリアル「2D Roguelike tutorial」を解説した連載記事です。
この連載記事共通の事項(実施している環境等)は以下の記事を参照ください。
⇒ 表紙:2Dローグライク公式tutorial解説【Unity2018】
uGUIで文字を描画する
このゲームでは、HPを表示したいが、まだ文字の表示方法を知らないので、
単純に固定文字を表示することからやっていこう。
unityにはuGUIという、ボタンやスクロール、文字などのユーザーインタフェースを簡単に描画できる仕組みがある。 今回はそれを利用する。
文字を表示するには、文字の描画機能をもつゲームオブジェクトを作成することから始まる。
(ヒエラルキーで)右クリック -> UI -> Text
「Text」というゲームオブジェクトが作成されるが、名前をわかりやすく「FoodText」に変えておこう。
まず「FoodText」作成時に、「Canvas」と「EventSystem」というゲームオブジェクトが自動で作成されている点に注目しよう。
「Canvas」ゲームオブジェクトはCanvas
コンポーネントを持ち、
今回作成した「FoodText」のようにuGUIの仕組みを持ったゲームオブジェクトは、全てCanvas
コンポーネントを持つゲームオブジェクトの子オブジェクトにしなけらばならない。
「EventSystem」は、uGUIで作成されたゲームオブジェクトのイベント処理を管理する。
例えばボタンを押した、とかスクロールした、という動作を不都合ないようにする役割を担っている。
uGUIのイベント処理を使いたい場合はこのゲームオブジェクトが存在することが必須となるので覚えておこう。
「FoodText」ゲームオブジェクトには、RectTransform
とText
コンポーネントがアタッチされている。
今まで作成してきたゲームオブジェクトにはTransform
という位置やスケールを調整できるコンポーネントがついていたが、
uGUIの仕組みを使うゲームオブジェクトは、代わりにRectTransform
となる。
RectTransform
とTransform
の大きな違いは、矩形の大きさ(Width/Height
)や中心点(Pivot
)などを指定できることだ。
uGUIではこれを意識して配置を行えるのである。
このゲームでは、HPの文字は常にどのような画面サイズだったとしても、画面中央下部に配置したいので、
以下のように設定する。
Text
コンポーネントはその名の通り、文字の描画機能をもったコンポーネントである。
このゲームで必要な以下の設定を行おう。
設定項目 | 設定値 | 説明 |
---|---|---|
Text |
Food:100 | 描画する文字 |
Font |
PressStart2P-Regular | フォントの設定を行う |
FontSize |
24 | フォントサイズの指定 |
Alignment |
水平・垂直方向とも中央 | 矩形サイズ内のテキストの位置を設定する |
Horizonal Overflow |
Overflow | Overflowに設定した場合は矩形横幅サイズに依存しない。 |
Vertical Overflow |
Overflow | Overflowに設定した場合は矩形縦幅サイズに依存しない。 |
Color |
#FFFFFF(白) | 色の指定 |
歩くごとにHPを減らす
ここまでで文字を表示する方法はわかった。
次は、プレイヤーにHPを追加し、歩くごとにHPを1減らしていく。
そしてプレイヤーの現在のHPを文字で描画しよう。
Player
スクリプトはこのようになる。
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」ゲームオブジェクトを設定しよう。
こんな感じに歩くごとにHPが減っていけばOKだ。
アイテムでHPを回復させる
今度はアイテムを入手し、HPを回復させる処理を作成しよう。
MonoBehaviour#OnTriggerEnter2D()
は、コライダー同士が当たった際に呼ばれるメソッドである。
MonoBehaviour.OnTriggerEnter2D(Collider2D) - Unity スクリプトリファレンス
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は、インスペクターで設定できる。
また、MonoBehaviour#OnTriggerEnter2D()
は、コライダー同士の当たり判定で呼ばれるメソッドなので、
BoxColloder2D
コンポーネントをアタッチし、IsTrigger
にチェックを入れておくこと。
こうすることで、MonoBehaviour#OnTriggerEnter2D()
が呼ばれるようになる。
プレハブ名 | Tag | BoxColloder2D#IsTrigger |
---|---|---|
Food | Food | True |
Soda | Soda | True |
ここまでの設定で準備は完了した。ゲームを起動して確認しよう。
次回予告
このパートでアイテムの実装も終了し、プレイヤーのHPの概念も追加された。
しかし、現在はプレイヤーのHPが0以下になってもゲームは続行されてしまう。
そこで次のパートでは、ステージに切り替えられるようにし、
HPが0になればゲームオーバーにする。
これでゲームは回るようになる。
⇒ 次パートはこちら。