본문 바로가기
게임 개발/유니티 게임 개발 일지

#21 현재 HP, MP값 UI 구현하기

by FlowTree 2020. 8. 22.
반응형

게임 개발을 완료 후 빌드해서 폰에서 테스트 중... 현재 HP, MP값을 구현 안한 걸 확인했다.

역시 게임 개발 후 실전 테스트를 해봐야 부족한 부분을 찾을 수 있는 것 같다;;;


1.현재 HP, MP값 UI

게임 플레이 시 플레이어의 현재 HP, MP값을 HpBarUI와 MpBarUI에 출력하는 기능이다.


2.현재 체력, 마나값 출력 방법 기획의도

최초 HpBarUI, MpBarUI를 기획했을 때는 "현재값 / 최대값" 형태로 출력하려고 했으나 이 게임에서는 플레이어의 체력, 마나가 성장하지 않기 때문에 최대값의 정보가 무의미한 것 같아서 제거했다.

 

현재값이 얼마인가?가 제일 중요한 정보인 것 같다. (현재 체력이 얼마여서 죽는가 사는가? 체력을 회복해야 하는가? 도망쳐야 하는가? 현재 마나가 충분하여 스킬을 사용할 수 있는가? 아닌가? 등) 따라서 HpBarUI, MpBarUI에 해당 값의 현재값만 출력하기로 결정했다.

 


3.규칙

3.1.초기 HP, MP값 출력

  • 게임 시작 시 플레이어의 현재 체력 값을 HpBarUI의 Text에 출력한다.
  • 게임 시작 시 플레이어의 현재 마나 값을 MpBarUI의 Text에 출력한다.

 

3.2.현재 HP값 갱신

  • 게임 진행 중 HP값이 갱신될 때 HpBarUI의 Text에 현재 HP값을 출력한다.

 

3.3.현재 MP값 갱신

  • 게임 진행 중 MP값이 갱신될 때 MpBarUI의 Text에 현재 MP값을 출력한다.

4.구현 과정

1.Text 설정하기

HpBarUI의 Slider에 Text 오브젝트 생성 > Text 가운데 정렬, Bold 처리하기

MpBarUI도 HpBarUI와 동일하게 구현하면 된다.

 

 

 

2.UI Manager에 현재 HP, MP값 출력하는 기능 추가하기

    public Text healthText; //현재 HP값을 출력할 Text
    public Text manaText; //현재 MP값을 출력할 Text
    
    //현재 HP값 갱신
    public void UpdateHealthText(float newHealth)
    {
        //float을 int로 변환
        int health = (int)newHealth;
        //int를 string으로 변환
        string stringHealth = health.ToString();
        healthText.text = stringHealth;
    }

    //현재 MP값 갱신
    public void UpdateManaText(float newMana)
    {
        //float을 int로 변환
        int mana = (int)newMana;
        //int를 string으로 변환
        string stringMana = mana.ToString();
        manaText.text = stringMana;
    }

 

3.PlayerStats 스크립트의 HP, MP값 갱신할 때 현재 HP, MP Text UI 갱신 기능 추가하기

    //게임 시작 시 플레이어 체력, 마나 설정
    protected override void OnEnable()
    {
        //LivingEntity의 OnEnable() 실행(상태초기화)
        base.OnEnable();
      
        //체력 슬라이더 활성화
        playerHpbar.gameObject.SetActive(true);
        //체력 슬라이더의 최댓값을 기본 체력값으로 변경
        playerHpbar.maxValue = startingHealth;
        //체력 슬라이더의 값을 현재 체력값으로 변경
        playerHpbar.value = health;

        //현재 체력 text UI 갱신
        UIManager.instance.UpdateHealthText(health);

        //마나 슬라이더 활성화
        playerMpbar.gameObject.SetActive(true);
        //마나 슬라이더의 최댓값을 최대마나값으로 변경
        playerMpbar.maxValue = maxMana;
        //마나 슬라이더의 값을 현재 마나값으로 변경
        playerMpbar.value = mana;

        //현재 마나 text UI 갱신
        UIManager.instance.UpdateManaText(mana);
    }

    //체력 회복
    public void RestoreHealth(float newHealth)
    {
        if(dead)
        {
            //이미 사망한 경우 체력을 회복할 수 없음
            return;
        }

        playerAudioPlayer.PlayOneShot(getPotion);

        //체력 회복
        health += newHealth;

        if (health >= startingHealth)
        {
            health = startingHealth;
        }

        playerHpbar.value = health;

        //현재 체력 text UI 갱신
        UIManager.instance.UpdateHealthText(health);
    }

    //마나 회복
    public void RestoreMana(float newMana)
    {
        if (dead)
        {
            //이미 사망한 경우 마나를 회복할 수 없음
            return;
        }

        playerAudioPlayer.PlayOneShot(getPotion);

        //마나 회복
        mana += newMana;

        if (mana >= maxMana)
        {
            mana = maxMana;
        }

        //회복된 마나량을 Mpbar슬라이더에 업데이트
        playerMpbar.value = mana;

        //현재 마나 text UI 갱신
        UIManager.instance.UpdateManaText(mana);
    }


    //데미지 처리
    public override void OnDamage(float damage)
    {
        playerAudioPlayer.PlayOneShot(hitClip);
        base.OnDamage(damage);
        playerHpbar.value = health;

        //현재 체력 text UI 갱신
        UIManager.instance.UpdateHealthText(health);
    }

    public void ManaRegen()
    {
        if (mana != maxMana)
        {
            //마나는 초당 0.5씩 회복
            mana += Time.deltaTime * manaRegen;

            //마나를 회복했는데 최대 마나보다 크다면 현재마나를 최대마나량으로 변경
            if(mana > maxMana)
            {
                mana = maxMana;
            }
            //회복된 마나량을 Mpbar슬라이더에 업데이트
            playerMpbar.value = mana;

            //현재 마나 text UI 갱신
            UIManager.instance.UpdateManaText(mana);
        }
    }

    //스킬 사용 시 마나 소비
    public virtual void UseMana(float manaCost)
    {
        //소비 마나만큼 현재 마나 감소
        mana -= manaCost;

        //소비한 마나량을 Mpbar슬라이더에 업데이트
        playerMpbar.value = mana;

        //현재 마나 text UI 갱신
        UIManager.instance.UpdateManaText(mana);
    }
}

 

4.HUD Canvas의 UIManager 컴포넌트에 현재 체력값을 출력할 HpBarUI의 Text, 현재 마나값을 출력할 MpBarUI의 Text를 할당하기

 

 

 

5.현재 HP, MP값 UI 기능 완성

 

 

반응형

댓글