말감로그

24.09.03 Unity_C# - 유니티 기본 질문 정리 본문

TIL

24.09.03 Unity_C# - 유니티 기본 질문 정리

habbn 2024. 9. 3. 17:03
728x90

유니티의 두 공간 좌표

Local Space

각각의 개별적인 게임 오브젝트의 지역 공간을 의미한다. 각 오브젝트는 자체적인 좌표계를 가지며, 이 좌표계를 기준으로 위치, 회전 및 크기가 정의된다.

 

World Space

전체 게임 세계를 의미한다. 모든 게임 오브젝트는 월드 공간 내에서 상대적인 위치, 회전 및 크기를 가지고 있다. 월드 공간은 모든 로컬 공간의 기준이 되며 , 모든 오브젝트는 월드 공간으로 변환될 수 있다.

 

두 공간 사이의 변환이 필요한 이유

객체가 위치하고 움직이는 방식에 따라 다르게 처리되어야 하는 상황이 많기 때문이다. 

 

로컬에서 월드로 변환

transform.TransformDirection(Vector3 direction)

 

월드에서 로컬로 변환

transform.InverseTransformDirection(Vector3 direction)


그래픽 파이프라인

그래픽 처리에 관련된 작업의 흐름을 의미한다. Unity의 그래픽 파이프라인은 게임 오브젝트가 화면에 표시되기까지의 과정을 제어하고 조정한다.

 

1. 랜더링 설정 : 게임 오브젝트의 렌더러를 설정하고 라이팅, 쉐이딩, 그림자 등의 렌더링 옵션을 결정한다.

2. 랜더링 버퍼 준비 : 화면에 렌더링될 내용을 저장할 메모리 버퍼를 할당하고, 필요한 텍스처를 생성한다.

3. 랜더링 패스 실행 : 랜더링 패스는 카메라의 시야 내에 있는 게임 오브젝트들을 처리하고 렌더링한다. 이 과정에서는 렌더링 설정에 따라 여러 번의 패스가 실행될 수 있다.

4. 후처리 및 화면 출력 : 렌더링된 결과물에 후처리 효과를 적용하고, 최종적으로 화면에 출력한다.

 

종류

1. Built - in Render Pipeline : 기본적으로 제공되는 렌더 파이프라인

2. Scriptable Render Pipeline (SRP) : 사용자 정의 가능한 렌더 파이프라인 프레임워크

  • Univeral Render Pipeline (URP) : SRP 기반으로 다양한 플랫폼에서 고성능과 그래픽 품질의 균형을 제공
  • High Defintion Render Pipeline (HDRP) : SRP 기반으로 고사양 하드웨어에서 최고 수준의 그래픽 품질을 제공

 

Quality와 파이프라인 차이

 

Unity에서의 'Quality' 설정은 그래픽 파이프라인의 성능과 시각적 품질을 조절하는 데 사용된다. 이 설정은 프로젝트의 특정 요구 사항에 맞게 그래픽 렌더링의 성능과 품질을 조정하는 데 도움이 된다.

Unity의 Quality 설정은 프로젝트의 성능 요구 사항과 타겟 플랫폼에 따라 다양한 조정이 가능하다. 이 설정을 통해 게임을 더 빠르게 실행하거나 그래픽 품질을 더 높일 수 있따. 따라서 Unity의 Quality 설정은 그래픽 파이프라인의 성능을 변화시키는 데 중요한 역할을 한다.


유니티 질문

게임오브젝트란?

게임 오브젝트는 게임 내의 모든 엔티티와 물체를 나타내는 기본 단위이다.

게임 오브젝트는 게임 월드에서 캐릭터, 아이템, 환경 요소 등과 같은 모든 것들을 대표하며 시각적, 청각적, 물리적인 요소를 가질 수 있다.

 

머티리얼(Material)란 ?

게임 오브젝트의 렌더링 효과를 결정하는 속성을 가진 컴포넌트다. 쉐이더와 텍스처를 조합하여 게임 오브젝트의 색상, 질감, 광택 등을 제어할 수 있다.

 

프리팹(Prefab)이란?

게임 오브젝트를 미리 만들어 놓고 필요할 때마다 인스턴스화하여 사용할 수 있도록 하는 기능이다.

프리팹은 씬에서 사용되는 일반적인 게임 오브젝트와 달리 프로젝트에 저장되어 있으며 필요할 때마다 가져와 사용할 수 있다. 이를 통해 게임 오브젝트의 중복 생성을 줄이고 효율적인 게임 개발을 가능하게 한다.

 

쉐이더란?

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

 

빌드란?

게임을 실행가능한 상태로 만드는 작업을 말한다. 이 작업을 통해 플랫폼 별로 게임을 빌드하여 사용자에게 제공할 수 있다

 

콜라이더와 리지드바디의 차이는?

콜라이더는 충돌 감지를 위한 컴포넌트이고,

리지드 바디는 물리엔진과 상호작용하기 위한 컴포넌트이다.

 

콜라이더는 게임오브젝트가 다른 게임 오브젝트와 충돌하는 것을 감지하고 이에 대한 이벤트를 발생시킨다.

리지드바디는 물리엔진에서 게임 오브젝트의 물리적인 움직임을 제어하며 콜라이더와 함께 사용하여 게임 오브젝트 간 충돌 및 반응을 구현한다.

 

코루틴이란?

코루틴은 프로그램의 실행을 일시 중지하고, 나중에 다시 시작할 수 있도록 하는 기능이다. 유니티에서는 코루틴을 사용하여 일시 중지 및 실행을 반복하는 작업을 구현하거나, 복잡한 작업을 분할하여 처리하는 등의 작업에 사용된다.

예를 들어 게임에서 대기 시간을 주기 위해 코루틴을 사용할 수 있다.

 

코루틴을 사용하는 이유?

코루틴은 일정시간 간격을 두고 코드를 실행하거나 일시 중지하고 다시 시작하는 기능을 제공한다.

이를 통해 비동기적으로 코드를 실행할 수 있으며 게임 성능을 향상 시킬 수 있다.

 

유니티에서 객체를 생성하는 방법은?

Instantiate 메서드를 사용하여 객체를 생성할 수 있다. 이 메서드는 프리팹을 사용하여 새로운 게임 오브젝트를 만들거나 이미 있는 게임 오브젝트의 복제본을 만들 수 있다.

 

유니티에서 동적으로 UI를 조작하는 방법은?

유니티에서는 UI요소를 코드로 조작할 수 있다. 예를 들어, Text 컴포넌트의 text 속성을 변경하여 텍스트를 변경할 수있다.

 

유니티에서 상속을 사용하는 이유?

코드 재사용성을 높일 수 있기 때문이다. 또한 상속을 사용하면 유지보수성을 높일 수 있다. 

만약 Enemy 스크립트에서 수정이 필요한 경우, 상속받은 모든 클래스에서 수정 내역이 반영된다.

 

레이케스트란?

물체와 충돌체를 검사하는 기능이다.

레이케스트는 게임에서 화면을 통해 물체에 광선을 쏘아 해당 위치에 대한 정보를 가져오는 기능이다. 

 

유니티에서 애니메이션과 애니메이터의 차이는?

애니메이션은 게임 오브젝트의 동작을 미리 만들어 놓은 애니메이션 클립으로 제어하는 기능이다.

애니메이션 클립을 만들고 각각의 동작을 구성하는 키프레임을 설정하여 사용한다.

 

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

 

유니티에 애니케이션을 구현하는 방법?

Animation 컴포넌트를 사용하는 방법과 Animator 컴포넌트를 사용하는 방법이 있다.

Animation 컴포넌트는 키 프레임 기반의 애니메이션을 지원하며

Animator 컴포넌트는 상태 기반의 애니메이션을 지원한다.

애니메이션을 만들기 위해서는 애니메이션 클립을 만들고 애니메이션 컨트롤러에 추가하여 구현할 수 있다.

 

물리엔진이란?

유니티에서의 물리엔진은 게임 오브젝트의 물리 동작을 시뮬레이션하는 기능이다.

이를 통해 물리 법칙에 따라 물체가 움직이고 충돌하는 모습을 자연스럽게 구현할 수 있다.

유니티에서의 물리 엔진은 충돌, 중력, 마찰력 등을 다룰 수 있다.

 

유니티에서 메시지를 보내는 방법?

메시지를 보내는 방법은 SendMessage() , SendMessageUpwards(), BroadCastMessage() 등이 있다.

SendMessage() 메서드는 특정 게임 오브젝트에 대해 메시지를 보내며, 

SendMessageUpwards() 메서드는 상위 게임 오브젝트로부터 메시지를 보낸다.

 

브로드캐스트와 샌드메시지의 차이?

브로드캐스트는 SendMessage 메서드를 사용하여 모든 게임 오브젝트에 메시지를 보내는 것을 의미한다.

샌드 메시지는 특정 게임 오브젝트에 대해 SendMessage를 사용하여 메시지를 보내는 것이다.

 

게임 루프와 델타 타임에 대한 이해

게임 루프(Game Loop)는 게임 엔진이 게임 상태를 갱신하고 그래픽을 렌더링하는 방식을 제어하는 루프이다.

일반적으로 게임 루프는 다음과 같은 단계로 구성된다.

 

입력(Input() : 사용자 입력을 감지하고 처리한다.

로직 업데이트(Update Logic) : 게임 상태를 업데이트하고, 오브젝트의 움직임, 충돌, 상호 작용 등을 처리한다.

렌더링(Rendering) : 게임 화면을 렌더링하고 사용자에게 보여준다.

델타 타임(Delta Time) : 게임 루프의 각 단계 사이의 시간 간격을 나타내는 값이다. 이는 게임이 실행되는 장치의 성능에 관계없이 일정한 게임 경험을 제공하는 데 사용된다. 게임에서 오브젝트를 이동하거나 애니메이션을 재생할 때, 델타 타임을 사용하여 프레임 간 시간 간격을 곱해 속도나 이동 거리를 조절하는 등의 작업을 수행한다. 이를 통해 게임이 고정된 속도로 동작하게 되어 다양한 환경에서 일관된 경험을 제공할 수 있다.

 

드로우 콜과 배칭

드로우 콜(Draw Call) 은 GPU에게 렌더링할 오브젝트를 그리라고 명령하는 것을 의미한다.

각각의 드로우 콜은 오브젝트의 한 번의 렌더링을 나타낸다. 게임 엔진은 화면에 보이는 요소들을 렌더링하기 위해 드로우 콜을 사용한다. 많은 수의 드로우 콜이 있으면 GPU가 그려야 할 렌더링 작업이 많아져 성능에 영향을 줄 수 있다.

 

배칭(Batching)은 GPU에서 처리할 작업을 최소화하여 성능을 향상시키는 기술이다.

정적 배칭과 동적 배칭으로 나뉘는데,

정적 배칭은 게임 오브젝트가 변경되지 않는 경우에 적용되며, 유니티에서는 유사한 속성을 가진 정적 오브젝트들을 하나의 배치로 합쳐 성능을 향상시킨다. 

동적 배칭은 런타임 중에 게임 오브젝트가 변경되어도 적용되는 방식이다. 유니티에서는 GPU 인스턴스화, 스크립트로 배칭 처리하는 등의 방법으로 이를 구현할 수 있다. 스프라이트 아틀라스로 편리하게 배칭 가능하다.

 

 

 

https://usingsystem.tistory.com/472

https://jsland-dd.tistory.com/entry/Unity-%EA%B3%B5%EA%B0%84-%EB%B3%80%ED%99%98-World-Local

728x90