본문 바로가기
TIL

Flappy Plane 만들며 기초 다지기

by vvin39 2025. 4. 29.

내일배움캠프 17일차 TIL

📌 Flappy Plane 만들며 기초 다지기

오늘부터 Unity 학습을 다시 시작했다. 입문 강의를 따라 Flappy Bird를 모티브로 한 Flappy Plane 게임을 만들며 Unity의 기본 개념과 구조를 복습했다. 처음엔 단순히 따라 만드는 느낌이었지만, 하나하나 다시 정리해보니 잊고 있던 중요한 개념들이 많았다.

 

Rigidbody, 충돌, 입력 - Flappy Plane의 핵심 구성 요소

게임의 기본 구조는 플레이어 오브젝트(비행기)가 중력의 영향을 받아 아래로 떨어지고, 스페이스 키 입력 시 위로 점프하며 장애물을 피하는 것이다. 이를 구현하기 위해 다음 요소들을 사용했다

  • Rigidbody 컴포넌트: 중력 적용을 위해 필수. Rigidbody를 추가하면 오브젝트가 물리 엔진의 영향을 받는다. 예를 들어, 아무 것도 하지 않아도 아래로 떨어지게 된다.
  • Input 클래스: Input.GetKeyDown(KeyCode.Space)를 통해 스페이스 키 입력을 감지하고, Input.GetMouseButtonDown(0)으로 마우스 클릭을 확인하여 입력을 처리
  • 충돌 처리: 장애물와의 충돌은 OnCollisionEnter2D에서 처리하도록 설계

 

Unity 스크립트의 라이프사이클

스크립트의 실행 순서를 다시 복습하면서 어떤 코드가 어디에 들어가야 효율적인 게임 로직 구현이 가능한가에 대해 고민해봐야겠다고 생각했다.

  • Awake(): 가장 먼저 호출되며, 게임 오브젝트의 비활성 상태에서도 실행된다. 스크립트 간 의존 관계 설정에 유용
  • Start(): 오브젝트가 활성화되면서 한 번 실행. 초기값 설정용으로 적절
  • Update(): 프레임마다 호출. 사용자 입력 및 비프레임 연산 처리
  • FixedUpdate(): 물리 계산 전용. Rigidbody를 제어할 땐 반드시 여기서 처리해야 정확하고 안정적인 물리 동작이 가능하다.
  • LateUpdate(): Update가 끝난 후 호출. 카메라 추적 같은 후처리에 사용

 

GetComponent로 컴포넌트 접근

GetComponent<Rigidbody>()를 통해 Rigidbody를 가져와 점프 시 힘을 적용할 수 있었다. 다만 매 프레임마다 호출하지 않도록 Start()에서 한 번만 받아두는 게 성능상 더 좋다는 점도 함께 배웠다. Update() 안에서 GetComponent를 사용하는 예시가 있었지만, 이건 잘못된 습관이라는 걸 알게 됐다.

 

Input과 Time.deltaTime의 관계

입력 처리 시 Time.deltaTime은 필수였다. 예를 들어, 비행기의 위치를 transform.Translate(Vector3.up * speed * Time.deltaTime) 식으로 움직이면, 프레임에 따라 이동 거리가 달라지지 않고 항상 일정한 속도로 움직이게 된다. Unity는 프레임 속도가 변할 수 있기 때문에 이 보정은 필수!

 

로컬 좌표 vs 월드 좌표

Unity에서 로컬 좌표(Local Position)와 월드 좌표(World Position)는 오브젝트의 위치를 측정하는 기준이다. 플레이어가 자식 오브젝트로 묶여 있다면, 로컬 좌표 기준으로 위치가 결정되고, 그 외에는 월드 좌표 기준으로 판단된다. 실제 게임에서 카메라나 UI 배치 시 중요한 요소라 추후 더 다뤄봐야 할 주제.

 

로컬 좌표(Local Position)

  • 부모 오브젝트를 기준으로 한 오브젝트의 위치
  • 오브젝트가 부모 오브젝트 내에서 얼마나 떨어져 있는지를 나타낸다
  • 부모 오브젝트의 위치나 회전이 변경되면, 로컬 좌표가 반영되어 상대적인 위치를 유지

월드 좌표(World Position)

  • 게임의 전체 월드(전역 공간)에서의 위치
  • 부모 오브젝트와 관계없이, Unity의 전역 좌표계(0, 0, 0)를 기준으로 계산

 

프리팹(Prefab)의 활용

장애물을 프리팹으로 만들어 반복적으로 등장시킬 수 있도록 설계했다. 하나의 장애물 오브젝트를 Prefab으로 저장해 두면, 동일한 구조의 파이프를 여러 개 생성하거나 위치만 다르게 해서 배치할 수 있다.

 

싱글턴 패턴

GameManager와 같은 클래스는 싱글턴 패턴으로 관리할 수 있다. Unity에서는 public static Instance 방식을 통해 어디서든 접근 가능한 전역 객체를 만들 수 있고, 이를 통해 게임 상태나 점수, 씬 이동 등을 통합 관리할 수 있다. static은 클래스 단위로 메모리를 공유하므로, 인스턴스가 하나만 유지되도록 보장한다. 싱글턴 패턴을 사용함으로써 데이터와 객체를 일관되게 공유할 수 있고 메모리 낭비를 방지하며 관리가 용이하지만, 전역상태로 인해 코드 테스트와 유지보수가 어렵고 의존성이 강해지면 코드 확장성이 떨어질 수 있다.

 

💡 느낀 점

오랜만에 Unity를 다시 만지다 보니 기본적인 개념들이 생각보다 많이 까먹었음을 느꼈다. 그러나 다시 하나씩 정리하며 따라가니  머릿속이 정리되는 느낌이 들었다. 특히 FixedUpdate, Rigidbody, Time.deltaTime 같은 물리 연산 관련 개념은 처음부터 정확히 이해하고 써야 한다는 것을 이번에 확실히 체감했다. 앞으로도 강의 열심히 따라가며 간단한 클론 게임을 만들면서 기초 개념을 더 단단하게 다져야겠다.

 

✅  배운 개념 요약

개념 
설명  활용 예시
Rigidbody 오브젝트에 물리 효과 적용 (중력, 힘, 충돌 등) 캐릭터가 바닥으로 떨어짐
라이프사이클 함수 Awake, Start, Update, FixedUpdate, LateUpdate 등 초기화, 물리 계산, 입력 처리
GetComponent 오브젝트에 붙은 컴포넌트 참조 Rigidbody 가져와서 점프 구현
Input 클래스 키보드/마우스 입력 처리 Space 키 누르면 점프
Time.deltaTime 프레임 간 시간 보정 속도 * deltaTime 으로 부드러운 이동
충돌 처리 함수 OnCollisionEnter, OnTriggerEnter 등 벽과 부딪히면 게임 오버
로컬/월드 좌표 위치 기준이 부모인지, 전체인지에 따라 다름 캐릭터 이동, 카메라 위치 조절
public 변수 인스펙터 창에서 조정 가능 점프 힘 조절 변수 등
프리팹(Prefab) 재사용 가능한 오브젝트 템플릿 파이프, 플레이어 복제 등
싱글턴 패턴 인스턴스 하나만 유지하는 디자인 패턴 GameManager 구현 등

 

 

 

최근댓글

최근글

skin by © 2024 ttuttak