HPbarzissou
This commit is contained in:
74
Assets/_Scripts/EnemyHealthBar.cs
Normal file
74
Assets/_Scripts/EnemyHealthBar.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user