프로그래밍 농장

유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 6주차 학습 일지 본문

STARTERS

유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 6주차 학습 일지

Tennessee201 2022. 7. 31.
728x90

6주차에는 지난주차에 이어서 실질적인 유니티 엔진의 활용과 응용에 대하여 학습하였다.

 

이번주는 크게 유니티엔진의 생명주기(Monobehavior LifeCycle)와 유니티에서의 클래스형식과 구조에 대하여 학습하였다. 그리고 유니티 최적화에 대한 다양한 방식, 소프트웨어 디자인 패턴중 하나이자 유니티엔진 사용시 가장 보편적으로 쓰이는 싱글톤패턴, 그리고 이와 static 사용에 대한 차이점을 공부하였다.

그리고 추가적으로 지금까지 학습한 내용을 기반으로 오브젝트 풀링을 이용하여 '쿠키런' 타입의 프로토타입을 개발하는것과 싱글톤패턴을 활용한 과제 두가지를 진행하였다. 

 


- Monobehavior LifeCycle (생명주기)

 

기본적으로 유니티엔진의 생명주기는 아래와 같은 구조이다. 

Monobehavior Lifecycle

위와 같이 유니티는 기본적으로 사용자가 호출하지 않더라도 호출되는 함수들이 존재한다. 그 함수들의 호출 주기를 유니티 생명주기라고 한다. 함수들의 호출시기는 사용자가 정할 수 없으므로 생명주기에 대한 이해는 유니티를 다루는데 필수적이다. 위 그림은 유니티 생명주기에서 가장 중요한 부분들의 흐름도이다.

클래스 생성시 기본적으로 존재하는 Start()와  Update()와는 별개로 Fixed update()의 경우 정해진 deltaTime에 맞추어 움직이며, 이는 통상적으로 0.02f 를 기준으로 잡는다 . Fixed Update()는 Animator이 FSM(유한상태)로 존재하며 이는 애니메이션은 전체 유니티 흐름(시간체계)와 별도의 시간체계를 가지고 있기 때문에 일반적으로 세부화된 물리 작업을 수행할때 주로 수행되는 단계이다.

 


Reset : 오브젝트를 생성 후 인스펙터 뷰에서 리셋을 눌러줄 때 실행됩니다. 객체의 속성을 초기 값으로 설정해 줄 때 사용합니다.

Awake : 스크립트가 실행될 때 한번만 호출됩니다. 모든 오브젝트가 초기화 된 후 호출되기 때문에 GameObject.Find 같은 명령문을 안전하게 사용할 수 있습니다. Awake 함수는 언제나 Start 함수 전에 호출되므로 초기화 순서를 정할 수 있게 합니다. (Coroutine 사용 불가)

OnEnable : 인스펙터뷰에서 체크를 통해서 게임 오브젝트를 활성화 할 때 사용됩니다. 활성화 할 때마다 호출 됩니다.

Start : Update 함수가 호출되기 전에 한번만 호출됩니다. 다른 스크립트의 모든 Awake가 모두 실행된 이후에 실행됩니다. 스크립트가 활성화 되어 있어야합니다.

FixedUpdate : 주로 물리 엔진을 사용하는 경우 일정 시간 간격으로 힘을 가할 때 사용하는 함수입니다. 발생 주기가 일정합니다. (Default : 0.02초)

Update : 프레임마다 호출되는 함수로 게임의 핵심 로직에 사용됩니다. 스크립트가 활성화 되있어야 사용 가능하고, 주기가 일정하지 않습니다.

LateUpdate : 모든 Update 함수가 실행되고 나서 호출됩니다. 주로 카메라 이동 로직에 사용합니다.

OnDisable : 게임 오브젝트 또는 스크립트가 비 활성화 되었을 때 호출됩니다. (Coroutine 사용 불가)

OnDestroy : 오브젝트 생존기간의 마지막 프레임이 업데이트 된 후 실행됩니다. (Object.Destroy 또는 씬 종료 시)

OnApplicationQuit : 응용프로그램 종료 전에 모든 오브젝트에서 호출됩니다. 에디터에서는 플레이 모드를 중지하면 나타납니다.

 

 


- 싱글톤 & Static 에 대한 정리 

 

소프트웨어 프로그래밍을 구현할때 사용되는 여러 디자인패턴중 싱클톤패턴은 유니티에서도 물론 사용된다. 

기본적으로 싱글톤 패턴이란, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고, 최초 생성이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 방식이다. 

이 말인 즉슨, 프로젝트 전체에서 오직 하나의 객체만을 생성할 수 있는 클래스를 뜻하며, 이는 곧 객체의 유일성을 보장할 수 있는 디자인 패턴이라는 뜻이다.

 

그렇다면 왜 이와 같은 패턴을 사용하는것일까?

-> 이유는 간단하다. 유니티 게임을 예로 들어보자. 게임을 진행하며 플레이어가 획득하는 포인트(점수) 에 대한 객체는 프로젝트내에서 오직 하나뿐이어야한다. 만약 이 객체에 대한 생성과 선언이 이곳저곳에서 중구난방으로 관리되고 이루어진다면, 가장 중요하고 유일한 값에 영향을 미칠수있을것이다. 

유니티의 경우, 이러한 싱글톤 패턴을 사용한 '싱클톤 클래스'를 'GameManager'라는 특전의 클래스를 별도로 임의지정하여 프로그래머들이 구별이 쉽도록 배려한 것도 확인할수있다.

그렇다면 이쯤에서 의문이 하나 생길수있다.

Static이라는 정적방식을 이용하여 특정 함수나 변수값들을 선언해놓고 참조하여 사용하면 될텐데 굳이 싱글톤클래스라고 지정하여 구현하는 이유가 무엇일까?

-> 1. Statice 함수의 한계가 존재하기때문이다.  : Static 함수 내에서 쓰이는 변수들의 값이 고정되어있다는 문제가 있다.

-> 2. Static 클래스는 (유니티의 경우) -> 오브젝트에 component를 붙히려면 Monobehavior를 클래스가 상속받아야하는데 이를 붙히게 되면 에러가 발생한다.

 

그렇다면 어떠한 Manager들이 주로 사용될까?

-> NetworkManager 

-> GameManager

->AudioManager 

.

.


과제.1  CookieRun 타입의 미니게임 구현 

 

첫번째 과제는 쿠키런 타입의 미니게임을 구현하는것이었다. 과제의 조건은 아래와 같았다.

100미터로 길이는 고정
중력 / physics 세팅 등은 건들이지 말것
2d/3d 둘 중 하나 선택하여 개발
2d/3d에 따라 오브젝트 다른 콜라이더 정의 (폴리곤 / 메쉬콜라이더)
바닥블록은 3개 생성하여 구덩이 2개 개발
구덩이에 빠질 경우 바닥에 트리거 처리 하여 게임오버처리 (로그 / 오브젝트 표시)
이동은 velocity로 개발
가운데 블록에는 좌우로 움직이는 적 개발
적 부딫히면 로그로 처리
점프는 addforce / velocity 중 하나로 개발
100미터가 아닌 무한 생성하는 런게임 제작
Instantiate / Prefab 사용
어드밴티지로 플레이어 고정 with 바닥 블록, 적이 우에서 좌로 움직이게 작업

 

위의 여러 조건들에 부합되게 게임을 구현하였으며, 이때 Prefeb을 Instantiate 하여 무한맵을 구현하는 방식이 무언가 깔끔하지않고, 오브젝트 관리가 체계적으로 되지않는다는 느낌을 받았다. 그래서 검색과 질문을 통해 가장 깔끔하게 관리하는 방법은 '오브젝트 풀링' 기법을 사용한다는 것을 알게되었다.

오브젝트 풀링이란 리스트, 큐 등 다양한 방식으로 사용되며, 본인은 Prefab 2~3개만을 가지고 동작하는 구조이기에 간단한 조건에 따라 오브젝트를 끄고 켜주는 방식으로 진행하였다.

Instantiate로 구현한 미니게임

 


과제.2  싱글톤 클래스 및 객체적용 

 

두번째 과제는 기존에 학습한 싱글톤 패턴을 프로젝트에 적용하여 구현하는 것이었다.

Publisher를 싱글톤으로 제작
Observer들은 Publisher의 멤버변수 리스트로 작성
Publisher의 함수로 Observer들의 함수를 실행
Publisher의 함수는 싱글톤 객체로 실행

 

과제의 결과는 아래와 같았으며, Publisher 클래스를 싱글톤패턴으로 구현하여, 해당 싱글톤 클래스에서 GameObject의 컴포넌트 클래스가 참조 및 동작되는 구조였다. 

해당 과제를 통하여 싱글톤 패턴에 대한 이론적인 학습과 별개로 실제 사용을 통한 필요성을 절실히 느낄수있었다. 


 

+ 디버그 팁

기존까지는 Debug.Log("") 의 방식을 사용하였다.

만약 Debug.Log("Log",gameObject); 와 같이 디버그로그를 찍은다면 ? : 

 

위와 같이 기존에는 디버그로만 떴지만, 하이어라키창에서 어떤 오브젝트에서 문제가 발생했는데 가시적으로 즉시 확인이 가능하다. 

 

 

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

 

Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea

유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.

www.udemykorea.com

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

 

#유데미, #유데미부트캠프, #취업부트캠프, #개발자부트캠프, #IT부트캠프, #부트캠프후기

728x90