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