유니티 코루틴을 이용한 버프 디버프

2020. 6. 15. 21:27유니티실습

반응형
728x170

안녕하세요 유니티 비기너입니다.

이번 시간에는 Coroutine을 사용하여 버프, 디버프를 처리하는 하나의 방법에 대해 알아보겠습니다.

 

결과 화면

 

한 번에 보기

1. Canvas Slider 컴포넌트를 포함하는 오브젝트 생성

2. Canvas RenderMode를 world Space로 변경 
   
3. Canvas RectTransform scale을 낮추고 Player오브젝트 하위로 오브젝트 이동

4. HealthBar 스크립트 작성

5. UI 버튼 생성, 명칭 변경

6. 버프 아이콘을 표현 할 오브젝트 생성 및 비활성화 

7. Player 스크립트 작성

 

1. Canvas Slider 컴포넌트를 포함하는 오브젝트 생성

Object 구성

Health Bar : Slider 컴포넌트가 포함되는 오브젝트입니다.

Fill : 체력의 색상을 나타내는 오브젝트입니다.

Border : 체력바의 테두리를 나타내는 오브젝트입니다.

 

스크립트를 통해 Slider의 Value값을 조절하여 체력 게이지를 제어합니다.

 

 

2. Canvas RenderMode를 world Space로 변경 

UI를 월드공간에서 표시합니다.


3. Canvas RectTransform scale을 낮추고 Player오브젝트 하위로 오브젝트 이동

Scale을 낮추고, posX, posY를 0으로 맞춘 뒤에 적절한 위치에 재배치합니다.


4. HealthBar 스크립트 작성

public class HealthBar : MonoBehaviour
{
    public Slider slider;

    public void SetMaxHealth(int health) {
        slider.maxValue = health;
        slider.value = health;
    }

    public void SetHealth(int health) {
        slider.value = health;
    }
}

SetMaxHelath 함수로 초기 체력값을 세팅하고 변화되는 체력을 SetHelath를 통해 갱신합니다.


5. UI 버튼 생성, 명칭 변경

플레이어에게 상태를 부여 할 버튼들을 생성합니다.


6. 버프 아이콘을 표현 할 오브젝트 생성 및 비활성화 

지속 중인 버프, 디버프를 나타낼 이미지를 포함하는 오브젝트를 생성하고 비활성화합니다.

※ 스크립트에서 활성 / 비활성 처리


7. Player 스크립트 작성

public class Player : MonoBehaviour {

    public HealthBar healthbar;
    public GameObject[] buffIcons;
    public int currentHealth;
    public int maxHealth = 100;
    private bool[] buffAt = { false, false, false };

    void Awake() {
        currentHealth = maxHealth;
        healthbar.SetMaxHealth(maxHealth);
    }

    public void TakeBuff(string name) {
        switch (name) {
            case "Poison":
                if(!buffAt[0]) { StartCoroutine(OnBuffCoroutine("Subtraction", 5, 5, 0)); }
                break;
            case "Bleeding":
                if (!buffAt[1]) { StartCoroutine(OnBuffCoroutine("Subtraction", 3, 10, 1)); }
                break;
            case "Recovery":
                if (!buffAt[2]) { StartCoroutine(OnBuffCoroutine("Addition", 5, 5, 2)); }
                break;
        }
    }

    IEnumerator OnBuffCoroutine(string operation, int time, int damage, int index) {

        buffAt[index] = true;
        buffIcons[index].SetActive(true);

        while (time > 0) {
            if (operation == "Addition") {
                currentHealth += damage;
            } else if (operation == "Subtraction") {
                currentHealth -= damage;
            }

            healthbar.SetHealth(currentHealth);
            time--;
            yield return new WaitForSeconds(1);
        }

        buffAt[index] = false;
        buffIcons[index].SetActive(false);
    }    
}

버프를 선택한 버튼에 따라 분기 처리하였으며 Coroutine을 활용하여 해당 버프를 지속시키는 코드입니다.

버프 아이콘은 해당 버프가 지속되는동안 나타나며 지속시간이 종료될 경우 비활성화됩니다.

 

해당 버프처리 방식은 한 가지 사례일 뿐 다양한 방법으로 처리가 가능합니다.

다음은 좀 더 좋은 정보로 찾아뵙겠습니다.

감사합니다.

 

반응형
그리드형