Unityの2Dゲームで「プレイヤーの上にダメージを表示」していきます。
敵の攻撃が当たった時などに、プレイヤーの上に数字を表示する感じです。今回は「画面に数字を表示」する部分の実装なので、敵の攻撃やプレイヤーのライフ部分は無いです。
はじめに
Unityのバージョンは2021.3.14f1です。
下記のように、プレイヤーの上にダメージ数を表示してみます。
実装開始
まずはキー操作で動くプレイヤーを作成、その後ダメージの実装をしていきます。
プレイヤーの作成
「Create Empty」で空のオブジェクトを2つ追加。PlayerとGroundに名前を変更します。
それぞれ、下記のように設定します。
PlayerMoveのスクリプトは下記の様な感じ。
using UnityEngine; public class PlayerMove : MonoBehaviour { private float PlayerSpeed = 0.5f; private Rigidbody2D _rigidbody; void Start() { _rigidbody = GetComponent<Rigidbody2D>(); } void Update() { float InputX = Input.GetAxisRaw("Horizontal"); _rigidbody.velocity = new Vector2(InputX * PlayerSpeed, 0); } }
下記が参考記事になります。
実行してみて、地面の上をプレイヤーがキー操作で動けばOK
ダメージテキストの追加
「UI」→「Legacy」→「Text」を追加。
Canvasのレンダーモードをカメラに変更し、カメラをセット。
Textの幅、高さ、フォントサイズを調整。テキストは仮の値を入れておきます。
下記の様な感じですね。
ダメージのスクリプト作成
Damageと言う名前で新規スクリプトをアタッチ、スクリプトの中身は下記です。
using UnityEngine; using UnityEngine.UI; public class Damage : MonoBehaviour { private float _displaytime = 0.4f; private float _timer; private Text _txt; private void Awake() { _txt = GetComponent<Text>(); } void Update() { _timer += Time.deltaTime; if (_timer > _displaytime) Destroy(gameObject); } public void SetDamageText(int value) { _txt.text = value.ToString(); } }
一定時間表示したらオブジェクトを削除、ダメージ量はSetDamageTextでセットします。
オブジェクト名をDamageに変更して、プレハブ化しておきます。
プレハブを出したり消したりしてダメージを表示します。
プレハブ管理を追加
次にダメージのプレハブを呼び出すマネージャを追加します。空オブジェクトを追加してDamageManagerと言う名前に変更します。
DamageManagerと言う名前で新規スクリプトを作成、スクリプトの中身は下記です。
using UnityEngine; public class DamageManager : MonoBehaviour { [SerializeField] private GameObject _damageobj; [SerializeField] private Canvas _canvas; [SerializeField] private Transform _target; public void TakeDamage(int damageval) { Vector2 pos = new Vector2(_target.position.x, _target.position.y + 1.0f); Damage damageIns = Instantiate(_damageobj, pos, Quaternion.identity, _canvas.transform).GetComponent<Damage>(); damageIns.SetDamageText(damageval); } }
指定位置にプレハブをインスタンス化して、ダメージ量をセットしているという感じです。
アタッチして各変数をセットします。
ダメージボタンの追加
今回はボタンを押したらダメージを食らうようにしてみます。「UI」→「Legacy」→「Button」を追加。
ボタンクリック時に呼び出します。
ボタンを押してプレイヤーの上にダメージが表示されたらOK。
このままだと表示して消すだけなので、少しスクリプトを変更。
using UnityEngine; using UnityEngine.UI; public class Damage : MonoBehaviour { private float _displaytime = 0.4f; private float _timer; private Text _txt; private Vector3 pos; private void Awake() { _txt = GetComponent<Text>(); pos = transform.position; } void Update() { _timer += Time.deltaTime; if (_timer > _displaytime) Destroy(gameObject); pos.y += 0.01f; transform.position = pos; } public void SetDamageText(int value) { _txt.text = value.ToString(); } }
表示されてから数字が上昇して消えるという感じです。