이전편
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; // 왼쪽으로 이동
}
}
}
결과
'스파르타 게임개발종합반(Unity) > 사전캠프 공부 기록' 카테고리의 다른 글
[Unity] Prefabs 확률로 생성하기, 게임 규칙 추가하기 (0) | 2024.04.04 |
---|---|
[Unity/2D] 레벨 시스템 구현 - UI, text, ToString, localScale (0) | 2024.04.04 |
[Unity] Prefab을 Hirarchy창에서 변경했을 때 기존 Prefab에도 변경사항 적용하는 법 (0) | 2024.04.03 |
[Unity] 밑에서 위로 올라가는 물체의 중력 - Rigidbody, Dynamic, Kinematic 차이 (0) | 2024.04.03 |
[Unity/2D] 체력바 만들기 - Canvas, UI, Anchors (0) | 2024.04.03 |
댓글