おっさんのUnity入門 2Dオブジェクトでプレイヤーに体力を設定する(UIテキストとプレイヤーオブジェクトの連携)
前回のシーンにPLAYERの体力を設定して体力が0になったらゲームオーバーの表示が出るように改良します。
【追加するオブジェクト】
- armorText(Hierarchy > UI > Text)
Font Size や Color などを適当に指定します。
【PlayerStaus.cs】
Playerの状態を管理するスクリプトを作成します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerStatus : MonoBehaviour { // PLAYERの体力 [SerializeField] // Inspectorで確認できるように属性を付ける private int armorPoint; void Start () { // PLAYERの体力を初期化 armorPoint = 10; } // PLAYERの体力を更新する関数 public int ArmorPoint { get { return armorPoint; } set { armorPoint = value; } } // ENEMYとの接触時に動作する関数 void OnCollisionEnter2D (Collision2D collision) { // 接触したオブジェクトがenemyのtagが付いたオブジェクトだったら if (collision.gameObject.tag == "enemy") { int tmpPoint = ArmorPoint; tmpPoint = tmpPoint - 2; ArmorPoint = tmpPoint; } } }
【UIController.cs】
PlayerStatus.csからPLAYERの体力を受け取って表示を変更するように修正します。
ゲームオーバーの表示タイミングを変更して体力が0になったら表示するように修正します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class UIController : MonoBehaviour { // gameoverTextオブジェクトの入れ物 Text gameover_text; // PLAYERとENEMYの接触状態を表すフラグ // get/setメソッドで他のスクリプトから呼び出すためprivateにしておく private bool enemyTouch; // armorTextオブジェクトの入れ物 Text armorText; // PlayerStatus.csの入れ物 PlayerStatus player_status; // PLAYERの体力の入れ物 private int armorPoint; void Start () { // PlayerStatusの取得 player_status = GameObject.Find ("PLAYER_GREEN") .GetComponentInChildren<PlayerStatus>(); // PLAYERの体力をPlayerStatus.csのArmorPointから取得して初期化 armorPoint = player_status.ArmorPoint; // armorPointを初期化する armorText = GameObject.Find ("armorText").GetComponent<Text> (); armorText.text = "armorPoint : " + armorPoint.ToString (); // UIのテキストを取得する(gameoverTextへ代入する) gameover_text = GameObject.Find ("gameoverText").GetComponent<Text> (); // ゲームスタート時はgameoverTextを非表示にしておく gameover_text.enabled = false; // PLAYERとENEMYの接触状態を表すフラグをfalseに初期化 enemyTouch = false; } void Update () { // PLAYERとENEMYが接触したら if (enemyTouch == true) { // PLAYERの体力を更新する armorPoint = player_status.ArmorPoint; // PLAYERの体力表示を更新する armorText.text = "armorPoint : " + armorPoint.ToString (); } if (armorPoint == 0) { // ゲームオーバー表示をするための関数を呼び出す。 GameOverMessage (); } } // 他のスクリプトから読み書きするための関数 // 他のスクリプトから呼び出せるようにpublic属性を付ける // true/falseを呼び出し元のスクリプトへ渡すためbool型を付ける public bool EnemyTouch { get { return enemyTouch; } set { enemyTouch = value; } } void GameOverMessage () { gameover_text.enabled = true; } }
左上にPLAYERの体力が表示されるようになりました。
ENEMYに1回接触すると2ポイント減るように設定しています。
体力が0になるとゲームオーバーが表示されます。