스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale

테크러너 2024. 4. 3.

이전편

2024.04.03 - [Unity/2D] - [Unity/2D] 체력바 만들기 - Canvas, UI, Anchors

 

밑에서 위로 올라가는 Food의 중력 설정

Food에 Rigidbody의 타입을 Dynamic에서 'Kinematic'으로 바꿨습니다.

또한, 콜라이더에 'is Trigger'를 체크 해주었습니다.

 

NormalCat의 콜라이더에도 'is Trigger'를 체크해주었습니다.

 

그러면 OnTriggerEnter2D 이벤트 함수를 사용해야겠죠?

이유는 아래 게시글을 참고해주세요.

2024.04.03 - [Unity/2D] - [Unity/2D] 밑에서 위로 올라가는 물체의 중력 - Rigidbody, Dynamic, Kinematic 차이

 

 

 

고양이가 Food에 맞으면 체력바 게이지 상승

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cat : MonoBehaviour
{
    public RectTransform front;

    float full = 5.0f;    // 최대 체력
    float energy = 0.0f;  // 현재 체력

    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60; // 나중에 GameManager로 옮겨야함
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += Vector3.down * 0.05f;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Food"))
        {
            // 체력바 게이지 상승
            energy += 1.0f;
            front.localScale = new Vector3(energy / full, 1.0f, 1.0f); // 현재 체력을 최대 체력으로 나누어서 비율을 계산

            // 고양이에게 맞은 Food는 파괴
            Destroy(collision.gameObject);
        }
    }
}

위와 같이 코드를 작성해주면 체력바 게이지가 상승하는 것을 볼 수 있는데요.

 

문제는 체력바의 크기를 벗어나는 것입니다.

이를 해결하기 위해서 코드를 수정해야 합니다.

 

 

Application.targetFrameRate = 60; 가 뭔지 궁금하다면?

2024.03.28 - [Unity/2D] - [Unity/2D] 캐릭터 이동하기, 초당 프레임 설정 - Application.targetFrameRate

 

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Food"))
        {
            if(energy < full) // 현재 체력 < 전체 체력
            {
                // 체력바 게이지 상승
                energy += 1.0f;
                front.localScale = new Vector3(energy / full, 1.0f, 1.0f); // 현재 체력을 최대 체력으로 나누어서 비율을 계산

                // 고양이에게 맞은 Food는 파괴
                Destroy(collision.gameObject);

                // 게이지가 다 차고 바로 fullCat으로 바뀌게 하기 위해서 여기에 코드 작성
                if (energy == 5.0f) // 체력바가 다 찬 상태
                {    
                    hungryCat.SetActive(false);
                    fullCat.SetActive(true);
                }
            }
        }
    }

현재 체력이 전체 체력보다 작을 때만 체력바 게이지가 상승하도록 구현했습니다.

또한, 체력바가 다 찼을 때 Hungry에서 Full 고양이로 바꿔주었습니다.

 

결과

 

 

 

 

위에서 밑으로 내려오던 고양이! 체력바가 다 찬 상태가 되면 옆으로 이동하기

    void Update()
    {
        if(energy < full) // 현재 체력 < 전체 체력일 때 아래로 내려가기
        {
            transform.position += Vector3.down * 0.05f;
        }
        else  // 체력바가 다 찬 상태일 때 옆으로 이동하기(왼쪽일 땐 왼쪽으로, 오른쪽일 땐 오른쪽으로 이동)
        {
            // 중앙 기준으로 오른쪽에 있을 때
            if(transform.position.x > 0)
            {
                transform.position += Vector3.right * 0.05f; // 오른쪽으로 이동
            }
            else // x가 0이거나 x(중앙)보다 작을 때
            {
                transform.position += Vector3.left * 0.05f; // 왼쪽으로 이동
            }
        }
    }

 

 

결과

 

 

 

 

반응형

댓글