게임 클라이언트 개발자 면접질문 정리

이명준·2023년 11월 30일
8

-------인성, 일반 질문 ---
1. 자기소개 부탁드리겠습니다 .
안녕하세요. 저는 게임 클라이언트 개발에 대한 열정으로 이 직무를 희망하고 있는 이명준 입니다.

1-2 . 진로를 선택한 계기가 있었나요?
저는 현장실습을 통해 교육 애플리케이션을 개발하는 과정에서, 사용자들에게 도움이 되는 콘텐츠를 제작하고, 이를 실제로 출시까지 할 수 있었습니다. 이 과정에서 '내가 만든 작품이 많은 사람들에게 즐거움을 주고 있다면 얼마나 뿌듯할까'라는 생각을 했고, 게임 클라이언트로서의 진로를 결정하게 되었습니다.

2. 우리회사에 지원한이유 말씀해주세요
회사의 문화와 가치관이 저와 맞아 떨어집니다. 열린 소통과 협업을 중시하며, 새로운 아이디어를 환영하고 성장할 수 있는 환경을 제공한다는 것이 저에게 매력적으로 다가왔습니다.

3. 전회사에서 이직한이유 . 퇴사한 이유좀 알려주실수있을까요 ?
전 회사에서 경제적인 문제로 인해 조직적인 변화가 있었지만, 저는 이를 도전으로 받아들여 새로운 기회를 찾아보기로 결정했습니다. 이를 통해 더 나은 환경에서 성장하고 발전할 수 있는 기회를 찾으려 합니다.

4. 프로젝트 경험중 갈등 겪었던 일이있을까요 ?
과거 프로젝트 중 한 가지 경험으로 기억에 남는 상황이 있습니다. 기획자와의 의견 충돌이 있었던 프로젝트였습니다. 저는 이러한 상황에서 커뮤니케이션과 설득을 통해 상충되는 의견을 조율하고 해결했습니다.
이러한 경험은 협업과 소통의 중요성을 깨닫게 해주었고, 특히 문제가 발생했을때 어떻게 해결해 나가야하는지에 대한 통찰력을 얻을수 있었습니다.

5. 개발하면서 가장 힘들었던 경험
제가 개발하면서 가장 어려웠던 경험 중 하나는 퍼포먼스 최적화와 관련된 프로젝트였습니다. 특히, 사용자 경험과 게임의 부드러운 진행을 위해 다양한 플랫폼에서의 성능 최적화에 많은 시간을 투자해야 했습니다.
이를 해결하기 위해 여러 도구와 기술을 활용하고, 코드 리팩토링과 효율적인 알고리즘 적용을 위해 노력했습니다.

6. 디자인패턴은 사용해봤는지
"저는 Unity 게임 클라이언트 개발 중 Singleton, Observer, Factory 등의 디자인 패턴을 사용한 경험이 있습니다. 예를 들어 Singleton 패턴을 통해 특정 매니저 클래스를 단일 인스턴스로 유지하고, Observer 패턴을 이용하여 이벤트 기반의 통신 구조를 구축하는 데 활용한 적이 있습니다. 또한, Factory 패턴을 사용하여 다양한 게임 오브젝트 생성하는 곳에 적용해 보았습니다."

7. 내적 외적 설명 - 언제사용하는지도
내적은 두 벡터 간의 곱셈 연산으로, 두 벡터의 유사성을 판단하거나 각도를 계산하는 데 사용됩니다. 예를 들어, 게임에서 물체의 방향을 결정하는 데 사용되거나, 충돌 감지에 활용됩니다.

외적은 두 벡터 간의 외적 연산으로, 두 벡터의 수직 방향 벡터를 찾거나 면적, 방향, 회전 계산하는 데 사용됩니다. 예를 들어, 물체의 회전 방향을 결정하거나, 충돌 판정에 활용됩니다.

8. 모바일 화면 비율 설정 관련 경험이 있는지
모바일 플랫폼 게임을 개발하는 과정에서 다양한 화면 비율에 대한 설정 경험이 있습니다. 캔버스 UI 스케일러, 피봇 좌표, 다양한 캔버스 설정 등을 통해 일관된 사용자 경험을 제공할 수 있도록 했습니다.

9.5년 후에 자신이 어떤 개발자로 성장하고 있었으면 하는지에 대해 이야기해주세요
5년 후에 저는 더 성숙해진 개발자가 되고 싶습니다. 그때에는 기술적으로 성장하고, 실무 경험을 통해 더 나은 게임 클라이언트를 개발할 수 있는 역량을 갖추고 싶습니다. 또한, 팀원들과의 협업에서 리더십을 발휘하며, 팀을 이끌어가는 능력을 갖춘 개발자가 되어 있기를 희망합니다.

9-2.팀을 이끌어가는 리더쉽있는 게임클라이언트는 어떤걸 준비해야할까요?
게임 클라이언트 팀을 이끄는 리더는 기술적 통찰력, 일정 관리, 효과적인 의사소통, 문제 해결 능력, 팀원 발전과 멘토링, 유연성 등 다양한 역할을 수행해야 합니다. 리더쉽은 효과적인 의사소통과 팀원 동기 부여, 프로젝트 관리 능력 등이 필수적입니다.

10. 좋아하는 게임이 있다면, 그 게임의 특별한 기능이나 시스템에 대해 어떤 점을 좋아하나요?
저는 APEX Legends를 좋아하는데, 그 게임의 '리스폰 제작 시스템'이 매우 흥미로웠습니다.
이 게임에서는 한 번 쓰러진 팀원을 다시 게임으로 되살릴 수 있는 기회를 주는 제작 시스템이 있습니다. 이 시스템은 팀플레이를 중시하는 게임에서 흥미로운 요소 중 하나였습니다.

  1. 게임클라이언트 개발자로 성장하기 위해 어떤 노력을 하고 있나요?
    게임클라이언트 개발자로 성장하기 위해 먼저, 지속적인 기술적인 학습에 힘쓰고 있습니다. 업계의 최신 동향과 기술 변화를 파악하기 위해 관련 서적을 읽고 온라인 강의를 수강하며, 새로운 기술을 습득하고 있습니다.
    그리고, 지속적인 개발자 커뮤니티 참여와 다른 개발자들과의 지식 공유를 통해 서로 배우고 성장할 수 있는 기회를 찾고 있습니다. 이러한 다양한 노력을 통해 제 개발 역량을 향상시키고, 클라이언트 개발자로 성장하고 있습니다

13. 게임 클라이언트 분야에서 가장 최근에 관심을 가지거나 학습한 것이 무엇인가요?
가장 최근에 게임 클라이언트 분야에서 관심을 가지고 학습한 것은 VR(가상현실) 및 AR(증강현실) 기술입니다. 최근에 이 분야에 대해 깊게 학습하고 있었는데, 이 기술들이 게임 산업에서 혁신을 가져오고 있다고 생각하기 때문입니다.

14. 팀 프로젝트에서의 역할과 협업하는 과정에서 어려웠던 점과 그것을 어떻게 해결했는지 설명해주세요
협업하는 과정에서 가장 어려웠던 점은 다양한 아이디어와 의견이 충돌했을 때 효과적인 결정을 내리는 것이었습니다.
의견 충돌이 발생했을 때 각자의 관점을 존중하고 리더십을 발휘하여 중재 및 결정하는 데 적극적으로 참여했습니다.

팀원들과의 소통과 협업을 강화하기 위해 그룹 내 소셜미디어 그룹을 만들어 정보를 공유하고, 업무일지를 작성하여 업무 진행 상황을 모니터링하고 공유하며 협업을 향상시켰습니다. 이러한 노력을 통해 팀 내 갈등을 해결하고, 조화롭게 협력하여 프로젝트를 완료하는 데 성공했습니다.

15. 어떤 게임 클라이언트 기능을 개선하거나 추가해야 한다면, 그 방법에 대해 어떻게 생각하시나요?
게임 클라이언트 기능을 개선하거나 추가해야 한다면, 먼저 현재 게임의 사용자 경험을 분석하고 피드백을 수집하여 어떤 기능이 필요한지 파악할 것입니다. 사용자들의 BedExperience 기반으로 어떤 부분이 더 개선되어야 하는지 확인합니다.

그 후, 기능을 추가하거나 개선하기 위해 세심한 설계와 계획을 수립합니다. 이를 위해 프로토타입을 제작하거나 사용자 테스트를 통해 기능을 검증하고, 사용자들의 피드백을 적극 수용하여 개선점을 찾아냅니다.

16. 어떤 프로그래밍 언어나 기술을 주로 사용하나요? 그리고 이 기술을 활용한 경험이 있나요?
주로 사용하는 기술은 C#과 Unity 엔진입니다. C#은 유니티 엔진의 기본 언어이며, 게임 클라이언트 개발에 필수적으로 사용됩니다.
이 기술을 활용해 게임 내 캐릭터의 움직임, 상호작용, 애니메이션 구현, UI/UX 개발 등 다양한 영역에서 Unity 엔진을 활용하여 개발하였습니다. 이를 통해 게임 개발에 활용할 수 있는 능력을 키웠습니다.

17. 게임 클라이언트 분야에서 일하고 싶은 이유가 무엇인가요
저는 현장실습을 통해 교육 애플리케이션을 개발하는 과정에서, 사용자들에게 도움이 되는 콘텐츠를 제작하고, 이를 실제로 출시까지 할 수 있었습니다. 이 과정에서 '내가 만든 작품이 많은 사람들에게 즐거움을 주고 있다면 얼마나 뿌듯할까'라는 생각을 했고, 게임 클라이언트로서의 진로를 결정하게 되었습니다.

18. 팀 프로젝트에서 가장 효과적으로 협력했다고 생각하는 경험이 있나요?" "의견 충돌이 있었을 때 어떻게 해결했나요?
가장 효과적으로 협력한 프로젝트가 있습니다. 팀원들과 열린 마음으로 협력하여 목표를 달성하는 데 성공했습니다.
의견 충돌이 있을 때 저는 이러한 상황에서 커뮤니케이션과 설득을 통해 상충되는 의견을 조율하고 해결했습니다.
이러한 경험은 협업과 소통의 중요성을 깨닫게 해주었고, 특히 문제가 발생했을때 어떻게 해결해 나가야하는지에 대한 통찰력을 얻을수 있었습니다.

------기본적 질문------
객체란.?
변수(Variable)와 메서드(Method)로 구성되어 있는 프로그램에서 기능을 실행시키는 단위.

1. 싱글톤 패턴이 뭔가요 ?
싱글톤 패턴은 디자인 패턴 중 하나로, 해당 클래스의 인스턴스가 언제나 하나만 존재하도록 보장하는 패턴입니다. 이 패턴은 주로 하나의 인스턴스만 필요한 객체에 적용됩니다. 외부에서 생성자를 이용한 객체 생성을 막아 전역적으로 접근할 수 있는 정적 메서드를 통해 해당 인스턴스에 접근하고 사용합니다. 유니티에서는 게임 전체에서 유일하게 사용되는 객체를 구현하는 데에 많이 활용됩니다. 예를 들어, 게임 매니저(GameManager)나 리소스 관리자(ResourceManager) 등이 여기에 속합니다.

2. 자료구조가 뭔가요?
데이터를 구성하고 저장하는 방법을 의미합니다. 예를 들어, C#에서 배열, 리스트, 딕셔너리 등의 자료구조를 사용하여 데이터를 조직화하고 관리할 수 있습니다. 배열은 같은 타입의 데이터를 연속된 메모리 공간에 저장하며, 리스트는 동적으로 크기가 조정될 수 있는 데이터의 집합을 관리합니다. 또한, 딕셔너리는 키-값 쌍으로 데이터를 저장하고 검색하는 데 사용됩니다. Unity에서는 이러한 자료구조들을 활용하여 게임 오브젝트, 씬 정보, 리소스 등을 효율적으로 관리합니다.

2-1 배열과 리스트의 차이점을 알려주세요
배열과 리스트는 둘 다 데이터를 저장하는 데 사용되지만 내부 동작 및 기능 면에서 몇 가지 차이가 있습니다.

크기 조정:
배열은 고정된 크기를 가지며 초기에 설정된 크기 이상의 요소를 추가할 수 없습니다. 크기가 변경되려면 새로운 배열을 생성하고 기존 데이터를 복사해야 합니다.
리스트는 동적으로 크기가 조정됩니다. 요소를 추가하거나 삭제할 때 리스트 크기가 자동으로 조정되며 유연하게 사용할 수 있습니다.
메모리 할당:
배열은 초기에 크기가 정해져 있기 때문에 메모리에 연속된 블록으로 할당됩니다.
리스트는 동적으로 크기를 조정할 수 있으므로 요소가 추가될 때마다 필요에 따라 추가 메모리를 할당하고 사용합니다.
성능:
배열은 메모리 할당 및 복사 등이 비교적 단순하기 때문에 접근 및 요소 조작 시 빠르지만 크기 조정이 제한적이며 비용이 큽니다.
리스트는 크기 조정이 유연하고 내부 메커니즘이 복잡하기 때문에 배열보다 약간 느릴 수 있습니다.
사용 용도:
배열은 요소의 크기가 고정되어 있고 빠른 요소 접근이 필요한 경우에 적합합니다.
리스트는 크기가 동적으로 변해야 하거나 요소의 추가 및 제거가 빈번한 경우에 적합합니다.

3. 오브젝트 풀이 뭔가요?
오브젝트 풀은 반복적으로 생성하고 삭제되는 객체(오브젝트)를 미리 생성하여 풀(Pool)에 저장해두고, 필요할 때마다 이를 재활용하는 디자인 패턴입니다. 이는 객체를 동적으로 생성하고 삭제하는 데 필요한 시간을 절약하고 메모리 관리를 효율적으로 합니다.

유니티에서 오브젝트 풀은 주로 총알, 폭탄, 파티클 등의 게임 오브젝트를 미리 생성해두고, 필요할 때마다 활성화 및 비활성화하여 재사용합니다. 예를 들어, 총알을 발사할 때마다 새로운 총알 오브젝트를 생성하는 것이 아니라, 이미 생성된 총알 오브젝트를 재활용하여 게임 성능을 향상시킬 수 있습니다. 이로써 매번 오브젝트를 생성하고 소멸시키는 오버헤드를 줄여 최적화된 게임 플레이를 구현하는 데 도움이 됩니다.

4. 옵저버 패턴이 뭔가요?
옵저버 패턴은 객체 간에 일대다(one-to-many) 의존성을 정의하는 디자인 패턴 중 하나입니다. 이 패턴은 객체의 상태 변화가 발생할 때, 해당 객체에 의존하는 다른 객체들이 이를 감지하고 자동으로 알림을 받을 수 있도록 합니다.

5. LocalSpace가 뭔가요?
그래픽스 파이프라인의 3D모델 구축에 해당한다 . 3D모델을 만들어서 로컬좌표계에 띄우는 단계를 말한다.

6. WorldSpace는 뭔가요?
그래픽스 파이프라인의 가상공간의 배치에 해당한다
구축한 3D모델을 월드 좌표계로 옮겨 하나의 장면을 구성하는 단계를 말한다.
LocalSpace 의 물체들은 이동, 회전 , 크기 변환 등을 포함하는 월드 변환이라는 작업을 거쳐 옮겨진다.

7.ViewSpace
World Space내에서 기하물체와 카메라는 월드 좌표 시스템과 연계되어 정의한다. 카메라가 월드 내의 임의의 위치나 방위를 가진다면 투영이나 그밖의 작업이 어렵거나 비효율적이 되는데 이를 해결하기 위해 카메라를 월드시스템의 원점으로 변환하고 카메라가 양의 Z 축을 내려다 보도록 회전시키는 작업을한다 이러한 변환을 ViewSpace변환 이라고한다.

8.Backface Culling
화면에 보이지않는 폴리곤을 처리하는 작업을 말한다.

9.코루틴에 대하여
코루틴은 Unity에서 사용되는 특별한 함수로, 일시 중지 및 재개가 가능한 비동기적인 작업을 처리하는데 도움을 주는 기능입니다. 일반적으로 게임에서는 지연 작업이나 반복적인 동작을 제어하는 데 유용하게 사용됩니다. Unity에서는 코루틴을 통해 게임의 프로세스를 최적화하고 유연하게 제어할 수 있습니다.

10.Light
Light는 WorldSpace 내에 정의되지만 ViewSpace변환에 의해 View Space로 전환된다.
3D 공간에는 빛이없지만 현실세계의 빛을 3요소로 만들어 흉내낸다.

11. Clipping
시야 불륨 외부의 기하물체를 추려내는 과정

12. Projection
3D물체를 2D 평면에 표현하기 위하여 3D모델 좌표를 2D 평면 좌표로 변환하는 과정

13. ViewPort
프로젝트의 윈도우 좌표를 Viewport 라 불리는 화면의 직사각형으로 변환하는 과정 게임에서의 Viewport는 직사각형의 전체화면이 되지만 윈도우 모두에서는 실행하는 경우에는 클라이언트 영역이나 화면의 일부가 될수도 있다.

14. 인터페이스와 Virtual(가상) ㅡ Abstract(추상) 함수
가상 : 하나의 기능을 하는 완전한 클래스 , 파생클래스에서 상속해서 추가적인 기능 추가 및 재정의 가능 (필수 아님)
추상 : 여러갱의 파생클래스에서 공유할 기본 클래스의 공통적인 정의만하고 파생클래스에서는 무조건 재정의를 해야한다.(필수)
인터페이스 : Abstract 과 비슷하지만 멤버변수를 사용할수없다 . 서로 다른계층이나 타입이더라도 같은 기능을 추가하고싶을때 사용한다.

15. 구조체와 클래스
구조체는 상속을 할수없다 .
클래스 객체는 Heap에 할당이되지만 구조체객체는 Stack에 할당된다.

16. 상속과 다형성
상속 : base class 로부터 변수, 메서드 등을 그대로 물려받아 새로운 class 만드는것.
다형성: 객체가 여러형태를 가질수있음을 의미한다.

17. 배열과 리스트
Array 는 동적 할당이 불가능하고 List는 동적 할당이 가능하다.
즉 데이터를 할당할 시 데이터의 크기가 정해져 있으면 Array 아니면 List를 사용하는것이 좋다 .

18. namespace와 partial
프로젝트에서 협업을 하다보면 불가피하게 클래스의 이름이 중복될수있다 이를 방지하기 위해서는 namespace를 사용한다 .
하나의 파일에 하나클래스를 작성한다해도 그클래스의 크기가 엄청나게 길어지는 경우가 있어 가독성이 떨어질수있다 이떄 파일의 분할해서 동일하게 클래스를 작성하고싶을때 partial 키워드를 사용한다 .

19.객체지향
객체(Object)를 중심으로 프로그램을 설계, 개발해 나가는 것을 말합니다. 객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 함수(처리 부분), 변수(데이터 부분)를 하나로 묶어 객체(인스턴스)로 만들어 사용한다는 점입니다. : 연관있는 변수와 메서드를 묶어주는 작업 . 클래스의 접근제한을 하고 객체내에서만 접근 가능하도록 정보를 은닉한다 .
추상화 : 객체에서 필요한 공통된 부분을 추출
상속 : 부모 클래스로부터 공통된 변수와 함수 인터페이스를 그대로 물려받는다 .
다형성 : 같은종류의 클래스가 하나의 메세지에 대해 서로다른 행동을한다. (오버로딩 , 오버라이딩)

20. 오버로딩 오버라이딩
오버로딩은같은 이름의 메서드나 연산자를 다양한 매개변수와 반환값을 사용하여 여러번 정의하는것을 의미합니다 .이는 코드의 가독성을 높이고 메서드를 사용하는 방법을 단순화 할수있습니다.
오버라이딩(Overriding)은 C# 언어의 일부분으로서, 상속 관계에서 부모 클래스에 정의된 메서드나 속성을 자식 클래스에서 재정의하여 사용하는 것을 의미합니다.

21. 전역변수 지역변수
전역변수 : Heap메모리에 저장되며 함수외부에서 선언된다 .프로그램이 종료되기 전까지는 파괴되지않는다.
지역변수 : Stack 메모리에 저장되며 햄수내부에서 선언된다 해당함수가 종료되면 같이 파괴된다.

22. delegate 와 event
차이점 delegate는 public 한정자로 선언하면 클래스 외부에서 호출이 가능하다 .
하지만 event는 public 한정자로 선언해도 클래스 외부에서 호출이 불가능하다 .
event 는 객체 상태 변화나 사건 발생을 알리는 용도로 사용되고 delegate는 callback 의 용도로 사용된다.

23. Heap Stack 메모리 할당
기본적으로 값 형식은 Stack 에 참조형식은 Heap에 할당된다.
참조 형식의 경우 그것이 포함한 값 형식은 자신의 인스턴스 내에 포함된다.
내부에 참조 형식의 필드가 있으면 별도의 Heap주소를 가리키는 주소값만을 담고있다.

24. Boxing 과 UnBoxing
Boxing 값 타입의 객체를 참조타입으로 변환하는 작업
UnBoxing 참조타입을 값타입으로 변환하는 작업 (Heap -> Stack 으로 복사)

25. 세대별 GarbageCollection
세대별 GC
0세대 : GC를 한번도 겪지 않은 갓 생성된 객체가 대상
1세대 : GC를 1회 겪은 객체가 대상
2세대 : GC를 2회 이상 겪은 객체가 대상(전체를 의미)
세대가 낮은 메모리부터 메모리 해제를 해준 다음 메모리 컴펙션을 해준다.
2세대 GC를 할 시 Full Garbage Collection이라 하고 전체 Heap에 대하여 GC하는 것을 의미한다.
세대를 나누는 근거
최근에 생성된 객체일수록 생명주기가 짧을 가능성이높고, 오래된 객체일수록 생명주기가 길 가능성이 높습니다.
최근에 생성된 객체끼리는 서로 연관성이 높을 수 있으며, 비슷한 시점에 자주 액세스 됩니다.
일부분 Heap에 대해 GC를 하는 것이 전체 GC를 하는 것 보다 빠릅니다.

26. Dictionary내부 동작 원리
Dictionary는 키-값 쌍을 저장하는데, 내부적으로는 해시 테이블을 사용합니다. 해시 테이블은 각 키의 해시 코드를 계산하여 해당 코드에 해당하는 인덱스에 데이터를 저장합니다. 이 때, 충돌을 방지하기 위해 각 인덱스에는 연결 리스트나 트리와 같은 방식으로 데이터를 저장하게 됩니다.

검색은 키의 해시 코드를 계산하고 해당 코드에 대응하는 인덱스로 이동하여 값을 찾습니다. 이는 매우 빠르게 이루어지며, 시간 복잡도는 평균적으로 O(1)입니다. 하지만 해시 충돌이 발생할 경우 최악의 경우에는 O(n)까지 증가할 수 있습니다.

추가나 수정은 마찬가지로 키의 해시 코드를 계산하여 해당 인덱스에 저장하게 되지만, 동일한 해시 코드를 가진 다른 키가 있을 때 충돌이 발생하면 연결 리스트나 트리를 통해 이를 처리합니다.

Dictionary는 해시 테이블을 기반으로 하며, 빠른 검색 속도를 제공하며 중복된 키를 허용하지 않습니다. 이를 통해 데이터를 효율적으로 저장하고 빠르게 접근할 수 있습니다.

27. Action, Func , Event 차이
Action: Action은 매개변수를 받지만 반환값이 없는 델리게이트입니다. 보통 void 형식의 메서드나 함수를 참조하는 데 사용됩니다. 예를 들어 Action은 정수형 매개변수를 받는 메서드를 참조합니다.

Func: Func는 매개변수를 받고 반환값이 있는 델리게이트입니다. Func는 마지막 매개변수가 반환값인 형식으로 사용됩니다. 가령 Func<int, string>은 정수형 매개변수를 받아 문자열을 반환하는 메서드를 참조합니다.

Event: Event는 클래스 내에서 발생한 액션을 구독하고 반응할 수 있는 기능입니다. 이벤트는 특정 상황이나 조건에 따라 호출되는 메서드를 참조하고, 다른 클래스에서 이를 구독하거나 구독 해지하여 이벤트가 발생했을 때 일정한 동작을 수행할 수 있습니다.

29. C#이란 무엇인가요?
C#은 자바와 비슷한 구문을 가지고있으며 .Net프레임 워크에서 사용되는 객체지향 프로그래밍 언어입니다. C#은 C++의 복잡성을 줄이고 자바의 플랫폼 독립성과 보안성을 가지고있습니다.

30. C#의 장단점은 무엇인가요?
C#은 객체지향프로그래밍 언어입니다. 간결한 구문과 높은 생산성을 제공하고 안전성과 보안성이 높습니다. 하지만 C#은 다중 상속을 지원하지않고 성능이 상대적으로 느릴수있습니다.

31. C#에서 클래스와 구조체의 차이점은 무엇인가요 ?
클래스는 마치 자동차의 모델역할을 하며 객체를 힙메모리에 저장합니다. 구조체는 마치 자동차 부품 역할을 하며 객체를 스택메모리에 저장합니다. 또한 클래스는 다중 상속을 지원하지만 구조체는 지원하지않습니다.

35. C#에서 람다식이란?
람다식은 익명 메서드를 간결하게 작성하는 방법입니다 .람다식은 delegate 타입의 인수로 사용되며 익명 메서드와 비슷한 구문을 사용합니다 .

36. C# 가비지 컬렉션이란
더이상 사용되지 않는 객체를 자동으로 삭제하는 프로세스입니다 .C# 에서는 가지비 컬렉터가 사용되며 애플리케이션에서 메모리 관리를 자동으로 처리합니다 .이를 통해 메모리 누수를 방지하고 프로그래머가 메모리 관리를 수동으로 처리할 필요가없습니다 .

37. C#에서는 다음과 같은 네가지의 접근 제한자를 사용합니다 .
public : 모든곳에서 접근이 가능
private : 같은 클래스내에서만 가능
protected : 같은클래스, 파생클래스 내에서 접근가능
internal : 같은 네임스페이스 내에서만 가능

38. C#에서 가상메서드란
가상 메서드는 Virutal 키워드로 정의되며 base 키워드를 사용하여 기본 클래스에서 정의한 메서드를 호출할 수있습니다 .

39. C#에서 대리자란?
delegate 키워드로 메서드를 매개변수로 받아 해당 메서드를 대신 호출하는데 사용됩니다.

40. C#에서 인덱서란무엇인가
클래스의 인스턴스 멤버에 대한 접근을 가능하게 합니다. 인덱서는 this.키워드와 대괄호를 사용하여 인덱싱을 정의하며 인덱스를 사용하여 클래스 인스턴스 멤버에 접근할수 있습니다.

41. 제네릭이란
데이터나 메서드 등을 다룰 때 구체적인 데이터 타입을 지정하지 않고 일반화된 형태로 정의하는 방법입니다. 제네릭을 사용하면 코드의 재사용성을 높일 수 있고, 타입 안전성을 확보할 수 있습니다.
제네릭을 사용하지 않는 경우에는 특정 타입에 의존하는 코드를 작성해야 합니다.

---------유니티 관련 질문----------------

1. 유니티에서의 머티리얼이란 무엇인가요?
머터리얼은 게임 오브젝트의 렌더링 효과를 결정하는 속성을 가진 컴포넌트입니다.
쉐이더와 텍스처를 조합하여 게임 오브젝트 의 색상 질감 광택등을 제어할수있습니다.

2.유니티에서의 프리팹이란 무엇인가요?
프리팹은 게임 오브젝트를 미리만들어 놓고 필요할떄마다 인스턴스화 하여 사용할수있도록 하는 기능입니다.
프리팹은 씬에서 사용되는 일반적인 게임오브젝트와 달리 프로젝트에 저장되어 있으며 필요할때마다 가져와 사용할수있습니다.
이를 통해 게임 오브젝트의 중복생성을 줄이고 효율적인 게임 개발을 가능하게합니다.

3.유니티 에서의 쉐이더란 무엇인가요?
쉐이더는 그래픽 처리유닛에서 사용되는 프로그램으로 렌더링 엔진에서 빛, 색상, 질감등의 시각적 요소를 계산하는데 사용됩니다.
유니티에서는 쉐이더를 사용하여 게임오브젝트의 머티리얼에 적용하여 시각적인 효과를 구현합니다.

4. 유니티에서의 빌드란 무엇인가요?
빌드는 게임을 실행가능한 상태로 만드는 작업을 말합니다.
이작업을 통해 게임개발자는 플랫폼별로 게임을 빌드하여 사용자에게 제공할수있습니다.

5. 유니티에서의 콜라이더와 리지드바디의 차이는 무엇인가요?
콜라이더는 충돌감지를 위한 컴포넌트이고 .
리지드바디는 물리엔진과 상호작용하기 위한 컴포넌트입니다.

콜라이더는 게임오브젝트가 다른게임 오브젝트와 충돌하는것을 감지하고 이에 대한 이벤트를 발생시킵니다.
리지드바디는 물리엔진에서 게임오브젝트의 물리적인 움직임을 제어하며 콜라이더와 함께 사용하여 게임오브젝트 간 충돌 및 반응을 구현합니다.

6. 유니티에서의 코루틴이란 무엇인가요?
코루틴은 프로그램의 실행을 일시 중지하고, 나중에 다시 시작할 수 있도록 하는 기능입니다.
유니티에서는 코루틴을 사용하여 일시 중지 및 실행을 반복하는 작업을 구현하거나, 복잡한 작업을 분할하여 처리하는 등의 작업에 사용됩니다.
예를 들어 게임에서 대기 시간을 주기 위해 코루틴을 사용할 수 있습니다.

7. 유니티에서 스크립트는 어떤언어로 작성되나요?
유니티에서 스크립트는 C#과 유니티 자체적으로만든 UnityScript 언어로 작성될 수 있습니다.
C#은 보편적으로 객체 지향언어이며 유니티에서 가장많이 사용되는 언어중 하나입니다.

8. 유니티에서 객체를 생성하는 방법은 무엇인가요?
유니티에서는 Instantiate 메서드를 사용하여 객체를 생성할수있습니다. 메서드는 프리팹을 사용하여 새로운 게임오브젝트를 만들거나 이미 있는 게임 오브젝트의 복제본을 만들수있습니다.

9. 유니티에서 동적으로 UI를 조작하는 방법은 무엇인가요?
유니티에서는 UI요소를 코드로 조작할수 있습니다. 예를들어 Text컴포넌트의 text 속성을 변경하여 텍스트를 변경할수있습니다.

10. 유니티에서 상속을 사용하는 이유는 무엇인가요?
유니티에서 상속을 사용하면 코드 재사용성을 높일 수 있습니다.
또한 상속을 사용하면 유지보수성을 높일 수 있습니다.
만약 Enemy스크립트에서 수정이 필요한 경우, 상속받은 모든 클래스에서 수정 내역이 반영됩니다.

11. 유니티에서 레이케스트란 무엇인가요?
물체와 충돌체를 검사하는 기능입니다.
레이캐스트는 게임에서 화면을 통해 물체에 광선을 쏘아 해당위치에 대한 정보를 가져오는 기능입니다.
예를들어 마우스 클릭한 위치에 물체를 생성하는 게임이 있다면 레이케스트를 사용하여 마우스 클릭한 위치에 대한 정보를 가져올수있습니다.

12. 유니티에서의 애니메이션과 애니메이터의 차이는 무엇인가요?
애니메이션은 게임 오브젝트의 동작을 미리만들어 놓은 애니메이션 클립으로 제어하는 기능입니다.
애니메이션 클립을 만들고 각각의 동작을 구성하는 키프레임을 설정하여 사용합니다.

애니메이터는 애니메이션을 제어하는 기능으로 게임 오브젝트의 상태나 입력에 따라 애니메이션을 재생하거나 정지할 수 있습니다. 예를들어 캐릭터가 이동할때 애니메이터 를 사용하여 캐릭터의 걷기 애니메이션을 재생하도록 할수있습니다.

13. 유니티에서의 물리엔진이란 무엇인가요?
유니티에서의 물리엔진은 게임오브젝트의 물리동작을 시뮬레이션하는 기능입니다.
이를 통해 물리 법칙에 따라 물체가 움직이고 충돌하는 모습을 자연스럽게 구현할수있습니다.
유니티에서의 물리엔진은 충돌,중력,마찰력 등을 다룰수있습니다.

14. 유니티에서 애니메이션을 구현하는 방법에는 어떤것이 있나요?
애니메이션을 구현하는 방법에는 Animation 컴포넌트를 사용하는 방법과 Animator 컴포넌트를 사용하는 방법이 있습니다.
Animation 컴포넌트는 키프레임 기반의 애니메이션을 지원하며
Animator 컴포넌트는 상태 기반의 애니메이션을 지원합니다.
애니메이션을 만들기 위해서는 애니메이션 클립을 만들고 애니메이션 컨트롤러에 추가하여 구현할수있습니다.

15. 유니티에서 물리 시뮬레이션을 구현하는 방법에는 어떤것이 있나요?
물리 시뮬레이션을 구현하는 방법에는 Rigidbody 컴포넌트를 사용하는 방법과 Physics.Raycast() 메서드를 사용하는 방법이 있습니다.
Rigdbody 컴포넌트는 물리엔진을 사용하여 물리적 상호작용을 처리할수 있으며,
Physics.Raycast() 메서드는 레이캐스트를 수행하여 충돌체크를 할수있습니다.

16. 유니티에서 메시지를 보내는 방법에는 어떤 것이 있나요?
메시지를 보내는 방법에는 SendMessage() 메서드, SendMessageUpwards() 메서드 ,BroadCastMessage()메서드 등이 있습니다.
SendMessage()메서드는 특정 게임오브젝트에 대해 메시지를 보내며
SendMessageUpwards()메서드는 상위 게임 오브젝트부터 메시지를 보냅니다.
16-2. 브로드캐스트와 샌드메세지 차이점은 ?
브로드캐스트는 SendMessage 메서드를 사용하여 모든 게임 오브젝트에 메시지를 보내는 것을 의미합니다.
샌드 메시지는 특정 GameObject에 대해 SendMessage를 사용하여 메시지를 보내는 것입니다.

17. 유니티에서 코루틴을 사용하는 이유는 무엇인가요?
코루틴은 일정시간 간격을 두고 코드를 실행하거나 일시 중지하고 다시시작하는 기능을 제공합니다.
이를 통해 비동기적으로 코드를 실행 할수있으며 게임 성능을 향상 시킬수있습니다.
코루틴은 WaitForseconds() , WaitUntill 메서드 등을 사용하여 일시 중지 시킬수있으며
yield return 문을 사용하여 실행 흐름을 일시중지하고 다시시작 할수있습니다.

18. 유니티에서 캐싱을 사용하는 이유는 무엇인가요?
반복적으로 사용되는 자원 (Resource)을 미리 로드하여 저장하는 기능입니다. 캐싱을 사용하면 자원을 반복적으로 로드하지않아도 되므로 게임성능을 향상시킬수 있습니다.

19. 유니티에서 블렌드 트리란 무엇인가요?
블렌드 트리는 여러개의 애니메이션을 조합하여 새로운 애니메이션을 만드는 기능입니다.
블렌드 트리는 Animator 컴포넌트에서 설정할수 있으며 각 애니메이션의 가중치를 설정하여 조합할수 있습니다.
블렌드 트리를 사용하여 게임 캐릭터의 움직임을 자연스럽게 구현할수 있으며 게임의 그래픽 품질을 향상시킬수 있습니다.

20.게임루프와 델타 타임에 대한 이해
게임 루프(Game Loop)는 게임 엔진이 게임 상태를 갱신하고 그래픽을 렌더링하는 방식을 제어하는 루프입니다. 일반적으로 게임 루프는 다음과 같은 단계로 구성됩니다:

입력(Input): 사용자 입력을 감지하고 처리합니다.
로직 업데이트(Update Logic): 게임 상태를 업데이트하고, 오브젝트의 움직임, 충돌, 상호작용 등을 처리합니다.
렌더링(Rendering): 게임 화면을 렌더링하고 사용자에게 보여줍니다.
델타 타임(Delta Time)은 게임 루프의 각 단계 사이의 시간 간격을 나타내는 값입니다. 이는 게임이 실행되는 장치의 성능에 관계없이 일정한 게임 경험을 제공하는 데 사용됩니다. 게임에서 오브젝트를 이동하거나 애니메이션을 재생할 때, 델타 타임을 사용하여 프레임 간 시간 간격을 곱해 속도나 이동 거리를 조절하는 등의 작업을 수행합니다. 이를 통해 게임이 고정된 속도로 동작하게 되어 다양한 환경에서 일관된 경험을 제공할 수 있습니다.

21.Mono와 IL2CPP
Mono와 IL2CPP는 Unity 게임 엔진에서 사용되는 스크립팅 백엔드(백엔드 컴파일러)입니다.

Mono: Mono는 Unity의 기본 스크립팅 백엔드 중 하나입니다. C# 코드를 중간 언어로 컴파일하고 실행할 수 있는 플랫폼 중립적인 환경을 제공합니다. 이는 C# 코드를 해당 플랫폼에서 실행 가능한 기계어로 변환하기 위한 JIT(Just-In-Time) 컴파일러를 사용합니다. Mono는 Unity가 여러 플랫폼에서 실행될 수 있도록 하는 데 기여하고 있습니다.

IL2CPP: IL2CPP는 Unity의 다른 스크립팅 백엔드 중 하나로, C# 코드를 C++ 코드로 변환하여 더 빠른 성능을 제공합니다. IL2CPP는 C# 소스 코드를 중간 언어(IL)로 컴파일하고, 이후 해당 IL을 특정 플랫폼의 네이티브 코드로 변환하여 실행합니다. 이 방식은 게임의 성능을 최적화하고 메모리 사용량을 줄이는 데 도움을 줄 수 있습니다.

22.Update, FixedUpdate, LateUpdate
Unity에서 스크립트의 수명 주기에는 세 가지 주요한 메서드가 있습니다.

Update(): Update 메서드는 매 프레임마다 호출됩니다. 게임 오브젝트의 위치, 회전, 크기 등의 변화를 업데이트하는 데 사용됩니다. 주로 게임 로직, 사용자 입력 처리, 애니메이션 업데이트 등에 사용됩니다.

FixedUpdate(): FixedUpdate 메서드는 일정한 시간 간격으로 호출됩니다. 시간 간격은 프레임 속도와 관계없이 일정합니다. 물리 시뮬레이션 업데이트와 관련된 작업(예: 리지드바디 이동)에 사용됩니다. 보통 물리 엔진 작업을 처리하기 위해 사용됩니다.

LateUpdate(): LateUpdate 메서드는 모든 Update 메서드가 실행된 후에 호출됩니다. 주로 카메라의 위치, 타겟을 추적하거나 오브젝트의 위치를 조정하는 데 사용됩니다. 다른 오브젝트들이 움직인 후에 카메라를 이동시키는 등의 작업에 적합합니다.

이러한 함수들은 Unity에서 게임 오브젝트의 상태 및 동작을 관리하는 주요한 수명 주기 메서드입니다. 이들을 적절하게 활용하여 게임의 정상적인 동작과 성능을 보장할 수 있습니다.

23.Awake, Start, OnEnable, OnDisable, OnDestroy
Unity에서 스크립트와 게임 오브젝트의 라이프사이클 관리를 위해 사용됩니다.

Awake(): Awake 메서드는 스크립트가 처음으로 활성화될 때 호출됩니다. 이 메서드는 Start 메서드보다 먼저 호출되며, 게임 오브젝트가 활성화될 때마다 호출되는 초기화 용도로 사용됩니다.

Start(): Start 메서드는 스크립트가 활성화되고 첫 프레임이 렌더링되기 직전에 호출됩니다. 게임 오브젝트가 활성화된 후 한 번만 호출되며, 일반적으로 초기화나 설정 작업을 수행하는 데 사용됩니다.

OnEnable(): OnEnable 메서드는 게임 오브젝트가 활성화될 때마다 호출됩니다. Start 메서드와 비슷하게 작동하지만, Start는 처음 한 번만 호출되고, OnEnable은 활성화될 때마다 호출됩니다.

OnDisable(): OnDisable 메서드는 게임 오브젝트가 비활성화될 때마다 호출됩니다. 해당 오브젝트가 더 이상 렌더링되지 않거나 상호작용하지 않는 경우 호출됩니다.

OnDestroy(): OnDestroy 메서드는 게임 오브젝트가 파괴될 때 호출됩니다. 해당 오브젝트가 메모리에서 해제될 때 수행해야 하는 마무리 작업이 필요한 경우에 사용됩니다.

23.스태틱 게임오브젝트와 배칭
스태틱 게임 오브젝트 (Static Game Object):

스태틱 게임 오브젝트는 오브젝트의 위치, 회전 및 크기가 게임 실행 중에 변경되지 않는 오브젝트를 의미합니다.
이러한 오브젝트는 일반적으로 환경 요소나 장식 요소 등으로 사용됩니다.
스태틱 오브젝트의 경우 물리 시뮬레이션에서 최적화되어 처리될 수 있어 게임의 성능을 향상시킬 수 있습니다.
주로 레벨 디자인이나 환경 설계에 사용됩니다.
배칭 (Batching):

배칭은 그래픽스에서 사용되는 기술로, 여러 개의 그래픽 요소들을 하나의 묶음(batch)으로 처리하여 렌더링 성능을 최적화하는 기법입니다.
정적 배칭(Static Batching)과 동적 배칭(Dynamic Batching)이 있습니다.
정적 배칭은 게임 오브젝트가 변경되지 않는 경우 적용되며, Unity에서는 자동으로 처리됩니다. 이는 비슷한 속성을 갖는 정적 오브젝트를 하나의 배치로 합쳐 렌더링 성능을 향상시킵니다.
동적 배칭은 런타임 중에도 게임 오브젝트가 변경되어도 적용될 수 있는 방식입니다. Unity에서는 GPU 인스턴스화, 스크립트로 배칭 처리하는 등의 방법으로 이를 구현할 수 있습니다.
이러한 개념들은 게임의 최적화와 성능 향상에 매우 중요하며, 게임 개발 중에 고려되어야 합니다. 성능 개선을 위해 배칭을 최대한 활용하고, 환경 요소 등 변경되지 않는 오브젝트에는 스태틱 플래그를 사용하여 최적화하는 것이 일반적인 개발 관행

24.드로우 콜과 배치
드로우 콜 (Draw Call):

드로우 콜은 GPU에게 렌더링할 오브젝트를 그리라고 명령하는 것을 의미합니다.
각각의 드로우 콜은 오브젝트의 한 번의 렌더링을 나타냅니다.
게임 엔진은 화면에 보이는 요소들을 렌더링하기 위해 드로우 콜을 사용합니다.
많은 수의 드로우 콜이 있으면 그만큼 GPU가 그려야 할 렌더링 작업이 많아져 성능에 영향을 줄 수 있습니다.
배치 (Batching):

배치는 GPU에서 처리할 작업을 최소화하여 성능을 향상시키는 기술입니다.
정적 배칭(Static Batching)과 동적 배칭(Dynamic Batching)으로 나뉩니다.
정적 배칭은 게임 오브젝트가 변경되지 않는 경우에 적용되며, 유니티에서는 유사한 속성을 가진 정적 오브젝트들을 하나의 배치로 합쳐 성능을 향상시킵니다.
동적 배칭은 런타임 중에도 게임 오브젝트가 변경되어도 적용되는 방식입니다. 유니티에서는 GPU 인스턴스화, 스크립트로 배칭 처리하는 등의 방법으로 이를 구현할 수 있습니다.

25.렌더링 파이프라인 (큐브 하나를 게임뷰에 그리기 위해 유니티 코어 로직에서 일어나는 일)
게임 오브젝트 생성:

큐브 오브젝트를 생성합니다. 이는 유니티 편집기 상에서 Inspector 뷰에서 Create 메뉴를 이용하거나 스크립트로 생성할 수 있습니다.
컴포넌트 추가:

큐브에 렌더러(Renderer) 컴포넌트를 추가합니다. 이는 MeshRenderer 또는 SpriteRenderer 등의 컴포넌트입니다.
필요에 따라 Material을 생성하여 렌더러의 Material 속성에 할당합니다.
카메라 설정:

게임 뷰에 렌더링될 카메라를 설정합니다. Main Camera 또는 사용자 지정 카메라를 사용할 수 있습니다.
렌더링 프로세스:

렌더링은 여러 단계로 구성됩니다. 이 중에서 주요한 단계는 다음과 같습니다:
오브젝트의 좌표계 변환: 큐브의 위치, 회전 및 스케일을 월드 좌표계(World Coordinate)로 변환합니다.
뷰 프러스텀(View Frustum)에서의 클리핑: 카메라 뷰 안에 들어오는 부분만 렌더링하도록 하는 프로세스입니다.
뷰 포트 변환: 뷰 포트(Viewport)로 변환하여 실제 디바이스 화면에 그려지는 영역으로 변환합니다.
쉐이더 프로그램 실행: 렌더러가 가진 Material에 설정된 쉐이더 프로그램을 실행하여 렌더링합니다.
렌더 텍스처에 그리기: 결과를 렌더 텍스처(Render Texture) 또는 백 버퍼(Back Buffer)에 그립니다.
디바이스 출력:

렌더 텍스처나 백 버퍼에 그려진 결과를 실제 디바이스 화면에 출력합니다.

26.최적화 전략 수립 과정
프로파일링(Profile):
프로파일링 도구를 사용하여 게임의 성능을 분석합니다. 어떤 부분에서 자원이 많이 사용되고 있는지를 확인합니다.
CPU, GPU, 메모리 등의 성능 및 사용량을 분석하여 병목 현상을 파악합니다.

병목 현상 식별:
프로파일링 결과에서 가장 비효율적으로 동작하는 부분을 식별합니다. CPU 연산, GPU 사용, 메모리 할당 등에서 발생하는 병목 현상을 파악합니다.

옵티마이징 대상 선택:
발견된 병목 현상 중에서 가장 중요한 영역을 선택하여 최적화 대상으로 선정합니다. 게임 전체에 영향을 미치는 부분부터 시작하는 것이 좋습니다.

알고리즘 및 구조 개선:
코드 리팩터링을 통해 효율적인 알고리즘으로 대체하거나, 데이터 구조를 개선하여 자원 사용량을 최적화합니다.
불필요한 반복문, 메모리 누수 등을 수정하여 성능 향상을 이끌어냅니다.

리소스 최적화:
이미지, 사운드 등의 리소스를 압축하거나 최적화하여 로딩 시간과 메모리 사용량을 최소화합니다.
LOD(레벨 오브 디테일)를 사용하여 모델링의 디테일을 거리에 따라 다르게 표현함으로써 GPU 부담을 줄입니다.

데이터 관리:
데이터 관리를 효율적으로 합니다. 데이터를 직렬화하고 압축하는 방식을 선택하여 메모리 사용을 최적화합니다.

테스팅 및 반복:
최적화를 적용한 후에는 반드시 테스트를 거쳐 성능 변화를 확인하고 반복합니다. 종종 최적화는 예상치 못한 문제를 발생시킬 수 있기 때문입니다.

27.Fake Null에 대해
"Fake Null"은 실제로는 널(null)이 아닌 것처럼 동작하는 객체를 말합니다. 일부 프로그래밍 언어나 라이브러리에서 널을 대체하거나 흉내내는데 사용됩니다. C# 언어에서는 널(null)을 흉내 내기 위해 다음과 같은 방법들을 사용할 수 있습니다:

널 객체 패턴 (Null Object Pattern):
객체 지향 디자인 패턴 중 하나로, 실제 널(null)을 대체하는 객체를 생성하여 반환합니다. 이 객체는 일반적으로 널(null)일 때 반환되는 객체와 동일한 인터페이스를 갖고 있지만, 빈 동작이나 기본 값을 반환하도록 설계됩니다.

옵셔널(Nullable) 타입:
C#에서 Nullable 타입은 널을 포함할 수 있는 특별한 형식으로, 일반적으로 값 타입인 int, float 등을 널을 허용하는 형태로 선언할 수 있습니다.

널 조건부 연산자 (Null Conditional Operator):
C#에서는 ?. 연산자를 사용하여 객체가 널(null)인지 아닌지를 검사하고 널일 경우 해당 연산을 실행하지 않고 널을 반환합니다.

널 병합 연산자 (Null Coalescing Operator):
?? 연산자는 객체가 널(null)인 경우, 대체값을 지정할 수 있도록 합니다. 객체가 널(null)이 아니면 해당 객체를 그대로 반환하고, 널일 경우 지정된 대체값을 반환합니다.
"Fake Null"은 객체를 널(null)과 유사하게 동작하도록 만들어 프로그램의 안정성을 높이고 예외 상황을 방지하기 위한 방법 중 하나입니다. 하지만 이는 널(null)에 대한 개념을 바꾸는 것이 아니며, 개발자가 의도적으로 널을 대체하거나 처리하기 위한 방법으로 사용됩니다.

28.Dictionary의 Key로 Enum 사용
Enum을 Dictionary의 Key로 사용하는 것은 꽤 일반적인 패턴 중 하나입니다. Enum은 정수 값을 갖기 때문에 고유한 값들을 정의하는 데 유용하며, 이러한 특성을 활용하여 Dictionary의 Key로 활용할 수 있습니다

29.유니티 메인 스레드
Unity는 싱글 스레드 환경에서 주로 작동하며, 이는 Unity 엔진의 내부 동작에 영향을 미칩니다.
메인 스레드는 게임의 주된 실행 스레드이며, 게임 오브젝트와 컴포넌트들의 수명 주기 함수(Update, FixedUpdate, LateUpdate 등)가 이 스레드에서 실행됩니다. 그렇기 때문에 이러한 함수들은 주로 메인 스레드에서 호출되며, Unity에서는 이를 'Unity 메인 스레드'라고 부릅니다.

일반적으로 게임 로직은 Unity 메인 스레드에서 실행됩니다. 멀티 스레딩을 사용하여 Unity 메인 스레드 이외의 스레드에서 작업을 수행하는 것은 권장되지 않습니다. Unity는 스레드 간에 자원 공유나 Unity 엔진의 내부 동작과 충돌할 수 있는 문제들이 발생할 수 있기 때문입니다.

30.게임오브젝트가 뭔지 ?
게임오브젝트는 게임 내의 모든 엔티티와 물체를 나타내는 기본 단위입니다. 게임오브젝트는 게임 월드에서 캐릭터, 아이템, 환경요소 등과 같은 모든 것들을 대표하며, 시각적, 청각적, 물리적인 요소를 가질 수 있습니다.

게임오브젝트는 여러 컴포넌트들을 포함하고 있습니다. 예를 들어, Transform 컴포넌트는 게임오브젝트의 위치, 회전 및 크기를 결정하며, 다른 컴포넌트들은 이벤트를 처리하거나 물리적인 특성을 제어할 수 있습니다.

31.물리에대해 설명하자면 ?
유니티에서는 다양한 물리 엔진을 통해 물리 시뮬레이션을 구현할 수 있습니다. 유니티의 물리 시스템은 리지드바디(Rigidbody) 컴포넌트와 콜라이더(Collider) 컴포넌트를 이용해 오브젝트 간의 충돌 및 상호작용을 시뮬레이션합니다.

리지드바디는 오브젝트의 물리적 특성을 정의하는데 사용되며, 중력, 질량, 속도, 회전 등의 속성을 제어합니다. 콜라이더는 오브젝트의 충돌 영역을 정의하고, 이를 통해 다른 오브젝트와의 상호작용을 처리합니다.

물리 시뮬레이션은 물체 간의 충돌, 중력, 운동, 회전 등을 시뮬레이션하여 게임 내 요소들의 현실적인 동작을 구현합니다. 이를 통해 사용자 경험을 향상시키고, 게임 세계를 더 현실적으로 만들 수 있습니다.

32.애니메이션이 뭔지 ?
캐릭터, 물체 또는 환경을 움직이고 시각적으로 변화시키는 과정을 말합니다. 이러한 움직임과 변화는 주로 다음과 같은 상황에서 사용됩니다:

캐릭터 애니메이션: 유니티에서는 캐릭터가 걷거나 뛰거나, 특정 행동을 할 때 애니메이션을 적용할 수 있습니다. 이는 캐릭터가 공격하거나 점프하는 등의 행동을 했을 때 동작을 보여주는 것을 의미합니다.

물체 애니메이션: 물체의 움직임과 상호작용을 표현하는데 사용됩니다. 이것은 문이 열리거나 닫히는 것, 물체가 움직이는 것 등을 의미합니다.

환경 애니메이션: 배경과 레벨 디자인의 움직임을 제어하며, 이는 바람이 불거나 물결이 일때의 움직임을 말합니다.

이러한 애니메이션들은 유니티의 애니메이션 시스템을 이용하여 생성하고 제어됩니다. 유니티에서는 Animation 컴포넌트를 통해 오브젝트의 애니메이션을 제어할 수 있으며, Animator 컴포넌트를 사용하여 여러 애니메이션을 관리하고 조합할 수 있습니다.

33. 스크립터블 오브젝트란 ?
"스크립터블 오브젝트"는 유니티에서 데이터를 저장하고 조작하기 위한 스크립트입니다. 이는 게임 오브젝트에 연결된 컴포넌트가 아니라 데이터만을 저장하는 스크립트로, 유니티에서 게임에 사용되는 여러 설정, 변수, 리소스, 그리고 데이터를 캡슐화하여 저장할 수 있게 해줍니다.

34.메쉬란 , 스킨드메쉬란
Mesh는 3D 모델의 기본 구성 요소로, 폴리곤, 버텍스, 인덱스, UV 매핑 등과 같은 데이터를 담고 있는 정적인 3D 모델을 나타냅니다.
SkinnedMesh는 뼈대(bone)와 메쉬를 결합하여 애니메이션과 변형을 적용할 수 있는 3D 모델을 나타냅니다.

profile
Unity Game Developer

1개의 댓글

comment-user-thumbnail
2024년 8월 1일

좋은 글 잘 보았습니다. 감사합니다.

답글 달기