ユニットの残存機数を表示するやつを実装したので書き残します。
UnitPrefabをダブルクリックし、直下にTextMeshProを作ります。
Unit(clone)-TextMeshPro(clone)となればOKです。
TextMeshProはTextNumと名前を変更します。
UnitPrefabへUnit.cs、TextNumへTextNum.csをそれぞれアタッチします。
Unit.cs、TextNum.csへそれぞれ下記scriptを記述します。
public class Unit : MonoBehaviour
{
[SerializeField] int num;
[SerializeField] int maxNum;
public int Num { get => num; set => num = value; }
public int MaxNum { get => maxNum; }
private TextMeshPro textNum;
void Start()
{
textMeshPro = GetComponentInChildren<TextMeshPro>();
changeTextNum(MaxNum);
}
public void changeTextNum(int num)
{
textNum.text = num.ToString();
}
}
public class TextNum : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
transform.position = transform.parent.gameObject.transform.position;
}
}
あとは既に書いてある戦闘処理ロジックにてNumを変更する際に
changeTextNumを呼び出せばOKです。
//戦闘処理
public void CalcBattle(Unit own, Unit enemy)
{
int ownHp = own.Num * own.Df;
int enemyHp = enemy.Num * enemy.Df;
int damage = own.At * own.Num;
int givenDamage = enemy.At * enemy.Num; //反撃ダメージ
givenDamage = (givenDamage < 0) ? 0 : givenDamage;
//ダメージ結果
float ownNum = (ownHp - givenDamage) / own.Df;
float enemyNum = (enemyHp - damage) / enemy.Df;
if (ownNum > 1)
{
own.Num = (int)(ownNum);
own.changeTextNum(own.Num); //追加部分
}
else
{
own.DestoroyThis();
}
if (enemyNum > 1)
{
enemy.Num = (int)(enemyNum);
enemy.changeTextNum(enemy.Num); //追加部分
}
else
{
enemy.DestoroyThis();
}
DeletePints(pints);
return;
}
解説1)
ユニットに連動させて動かすために親子構造にします。その際Canvasがあると1層増えて面倒なためCanvasが不要なTextMeshProを使います。
解説2)
TextMeshProは初期状態だと裏に回ってしまい見えないため、
AddComponentからSorting Layerを追加→Unitと同様のレイヤーを選びましょう。
コメント