Unity/Unity Study

[Unity] 3D Surviver 팀 프로젝트 중, 상태(Stat) UI

JEE_YA 2025. 3. 20. 20:39

 

UI 담당은 아니었으나 적용되는 원리에 대해 공부도 할겸 Stat 손대는김에 같이 작성했었다.

중간에 이상한곳에 적용하기도 했고 쌩뚱맞게 다른방법도 시도해보고 했었는데 정신없는 나머지 어떤식으로 했었는지 기록하지는 못했다......(ノへ ̄、)

 

using UnityEngine;
using UnityEngine.UI;

public class ConditionUI : MonoBehaviour
{
    public PlayerCondition playerCondition;

    public Image _Health;
    public Image _Hunger;
    public Image _Stamina;
    public Image _Moisture;

    public string conditionType;

    private void Update()
    {
        if (playerCondition == null)
        {
            playerCondition = GetComponentInParent<PlayerCondition>();
        }

        if (_Health != null)
            _Health.fillAmount = SafeDivide(playerCondition.curHealth, playerCondition.maxHealth);
        if (_Hunger != null)
            _Hunger.fillAmount = SafeDivide(playerCondition.curHunger, playerCondition.maxHunger);
        if (_Stamina != null)
            _Stamina.fillAmount = SafeDivide(playerCondition.curStamina, playerCondition.maxStamina);
        if (_Moisture != null)
            _Moisture.fillAmount = SafeDivide(playerCondition.curMoisture, playerCondition.maxMoisture);
    }

    private float SafeDivide(float numerator, float denominator)
    {
        if (denominator == 0)
        {
            return 0f;
        }
        return Mathf.Clamp01(numerator / denominator); 
    }
}

PlayerCondition의 Cur 값을 이용해 이미지의 FillAmount를 변경하여 게이지 바가 줄어들도록 했다.

SafeDivide라는 메서드를 작성하여 두 숫자를 나누는 작업을 처리했으며, 이 메서드는 FillAmount의 값을 0에서 1 사이의 숫자로 변환하여 게이지 바의 비율을 조절하기 위해 사용했다.

이렇게 각 상태(Stat)의 값이 변화할 때마다 UI의 게이지가 지속적으로 업데이트 되도록 했다.

 

각 스탯의 이미지가 묶여있는 오브젝트에 ConditionUI 스크립트를 적용해주고 각 이미지를 넣어서 적용해주면 정상적으로 작동!