ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UI 아이템 패널 - 물약
    연습 프로젝트/2D로그라이크 게임

     

     

    물약 버튼 클릭시 체력 회복과 쿨타임을 로직을 구현 하였습니다.

     

    간단한 흐름도를 보자면

     

    1. 물약 버튼을 클릭한다

    2. 물약의 개수가 1개 이상일때 실행한다

    3. 플레이어의 체력이 최대 체력보다 낮을때 실행한다

    4. 물약을 먹은 플레이어의 체력 값이 최대 체력보다 높으면 최대체력, 낮으면 회복값을 그대로 더해준다.

     

    스크립트를 보면서 UI와 함께 살펴 보겠습니다.

    public class ItemPotion : MonoBehaviour
    {
        [SerializeField] private TextMeshProUGUI potionQuantity;
    
        [SerializeField] private GameObject cooltime_Gameobject;
        [SerializeField] private Image cooltime_Image;
    
        private bool isCooltime = false;
        private float cooltime_Timer = 0f;
        private float cooltime_Time = 5f;
    
        private float potionHeelValue = 30.0f;
    
        private void Update()
        {
            if (isCooltime == true)
            {
                cooltime_Timer += Time.deltaTime;
    
                cooltime_Gameobject.SetActive(true);
                cooltime_Image.fillAmount = 1 - (cooltime_Timer / cooltime_Time);
                while (cooltime_Timer > cooltime_Time)
                {
                    cooltime_Timer = 0;
    
                    cooltime_Gameobject.SetActive(false);
                    cooltime_Image.fillAmount = 1;
    
                    isCooltime = false;
                }
            }
        }
    
        public void OnClickEventUsePotion()
        {
            float playerMaxHp = Manager.Instance.playerInfomations.playerHpMax;
            float playerHp = Manager.Instance.playerInfomations.playerHp;
    
            if (isCooltime == false)
            {
                if (int.Parse(potionQuantity.text) > 0)
                {
                    if (playerHp < playerMaxHp)
                    {
                        potionQuantity.text = (int.Parse(potionQuantity.text) - 1).ToString();
                        if (playerHp + potionHeelValue >= playerMaxHp)
                        {
                            Manager.Instance.playerInfomations.playerHp = playerMaxHp;
                        }
                        else
                        {
                            Manager.Instance.playerInfomations.playerHp += potionHeelValue;
                        }
                        isCooltime = true;
                    }
                    else return;
                }
            }
        }
    }

    ItemPotion의 새로운 스크립트를 생성해 주었습니다.

     

    [SerializeFieldprivate TextMeshProUGUI potionQuantity;

    포션 수량을 나타내어 줄 텍스트 입니다.

    [SerializeFieldprivate GameObject cooltime_Gameobject;

    쿨타임 이미지를 표시할 오브젝트 입니다.


    [SerializeFieldprivate Image cooltime_Image;

    쿨타임 이미지를 표시할 오브젝트의 인스펙터 속성을 가져오기 위해 미리 캐싱하였습니다.

    private bool isCooltime = false;

    공격 중인지 판단할 불 변수 입니다.


    private float cooltime_Timer = 0f;

    스톱워치가 될 타이머 입니다.


    private float cooltime_Time = 5f;

    타이머가 멈출 설정된 시간 입니다.

    private float potionHeelValue = 30.0f;

    포션을 먹으면 회복될 값 입니다.

     

    public void OnClickEventUsePotion()
    {
        float playerMaxHp = Manager.Instance.playerInfomations.playerHpMax;
        float playerHp = Manager.Instance.playerInfomations.playerHp;
    
        if (isCooltime == false)
        {
            if (int.Parse(potionQuantity.text) > 0)
            {
                if (playerHp < playerMaxHp)
                {
                    potionQuantity.text = (int.Parse(potionQuantity.text) - 1).ToString();
                    if (playerHp + potionHeelValue >= playerMaxHp)
                    {
                        Manager.Instance.playerInfomations.playerHp = playerMaxHp;
                    }
                    else
                    {
                        Manager.Instance.playerInfomations.playerHp += potionHeelValue;
                    }
                    isCooltime = true;
                }
                else return;
            }
        }
    }

     

    포션 버튼을 클릭하면 실행될 이벤트 함수 입니다.

     

    (버튼의 원 클릭 함수)

     

    로직은 위에 말한 흐름도와 동일합니다.

     

    특이 사항은 없지만 Manager 스크립트 > playerInfomations 스크립트의 체력, 최대체력에 매번 접근 하기에는 비효율 적이여서 함수 내에 float 변수로 체력과 최대 체력을 받아와 주었습니다.

     

    이 후 타이머가 지정된 시간값이 되어 isCoolimtetrue가 되면

     

    private void Update()
    {
        if (isCooltime == true)
        {
            cooltime_Timer += Time.deltaTime;
    
            cooltime_Gameobject.SetActive(true);
            cooltime_Image.fillAmount = 1 - (cooltime_Timer / cooltime_Time);
            while (cooltime_Timer > cooltime_Time)
            {
                cooltime_Timer = 0;
    
                cooltime_Gameobject.SetActive(false);
                cooltime_Image.fillAmount = 1;
    
                isCooltime = false;
            }
        }
    }

    Update문 에서 로직이 실행 됩니다.

     

    타이머에 DeltiaTime을 더해 주어 매 프레임 사이의 값을 더해 주었고

     

    쿨타임을 나타낼 ImagefillAmount 속성은 반대로 비례해서 감소를 시켜 주었습니다.

     

    * fillAmount 의 속성은 0에서 1 사이의 숫자를 받습니다.

    * fillAmount 의 속성은 Image TypeFilled로 설정하면 나타납니다.

     

    초기에는 쿨타임을 표시할 이미지는 비활성화 이므로, 활성화 된 후 쿨타임 로직 및 시각화 시간이 끝나면 원래대로 비활성화상태가 됩니다.

     

    fillAmount 속성 1
    fillAmount   속성 0.5
    fillAmount   속성 0

     

    다음은 공격과 대쉬를 버튼 클릭후 실행으로 변경과, 스킬 부분을 살펴 보겠습니다.

     

    감사합니다.

    '연습 프로젝트 > 2D로그라이크 게임' 카테고리의 다른 글

    UI 공격 & 대쉬 버튼  (0) 2024.06.09
    UI 정보 패널 & 미니맵  (0) 2024.06.08
    UI 기획 (1차)  (0) 2024.06.08
    몬스터 상태 구현 (Update)  (0) 2024.06.08
    몬스터 상태 구현  (0) 2024.06.07

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net