본문 바로가기
Unity

면접 예상 질문 & 답변

by 김차루 2024. 9. 27.

포트폴리오 반영 면접 예상 질문

1. 팀 개발 트러블 경험 이야기

더보기

2D 게임 개발 프로젝트에서 한 팀원이 일정을 고려하지 않고 추가 기능을 요청한 상황이 있었습니다. 이로 인해 일정 관리를 담당하던 팀원과 의견 충돌이 발생했습니다. 저는 두 사람의 입장을 이해하고, 서로의 의견을 중재하여 오해가 생긴 부분을 먼저 해결했습니다. 이후, 팀원들이 요청한 추가 기능에 대해 구체적으로 논의하고, 일정을 재조정하여 가능 범위 내에서 기능을 효율적으로 통합했습니다. 이를 통해 프로젝트 일정과 팀원들의 만족을 모두 달성할 수 있었습니다.

2. 현 시점에 유니티 개발의 어떤 부분이 부족하다고 느끼신가요? (구체적 설명)

더보기

현 시점에서 제가 부족하다고 느끼는 부분은 다양한 라이브러리를 충분히 사용해본 경험이 부족하다는 점과 대규모 게임 개발 경험이 부족하다는 것입니다. 특히 대규모 프로젝트에서 발생하는 데이터 처리와 최적화 경험이 많지 않다고 생각합니다. 하지만 이를 보완하기 위해 현재 다양한 유니티 패키지와 라이브러리를 실습하며 학습 중이고, 대규모 게임 개발에서 필요한 기술을 공부하고 있습니다. 앞으로 이러한 경험을 쌓아 더 깊이 있는 개발 역량을 갖추기 위해 노력하고 있습니다.

3. 최근 기술 관련해서 스터디한 내용 설명 해주세요.

더보기

최근에 유니티의 렌더링 파이프라인인 URP와 HDRP에 대해 스터디했습니다. 특히, 각 파이프라인이 어떤 상황에서 최적의 성능을 발휘하는지 깊이 있게 학습했습니다.
URP는 성능 최적화에 중점을 두고, 모바일이나 VR과 같은 다양한 플랫폼에서 안정적이고 효율적인 렌더링을 제공하는 파이프라인입니다. 제가 학습한 내용에 따르면, 특히 저사양 기기에서의 퍼포먼스 최적화가 중요한 프로젝트에서 적합하며, 앞으로 개발할 모바일 게임에서 사용할 계획입니다.
반면, HDRP는 고사양 PC나 콘솔 게임에서 고품질 그래픽을 구현하는 데 사용되며, 물리 기반 조명, 볼류메트릭 조명, 고급 쉐이더 등을 활용해 리얼리즘을 추구할 수 있습니다. 이 기술을 활용해 고사양 프로젝트에서 그래픽 퀄리티를 극대화하는 방법을 구체적으로 연구했습니다. 향후 콘솔 게임 개발에 이 기술을 활용할 수 있을 것으로 기대합니다.

4. 유니티 occlusion에 대해서 설명

더보기

Occlusion Culling은 게임에서 카메라 시야에 가려진 오브젝트를 렌더링하지 않는 최적화 기술입니다. 예를 들어, 건물 뒤에 있는 물체처럼 플레이어가 보지 못하는 오브젝트를 GPU가 처리하지 않도록 하여 성능을 향상시킵니다. 이는 특히 복잡한 씬이나 대규모 게임에서 프레임률을 높이고 리소스를 효율적으로 사용하는 데 효과적입니다. 유니티에서는 미리 Occlusion 데이터를 계산하여 실시간으로 빠르게 적용할 수 있습니다. 

5. FSM 방법 외 다른 방법으로 상태 변화를 구현해 보셨나요?

더보기

FSM 외에도 상태 변화를 구현할 때 이벤트 기반 방식을 사용한 경험이 있었습니다. 이 방법은 상태가 변할 때마다 특정 이벤트가 발생하고, 그 이벤트에 반응하는 방식으로 동작합니다. 예를 들어, 캐릭터의 행동이 플레이어 입력이나 외부 요인에 의해 결정될 때 이벤트 리스너를 통해 상태를 전환했습니다. 이 방식은 비동기적 이벤트 처리나 복잡한 상태 전환에 유연하게 대응할 수 있어 FSM보다 더 복잡한 상호작용을 다루는데 유리했습니다. 

또한, 상태 패턴을 사용하여 객체의 상태가 바뀔 때 객체 내부에서 상태 객체를 변경하는 방식도 사용해봤습니다. 이를 통해 상태 관련 로직을 각 상태 객체에 캡슐화하여 코드를 더 깔끔하고 유지보수하기 쉽게 만들었습니다. 

6. 유니티 특수 폴더의 종류와 기능에 대해서 설명

더보기

유니티 특수 폴더는 특정 기능을 제공하기 위해 사용됩니다. Assets 폴더는 유니티 프로젝트의 모든 에셋을 저장하는 기본 폴더입니다. plugins은 외부 라이브러리나 플러그인을 저장하는 폴더로, C# DLL이나 네이티브 플러그인을 포함합니다. Resources는 런타임에 동적으로 로드할 수 있는 에셋을 저장하는 폴더입니다. 

7. Plugin 폴더에 대해서 설명해주세요.

더보기

외부 라이브러리나 네이티브 코드를 통합하기 위해 사용되는 특별한 폴더입니다. 이 폴더는 일반적인 스크립트나 리소스 파일과는 다르게, Unity의 특정 방식으로 동작하며, 외부 코드를 Unity 프로젝트에 연결하는 역할을 합니다. 

8. 배열과 리스트 차이점 설명

더보기

배열과 리스트는 데이터를 순차적으로 저장하는 자료구조이지만, 몇 가지 중요한 차이점이 있습니다. 주로 배열은 고정된 크기와 연속된 메모리 공간을 사용하는 반면, 리스트는 동적으로 크기를 조절할 수 있고, 메모리 상에서 비연속적으로 저장될 수 있습니다. 

9. 본인은 어떤 개발자로 성장하고 싶으신가요?

10. 개인 프로젝트를 하게 된다면, 어떤 게임 장르를 개발하시겠습니까?

11. 팀 프로젝트 중 팀 내부 갈등이 발생했던 경험이 있으신가요?

12. 본인의 개발성향 장점과 단점을 설명 부탁드립니다.

13. 지금까지 개발한 프로젝트 중, 사용자가 사용한 데이터를 얻은 서비스가 있으신가요?

더보기

네. 모바일 게임을 만드는 팀 프로젝트 중, MVP 단계까지 구현을 끝내고 게임에 대한 설문을 받았습니다. UXUI에 대한 사용자의 반응, 컨텐츠 재미, 기능에 대한 버그, 전체적인 게임 평가에 대한 의견을 40분 가량의 플레이어에게 받았고 이에 대한 피드백을 반영하여 남은 기간 동안 프로젝트의 방향성과 목표를 수정하며 게임을 디벨롭하여 완성 시켰습니다.

14. Dictionary 활용은 어떻게 주로 했나요?

더보기

스크립터블 오브젝트를 배우기 전에는 

15. 절차지향, 객체지향 대해서 설명

더보기

절차지향은 프로그램을 절차나 순서로 구성하여 문제를 해결하는 방식입니다. 프로그램은 함수(또는 절차, 프로시저)들의 집합으로 구성되며, 이 함수들이 순차적으로 호출되어 작업을 수행합니다.

객체지향 프로그래밍은 프로그램을 객체(Object)로 구성하여 문제를 해결하는 방식입니다. 객체는 데이터와 그 데이터를 처리하는 메서드로 구성됩니다. 객체는 실제 세계의 개체를 모델링하며, 각 객체는 자신만의 상태와 행동을 가집니다.

16. Unity 생명주기란?

더보기

Unity 생명주기란 Unity 엔진에서 스크립트가 실행되는 순서를 의미합니다. Unity는 특정 이벤트나 작업을 처리하기 위해 여러 가지 메서드를 정해진 순서로 호출하며, 이를 통해 게임 오브젝트의 동작을 관리하고 조정할 수 있습니다. 

17. Unity 프로젝트 메모리 관리는 어떻게 진행하시나요?

18. 오브젝트 풀링이란?

더보기

오브젝트 풀링(Object Pooling)은 자주 생성되고 파괴되는 객체들을 미리 생성해두고 재사용하는 메모리 관리 기법입니다. 게임 개발에서 성능 최적화와 메모리 관리가 중요한데, 오브젝트 풀링을 사용하면 메모리 할당/해제에 드는 비용을 줄이고 **GC(Garbage Collection)**에 의한 성능 저하를 방지할 수 있습니다.

19. 깃허브 머지 충돌 날 경우, 본인은 어떻게 대응하는 편인가요?

더보기

일단 충돌난 원인을 파악합니다. 예를 들어, 충돌이 난 원인이 스크립트나 오브젝트, 씬 내의 충돌이라면 머지한 팀원과 대화하며 어떤 작업을 했고 어떻게 수정을 하면 될지 확인하며 충돌을 해결합니다. 만약 해결이 되지 않는 충돌이라면 충돌 나기 전 프로젝트를 서브 브런치로 빼서 백업하고 다시 시도 해보는 편입니다. 

20. Ai NavMash란?

더보기

navmesh란 게임 오브젝트가 지형을 따라 이동할 수 있도록 해주는 내비게이션 시스템입니다. NavMesh는 자동으로 이동 가능한 영역을 계산하여 **경로 탐색(pathfinding)**에 활용되며, 특히 적 AI, NPC와 같은 캐릭터의 이동을 처리할 때 유용합니다.

 

Unity 면접 질문

1. 유니티의 생명 주기에 대해서 설명해주세요.

더보기

유니티 스크립트는 Monobehaviour 클래스를 상속 받아 만들어지고, 이 클래스를 상속받은 오브젝트는 scene에 있는 동안 엔진에서 일정한 흐름에 따라 자동으로 함수를 호출하는데 이 흐름을 생명 주기라고 합니다.

2. Update문 3가지를 말해보세요. 그리고 각각 무슨 차이가 있나요?

더보기

update, fixedupdate, lastupdate가 있습니다. update의 경우 매 프레임마다 호출되는 함수로 디바이스 성능이나 최적화 상황에 따라 Framerate가 변하므로 함수 호출 시간이 매번 달라집니다. Fixedupdate는 함수 호출 간격이 일정하도록 도장됩니다. 매번 일정한 주기로 똑같은 연산을 처리해야 하는 물리 계산 및 업데이트 처리에 주로 사용됩니다. Rigidbody 컴포넌트 같이 물리 계산이 필요한 것들을 fixedupdate에서 처리합니다. lastupdate는 모든 update함수가 호출된 후 1번씩 호출됩니다. 주로 카메라 이동 로직에 사용됩니다.

3. 유니티에서 어떤 최적화 기법을 사용해 보았나요? 없다면 어떤 최적화 방법이 있는지 설명해주세요.

더보기

기본적으로 오브젝트 풀을 많이 사용했던 것 같습니다. 몬스터나 원거리 무기의 오브젝트, 이펙트 등 반복적으로 사용되는 것을 미리 생성하여 필요할 때마다 재사용하여 메모리를 관리했습니다. 

4. 코루틴을 사용해보셨나요? 그렇다면 코루틴의 역할은 무엇인가요?

더보기

코루틴은 동기적으로 실행되는 함수로, 일반적인 함수와는 달리 실행이 중단되고 나중에 다시 시작할 수 있는 특성을 가지고 있습니다. 이를 통해 게임 로직을 시간에 따라 분산시켜 실행할 수 있으며, 프레임마다 처리할 필요 없이 일정 시간 간격으로 작업을 수행할 수 있습니다. 저의 경우, 화면의 깜빡임이나 자동 스킬을 돌릴 때 사용했습니다.

5. Find 함수 사용을 회피하기 위해 어떤 방법을 사용해 보았나요?

더보기

저는 주로 Getcomponent를 이용했습니다. 이름 자체를 찾는 find 함수는 씬에 있는 모든 오브젝트의 이름을 검사하기 때문에 비효율적이라고 생각하여 특정 스크립트가 붙어있는 오브젝트를 찾으려고 노력했습니다.

6. 프로파일러가 무엇인지 알고 있나요? 사용하고 있나요?

더보기

프로파일러는 코드 성능을 분석하고 최적화할 때 사용하는 도구입니다. 주로 cpu, 메모리 사용량, 함수 호출 시간, 그리고 병목 현상을 파악하는 데 사용합니다. 저는 ui호출로 인한 프레임 드랍 문제를 해결한 경험이 있습니다. 당시 프로젝트에서 UI요소들이 한 번에 많이 렌더링되면서, 특정 씬에서 프레임 속도가 급격히 떨어지는 문제가 있었습니다. 분석해보니 UI 레이아웃이나 여러 개의 텍스트, 이미지 요소들이 한 번에 갱신되면서 cpu 부하가 심해졌고, 이에 따라 프레임 드랍이 발생한 것을 확인했습니다.

7. 객체 이동 시 정규화를 해야 하는 이유는 무엇일까요?

더보기

객체 이동 시 벡터를 정규화하는 이유는 방향을 유지하면서도 일정한 속도로 이동시키기 위해서 입니다. 벡터 정규화란 벡터의 크기를 1로 만드는 과정입니다. 이동할 때 사용되는 벡터는 방향과 크기를 나타내는데, 정규화를 하지 않으면 벡터의 크기에 따라 이동 속도가 달라질 수 있습니다. 정규화된 벡터는 크기가 1이기 때문에 방향은 유지하면서 속도는 일정하게 제어할 수 있습니다.

8. SOLID 원칙은 무엇인가요?

더보기

SOLID원칙은 객체 지향 프로그래밍에서 유지보수성과 확장성을 높이기 위해 권장되는 5가지 설계 원칙입니다. 이 원칙을 따름으로써 코드의 품질을 높이고, 변화에 더 유연하게 대응할 수 있습니다.

'Unity' 카테고리의 다른 글

Unity 추상 클래스와 인터페이스  (0) 2024.09.19
포트폴리오 정리 + 면접 대비  (0) 2024.09.13
2. 유니티 인터페이스  (0) 2023.05.03
1. 유니티 준비  (0) 2023.05.03
0. 시작  (0) 2023.05.03