내일배움캠프 - TIL/내일배움캠프 - TIL

내일배움캠프 14일차 - Flappy Plane 구현 해보기

rudals4469 2025. 4. 29. 21:23

오늘은 새로운 주차가 시작 되는 주이다. 이번 주는 다시 유니티 기초로 돌아와서 기초 게임을 만들어 보는 시간이었다.

 

그 중 새롭게 배우거나 신기하거나 중요하다고 생각하는 내용을 몇가지 주절주절 써내려 보겠다.

 

가장 먼저 라이프사이클

 

Unity에서 라이프사이클(Lifecycle)은 게임 오브젝트와 스크립트가 실행되는 순서를 정의합니다.

  • 주요 단계
    • Awake: 스크립트가 활성화될 때 호출. 초기화 작업에 사용
    • Start: 오브젝트가 활성화되고 첫 프레임 전에 한 번 호출
    • Update: 매 프레임마다 호출. 주로 입력 처리와 게임 로직에 사용
    • FixedUpdate: 물리 연산이 필요할 때 일정한 간격으로 호출
    • LateUpdate: Update가 완료된 후 호출. 카메라 추적 등에 사용
  • 중요성
  • 각 단계가 명확히 구분되어 있어, 적절한 함수에 코드를 배치하면 효율적인 게임 로직을 구현 가능

그 다음은 충돌처리 함수

 

충돌 처리 함수

Unity에서 충돌 처리는 ColliderRigidbody를 통해 구현됩니다.

  • 주요 함수
    • OnCollisionEnter: 충돌 시작 시 호출
    • OnCollisionStay: 충돌이 유지되는 동안 호출
    • OnCollisionExit: 충돌이 끝났을 때 호출
    • OnTriggerEnter/Stay/Exit: Trigger Collider와의 상호작용을 처리

충돌에 가장 중요한 3요소는 충돌할 물체 콜라이더, 리지드바디 그리고 충돌당할 물체의 콜라이더라고 생각한다.

 

그 뒤로는 어느정도 아는 내용이라 쭉쭉 넘어 갔는데, 장애물을 생성하는 부분과 반복 생성하는 로직이 되게 신기하고 깔끔하게 잘 짜져있던 것 같아서 다시 한 번 볼려고 한다.

 

public class BgLooper : MonoBehaviour
{
    public int numBgCount = 5;
    
    public int obstacleCount = 0;
    public Vector3 obstacleLastPosition  = Vector3.zero;
    
    void Start()
    {
        Obstacle[] obstacles = GameObject.FindObjectsOfType<Obstacle>();
        obstacleLastPosition = obstacles[0].transform.position;
        obstacleCount = obstacles.Length;
        
        for(int i = 0; i < obstacleCount; i++)
        {
            obstacleLastPosition = obstacles[i].SetRandomPlace(obstacleLastPosition, obstacleCount);
        }
    }

    public void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("Triggered: " + collision.name);
        
        if (collision.CompareTag("BackGround"))
        {
            float widthOfBgObject = ((BoxCollider2D)collision).size.x;
            Vector3 pos = collision.transform.position;

            pos.x += widthOfBgObject * numBgCount;
            collision.transform.position = pos;
            return;
        }
        
        Obstacle obstacle = collision.GetComponent<Obstacle>();
        if (obstacle)
        {
            obstacleLastPosition = obstacle.SetRandomPlace(obstacleLastPosition, obstacleCount);
        }
    }
}

 

대충 처음 생성된 10개의 장애물을 SetRandomPlace를 통해 통과할 수 있는 범위를 조절해서 가져와서 for문을 돌려 각 각의 위치를 정해준다. 그 뒤 카메라 뒤에 따라오는 지우개(?)에 장애물이 부딪히면 마지막에 생성된 장애물 뒤에 다시 생성되는 로직이다.

한번씩 무한정 그려지는 맵의 로직을 사용하는 게임들을 봤을 때 어떻게 구현하는 건지 생각해본적이있었는데 

아마 이렇게 위치를 다시 재조정해주는 로직을 사용하는 것이 정답일 것 같은 생각이 든다. 

찾아보니 한 때 재밌게 했던 뱀파이어 서바이벌이라는 게임도 이런식으로 맵을 구현한 것이라고 한다.

 

그리고 마지막으로 빌드하는 법을 전혀 모르고있었는데 이번 기회에 한 번 간단하게 라도 배워보았다.

 

빌드 과정

  1. File > Build Settings 클릭
  2. PC, Mac & Linux Standalone 선택 후 Switch Platform 클릭
  3. 설정 완료 후 Build 버튼 클릭 → .exe 파일 생성

Player Settings (기초 설정)

  • Resolution and Presentation
    • Default Is Fullscreen: 창 모드/전체 화면 설정
    • Default Screen Width/Height: 기본 해상도 설정 (예: 1920x1080)
  • Other Settings
    • Product Name: 게임 이름 입력
    • Company Name: 제작자 이름 입력
  • Icon
    • 게임 실행 파일의 아이콘 이미지 추가 가능

생각보다 그리 어렵진 않아서 이걸 못했다고? 라고 생각이 들 정도였다. 고려해야 될 정은 플랫폼 마다 쪼금식 다른 설정들을 만져주는 것이었다. 피씨 버전, 안드로이드 버전, 웹 버전 각 각 조금 씩 다른 설정 방법이 있어 빌드 할 때 각 각의 플랫폼 빌드 법을 찾아보면 할 수 있을 것 같다.