게임 기획/내일배움캠프(개발)

[TIL] 고양이 밥 주기 게임

선조미 2025. 4. 10. 21:02
프로젝트 시작에 앞서서 아직도 완벽히 이해가 안 가는 각 코드별 기능들을 공부했다. 
계속 헷갈리거나 모르는 것들이 생기겠지만 일단 당장 알아보고 정리한 것들 위주로 적어두겠다. 

- 자료형 변수이름 = ;
  bool isFull = false;

- 함수 = 메소드
  접근제한자 반환형 함수이름(매개변수) { 실행할 코드 }
  private void Start( ) {,,,}
키워드 설명
void 아무것도 반환하지 않음
private 자기 클래스 안에서만 사용 가능
다만 [SerializeField]를 앞에 붙여 사용하면 Inspector창에서 확인 가능
public 다른 클래스에서도 호출 가능

함수이름 실행순서 설명
Awake() 게임 시작 직전 변수 초기화에 적합
Start() 게임 시작 시 1번 실행 오브젝트 활성화 이후 실행 됨
Update() 매 프레임 실행 이동, 반복 검사 등
OnCollisionEnter2D
OnTriggerEnter2D
충돌 발생 시 실행 충돌 반응 처리용

Background를 Object 추가가 아닌 카메라 설정에서 바꿀 수 있다.

 

Rigidbody의 Body Type을 변경해주면 중력의 영향을 받지 않게 해준다.

탄알이랑 오브젝트가 겹쳐질 때 중력의 영향으로 탄알이 떨어지는 것을 방지해준다.

(나의 경우 탄알이 오브젝트 사이에 끼어서 같이 이동했는데 바디타입 변경 후 해결 됨)

 

대신 이 경우 OnCollisionEnter2D는 사용할 수 없다. OnTriggerEnter2D(Collider2D collision) 을 사용해주면 된다.

 

선생님 따라서 만들었는데 갑자기 오브젝트 2개가 겹쳐서 나타나는 오류가 생겼다. 
Prefabs에 적용한 이후부터 생긴 오류라 어떻게 해결할지 고민하다가 새로운 bool 함수를 이용해 해결했다.
(&&은 '그리고' 라는 뜻)
bool isFull = false; // 아직 고양이가 배부른 상태가 아닐 때 

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.CompareTag("Food") && !isFull) 
    // 충돌한 오브젝트가 Food이고 아직 isFool이 false일 때 실행 => 이미 배부른 상태일 땐 Food에 반응하지 않음 => 중복으로 바뀌는 것 차단
    {
        if (energy < full) // 아직 에너지가 다 안 찼을 때
        {
            energy += 1.0f; // 에너지 1만큼 증가
            front.localScale = new Vector3(energy / full, 1.0f, 1.0f); // hp바의 길이를 현재 퍼센트 비율로 줄임
            Destroy(collision.gameObject); // 부딪힌 밥을 씬에서 제거
        }

        if (energy >= full) // 만약 에너지가 다 찼다면
        {
            isFull = true;  // 고양이가 더 이상 밥에 반응하지 않게 상태를 변경 => 한 번만 발동하게 막음
            hungryCat.SetActive(false); // hungryCat 오브젝트 비활성화
            fullCat.SetActive(true); // fullCat 오브젝트 활성화
        }
    }
}​

이렇게 써서 해결완료

if (transform.position.y < -16.0f)
{
    GameManager.Instance.GameOver();
}​

 

그리고 고양이가 바닥에 닿았을 때 리트라이 되도록 하는 함수를 OnTrigger2D 문에 작성해서 실행 안 되는 오류 발생.
OnTrigger2D는 충돌 순간에만 실행되는거고 Update는 프레임별로 실행이니까 위치처럼 지속적인 상태 체크가 필요할 땐 Update문에 쓰는 습관을 들여야겠다.