74 lines
2.1 KiB
C#
74 lines
2.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class EnemyHealthBar : MonoBehaviour
|
|
{
|
|
[Header("UI設定")]
|
|
[SerializeField] private Slider hpSlider;
|
|
[SerializeField] private EnemyHealth targetEnemyHealth;
|
|
|
|
[Header("追従設定")]
|
|
[Tooltip("敵の原点から頭上へどれだけ浮かせるか(メートル)")]
|
|
[SerializeField] private Vector3 offset = new Vector3(0, 2.0f, 0);
|
|
|
|
private Transform targetTransform;
|
|
private Transform mainCameraTransform;
|
|
|
|
private void Start()
|
|
{
|
|
// ターゲットのEnemyHealthを自動検索
|
|
if (targetEnemyHealth == null)
|
|
{
|
|
targetEnemyHealth = GetComponentInParent<EnemyHealth>();
|
|
}
|
|
|
|
if (targetEnemyHealth != null)
|
|
{
|
|
targetTransform = targetEnemyHealth.transform;
|
|
targetEnemyHealth.OnHealthChanged += UpdateHp;
|
|
targetEnemyHealth.OnDeath += HandleDeath;
|
|
|
|
UpdateHp(targetEnemyHealth.CurrentHealth, targetEnemyHealth.MaxHealth);
|
|
}
|
|
|
|
if (Camera.main != null)
|
|
{
|
|
mainCameraTransform = Camera.main.transform;
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (targetEnemyHealth != null)
|
|
{
|
|
targetEnemyHealth.OnHealthChanged -= UpdateHp;
|
|
targetEnemyHealth.OnDeath -= HandleDeath;
|
|
}
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (targetTransform == null || mainCameraTransform == null) return;
|
|
|
|
// 1. 敵の頭上に位置を追従
|
|
transform.position = targetTransform.position + offset;
|
|
|
|
// 2. 常にカメラの向きへ正対(ビルボード処理:鏡像反転を防ぐためカメラの向きと平行にする)
|
|
transform.forward = mainCameraTransform.forward;
|
|
}
|
|
|
|
private void UpdateHp(float current, float max)
|
|
{
|
|
if (hpSlider != null)
|
|
{
|
|
hpSlider.maxValue = max;
|
|
hpSlider.value = current;
|
|
}
|
|
}
|
|
|
|
private void HandleDeath()
|
|
{
|
|
// 敵が死んだらバーを即座に非表示
|
|
gameObject.SetActive(false);
|
|
}
|
|
} |