본문 바로가기
개발/Unity

Unity)격투 게임 HP 구현하기 (Recoverable HP :회복 가능 HP)

by 테샤르 2024. 10. 8.

격투 게임 HP 구현하기 (Recoverable HP :회복 가능 HP)

 

 

격투게임이나 특정 순간의 강력한 데미지를 표현해줄때 2중으로 HP를 표현해줌으로써 매번 체력 게이지를 보는게 아니기 때문에 얼만큼 차감이 되는지에 대해새 임펙트가 있는 형태의 HP이다.

 

반응형

 

 

< 코드 >

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class HPBar : MonoBehaviour
{
    [SerializeField]
    private Image foregroundImage; // 즉시 감소하는 이미지
    [SerializeField]
    private Image backgroundImage; // 서서히 감소하는 이미지

    public float smoothSpeed = 0.5f; // 배경 이미지 감소 속도
    public float delay = 0.5f; // 배경 이미지가 감소하기 전 대기 시간

    [SerializeField]
    private float currentHP;
    [SerializeField]
    private float maxHP = 100f;

    // 초기화
    void Start()
    {
        currentHP = maxHP;
        UpdateHPBar();
    }

    [ContextMenu("HP : Full")]
    private void Full()
    {
        Start();
    }

    [ContextMenu("HP : Decrease - Random")]
    private void RandomDmage()
    {
        float damage = Random.Range(0f, maxHP);  // Random.Range로 수정
        TakeDamage(damage);
    }

    // HP를 감소시키는 메서드
    public void TakeDamage(float damage)
    {
        Debug.Log($"[HPBar] TakeDamage : {damage}");
        currentHP -= damage;  // 한 번만 감소
        if (currentHP < 0) currentHP = 0;

        // 즉시 전방 이미지 업데이트
        foregroundImage.fillAmount = currentHP / maxHP;

        // 배경 이미지는 서서히 감소시키는 코루틴 실행 (일정 대기 후)
        StopAllCoroutines(); // 중복 실행 방지
        StartCoroutine(SmoothBackgroundUpdate());
    }

    // 전방 이미지에 맞춰 배경 이미지를 일정 시간 후 서서히 감소시키는 코루틴
    private IEnumerator SmoothBackgroundUpdate()
    {
        // 배경 이미지가 감소하기 전에 잠시 대기
        yield return new WaitForSeconds(delay);

        // 배경 이미지가 서서히 전방 이미지에 맞춰 감소
        while (backgroundImage.fillAmount > foregroundImage.fillAmount)
        {
            backgroundImage.fillAmount = Mathf.MoveTowards(backgroundImage.fillAmount, foregroundImage.fillAmount, Time.deltaTime * smoothSpeed);
            yield return null;
        }
    }

    // HP 바를 업데이트하는 메서드
    private void UpdateHPBar()
    {
        foregroundImage.fillAmount = currentHP / maxHP;
        backgroundImage.fillAmount = currentHP / maxHP;
    }
}

 

 

★☆☆☆☆

 

반응형

댓글