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

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

테크러너 2024. 4. 3.

이전편

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

 

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

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale - 밑에서 위로 올라가는 Food의 중력 설정

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

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

 

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale - 밑에서 위로 올라가는 Food의 중력 설정

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);
        }
    }
}

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale - 고양이가 Food에 맞으면 체력바 게이지 상승

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

 

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale - 고양이가 Food에 맞으면 체력바 게이지 상승

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

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

 

 

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 고양이로 바꿔주었습니다.

 

결과

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale - 고양이가 Food에 맞으면 체력바 게이지 상승

 

 

 

 

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

    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; // 왼쪽으로 이동
            }
        }
    }

 

 

결과

[Unity/2D] 체력바 게이지 상승하는 코드 작성 - UI, OnTriggerEnter2D, localScale - 위에서 밑으로 내려오던 고양이! 체력바가 다 찬 상태가 되면 옆으로 이동하기

 

 

 

 

반응형