본문 바로가기
Game Engine/Unity

(Unity) Certified Expert : Programmer item walkthrough

by MeisterTJ 2022. 8. 1.

유니티 공인 Expert Programmer 시험은 5년차 이상의 프로그래머들을 대상으로 하는 최고 등급의 시험인데,

유니티 및 C#에 관련된 스킬 뿐만 아니라 현업에서 일어날 수 있는 기술적 이슈들에 대한 효율적인 의사결정을 본다고 한다.

 

위 영상은 유니티 공인 Expert Programmer 시험의 샘플 테스트 예제이다.

문제를 한국어로 번역 및 해설해보고자 한다.


[문제 1]

4가지 캐릭터를 선택해 플레이할 수 있는 플랫포머 게임이 있다.

점프할 때 캐릭터와 바닥 사이의 거리를 모든 캐릭터에서 동일하게 측정해야 한다.

그리고 게임 디자이너가 인스펙터에서 캐릭터를 개별적으로 설정하고 튜닝할 수 있어야 한다.

 

Q. 프로그래머가 구현할 수 있는 다음 방법들 중에 가장 최선의 선택은 무엇인가?

A) base class를 만들고 캐릭터 별로 이를 상속한 스크립트를 작성한다.

- 캐릭터 스크립트를 이렇게 만드는 것은 자연스러우나, 부가 기능들을 전부 이 안에 넣을 것이냐는 다른 문제이다. 

B) interface를 만들고 캐릭터 별로 이를 구현한다.

- 바닥 체크는 캐릭터 스크립트의 인터페이스로 적합하지 않다.

C) 각각의 캐릭터 스크립트에서 서로 다른 방식의 바닥 체크를 구현한다. 

- A,B와 비슷한 내용인 것 같긴한데, 다형성을 포기한다면 더 안좋은 방식

D) 바닥 체크만을 처리하는 컴포넌트를 만들고 이를 모든 캐릭터에서 사용한다.

 

A,B,C 모두 충분히 가능한 해결방법이긴 하나, 유니티가 지향하는 방식에는 D의 방식이 더 적합하다.

중요한 기능별로 컴포넌트화 시키고 이를 필요한 게임오브젝트에서 추가하는 방식.


[문제 2]

교육 플랫폼의 프로젝트에 관한 기획 문서가 있다.

이 프로젝트에는 수학, 물리 과목의 학습을 도와주는 4개의 미니 게임이 포함되어 있다.

이 프로젝트는 개발 기간이 4개월에 이르는 방대한 프로젝트로, 프로그래머는 메인 화면에서부터 미니 게임이 실행될 수 있음을 고려해야 한다.

 

각 게임은 고유의 결과를 저장하고, 메인 화면에서 학습 보고서와 함께 참조할 수 있어야 한다.

 

이것은 IOS, 안드로이드 폰 및 태블릿을 대상으로 하는 멀티 플랫폼 프로젝트이다.

사용자는 다른 장치에서도 진행률을 그대로 유지할 수 있는 계정을 만들 수 있어야 한다.

 

4개의 미니 게임 모두 단순한 게임이어야 하며, 캐쥬얼 게이머들 사이에서 인기있는 메커니즘을 모방해야 한다.

모든 게임은 터치 입력을 사용하여 플레이하며, 출시 시점에는 모든 것이 사용가능해야 한다.

 

개발팀은 풀타임으로 일하는 두 명의 프로그래머와 아트팀으로 구성될 것이다.

 

Q. 메모리 관리에 있어서 가장 좋은 로딩 방식은 무엇인가?

A) 각 미니게임별로 씬이 존재하고, 메인메뉴에서 로드가 가능한 형태.

- 로드 영역이 확실히 분리된다는 장점이 있다.

B) 각 미니게임이 포함된 프리팹이 존재하고, 메인메뉴 씬에서 이를 로드 및 언로드하는 형태

C) 메인메뉴 씬에서 미니게임 씬들을 Additive Load 한 형태

D) Empty 씬에서 모든 게임씬들을 Additive Load 한 형태

- C보다 나은 점이 없음.

 

B,C,D 모두 사용가능한 방법이나, 이들이 A에 비해 가지는 단점은 현재 사용하지 않는 씬이나 프리팹을 항상 로드하고 있다는 것이다.

A는 완벽한 씬 전환이 일어나기 때문에, 로딩 시간이 자주 필요할 수 있지만 메모리 관리에 있어서는 효율적이다.

 

Additive Load는 현재 씬을 유지하는 상태에서 다른 씬을 추가적으로 로드해서 얹는(?) 방식인데, 

메인 메뉴의 정보를 유지하고 있는 상태에서 미니게임들을 실행해야 한다면 C가 더 적합할 것 같다.

 

Q. 다음 중 어떤 작업을 먼저 수행해야 하는가?

A) 미니게임 개발

- 1인개발이라면 이거부터 할 듯

B) 계정 생성과 관련된 네트워크 코드

C) 태스크 백로그

D) 기술 디자인 문서 작성

 

개인 개발이 아닌 팀 작업에서는 각 단계 별로 어떻게 기능을 구현할 것인지에 대한 기술 문서를 먼저 작성하는 것이 우선이다. A,B,C에 해당하는 내용이 먼저 문서화 된 후에 구현되는 것이 순서에 맞다.


[문제 3]

1인칭 슈팅게임에서 플레이어는 적을 저격하는 저격수이다.

플레이어는 저격총에 달린 스코프의 뷰를 사용하기 위해 적절한 버튼을 누를 수 있다.

그리고 게임은 플레이어가 스코프의 뷰를 사용하는 동안 느려진다.

 

이 기능은 완료된 다른 기능들에 최소한의 영향을 미치도록 구현되어야 한다.

 

Q. 이 기능을 구현하기 위해 프로그래머는 무엇을 해야 하는가?

A) 타겟을 확대하기 위해 두 번째 카메라를 사용하고, Animator.Speed 값을 감소시킨다.

B) 적들에게 attach 된 Animator.Speed를 FOV의 값과 동기화하고, FOV를 변경한다.

C) 커스텀 애니메이터 시간과 줌 기능을 사용하기 위한 두 번째 카메라와 두 번째 씬을 준비한다.

D) timeScale 값을 줄이고, 뷰를 총에 부착된 더 좁은 FOV를 가진 두 번째 카메라로 교체

 

줌이 된 동안에는 전체 게임 시간이 느려져야 하는데,

A,B,C 는 전부 Animator가 부착된 오브젝트의 Animation 속도만 느려지게 된다.

그리고 시간을 FOV에 동기화하거나, 확대를 위한 두 번째 씬을 사용하는 것 또한 굉장히 비효율적이고 적절치 않은 답이다.

 

전체 시간을 조절하는 것은 timeScale을 사용하는 것이 맞고, 총에 부착된 더 좁은 FOV를 가진 두 번째 카메라로 교체하는 것이 이상적이다.

 


근데.. 이거 5년차 이상의 프로그래머를 대상으로 한 문제들 맞나?