おっさんプログラマのUnity奮闘記

元WEB系プログラマのUnity奮闘記

おっさんのUnity入門 2Dオブジェクトでプレイヤーに体力を設定する(UIテキストとプレイヤーオブジェクトの連携)

f:id:gomunpass:20180221210306j:plain

前回のシーンにPLAYERの体力を設定して体力が0になったらゲームオーバーの表示が出るように改良します。

【追加するオブジェクト】

  • armorText(Hierarchy > UI > Text)


f:id:gomunpass:20180221210317j:plain

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;
		}
	}
}


f:id:gomunpass:20180221215409j:plain


【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;
	}
}

f:id:gomunpass:20180221210325j:plain

左上にPLAYERの体力が表示されるようになりました。
ENEMYに1回接触すると2ポイント減るように設定しています。

f:id:gomunpass:20180221210334j:plain

体力が0になるとゲームオーバーが表示されます。