본문 바로가기
TIL

[TIL] 20230327 - 20230331 성장일지

by 마두식 2023. 3. 31.
반응형
Unreal Engine 5.1
  • Glossary

-  Dependency Injection

=>  I need another object but can't find it myself.

 

  • Sleep

-  물리 엔진이 오브젝트가 움직이지 않을 때 자동으로 비활성화 되는 모드

=>  오브젝트가 더 이상 움직이지 않을 때 물리 엔진이 이를 인식하고, 해당 오브젝트의 물리 계산을 일시 중단시키는 것.


-  Sleep Family

=>  현재 오브젝트를 sleep 상태로 전환할 시기를 고려할 때 사용되는 값 세트.
=>  Normal, Sensitive, Custom 중에 선택할 수 있다.


-  Custom Sleep Threshold Multiplier

=>  Sleep Family가 Custom으로 설정된 경우 자연 슬립 한계치에 이 값을 곱한다.
==>  자연 슬립 한계치와 이 값을 곱한 결과보다 바디(오브젝트)의 운동 에너지나 회전 에너지가 작으면 sleep 상태로 전환된다.
=>  숫자가 클수록 바디는 더 빨리 sleep 상태로 전환된다.
=>  수치가 너무 클 경우 sleep 상태에서 빠져나오기 힘들어 질 수 있고, 너무 작을 경우 sleep 상태에 들어가기 너무 어려워져서 문제가 생길 수 있다.
=>  일반적으로 10 이하의 값을 사용한다.

 

  • 현재 오브젝트를 grab 하는 과정에서 오브젝트가 sleep 상태에 빠져있을 때 그냥 grab 하게되면 문제가 발생할 수 있다.

-  오브젝트를 grab하기 전 물체를 wake 시켜주는 과정이 필요하다.

※  Collision Filtering Blog Post : Collision Filtering

  • Construct

-  액터의 Tick은 기본적으로 활성화되어 있지만, Component의 Tick은 일반적으로 꺼져있다.

=>  최적화를 위해


-  Component의 Tick을 사용하려면 생성자에서 Tick을 활성화 해주어야 한다.

-  생성자에 대한 변경사항이 LiveCoding에서는 제대로 동작하지 않을 수 있다.

=>  생성자를 편집한 후에는 코드를 다시 빌드하자.


-  생성자는 begin() 보다 먼저 실행된다.

=>  전체 World를 Get해야하기 때문에 begin play보다 훨씬 이전에 생성자가 호출된다.
=>  C++ 컴포넌트의 경우 Editor에서 추가하기만 해도(Play를 하지 않아도) 생성자가 호출된다.

 

  • TArray<Type>

-  TArray::Nums()

=>  배열의 크기를 반환한다.
ex)  TArray<int> array; array.Nums() == 3;

 

  • Portable C++ code

-  C++의 int 및 unsigned int 유형은 플랫폼마다 크기가 다를 수 있으므로 정수 너비가 중요하지 않은 코드에서만 허용된다.

=>  int 대신 int32 를 사용하자

 

  • 함수 매개변수의 이름과 클래스 멤버 변수의 이름이 같으면 오류가 발생한다.
  • BluePrintCallable을 선언할 경우 에디터를 종료하고 빌드해야 적용될 수 있다.

 

  • 조명을 설치해도 화면이 계속 어두워질때

-  Volumes - PostProcessVolume를 장면에 배치
-  PostProcessVolume의 Exposure - 미터링 모드 활성화 후 미터링 모드 Auto Exposure Basic으로 변경
-  PostProcessVolume이 게임 전체 Level을 감쌀 수 있도록 Brush Setting의 X, Y, Z 크기 조절하기

  • UWorld, World

-  Unreal Engine 5.1에서도 UWorld와 World 개념은 이전 버전과 크게 다르지 않다.

-  UWorld는 Unreal Engine의 가장 핵심적인 객체 중 하나이며, 하나의 프로젝트에서 유일한 객체

=>  UWorld는 여러 개의 레벨(Level)을 포함할 수 있으며, 각 레벨은 하나 이상의 Persistent Level과 많은 Streaming Level로 구성된다.
=>  Persistent Level은 항상 로드되어 있고, Streaming Level은 필요할 때 로드되거나 언로드 된다.


-  각 레벨은 그 자체로 하나의 World를 나타냅니다. 따라서 하나의 UWorld에는 여러 개의 World가 포함될 수 있다.

ex)  여러 개의 Persistent Level이 UWorld에 로드되어 있을 수 있으며, 각 Persistent Level은 하나의 World를 가진다.


-  World는 게임의 가상 세계를 나타내며, 모든 게임 오브젝트는 World에 존재한다.

=>  World는 모든 레벨(Level)과 그 안의 모든 오브젝트를 포함한다.
=>  각 World는 독립적인 시뮬레이션을 수행하며, 이것이 게임 엔진의 멀티플레이어 지원, 레벨의 로딩 및 언로딩, 월드 간의 전환 등을 가능하게 한다.


-  즉, UWorld는 여러 개의 World를 가질 수 있으며, World는 게임의 가상 세계를 나타낸다.

  • Persistent Level과 Streaming Level

-  Unreal Engine에서는 Persistent Level과 Streaming Level을 사용하여 대규모 맵을 구성할 수 있다.

-  Persistent Level : 프로젝트에 존재하는 기본적인 레벨이며, 항상 메모리에 로드되어 있다.

=>  게임 시작 시 무조건 로드되며, 게임 중에도 항상 로드된 채로 유지
=>  보통 메인 메뉴, 게임 세팅, 게임 종료 등의 요소가 해당된다.
=>  Persistent Level은 여러 Streaming Level들을 관리하며, 모든 Streaming Level이 항상 로드되어 있지 않아도 Persistent Level만으로도 게임을 플레이할 수 있다.


-  Streaming Level : Persistent Level 외에 추가적인 레벨들을 불러올 수 있다.

=>  대규모 맵에서는 맵 데이터의 일부분을 Streaming Level로 구성하여, 필요한 경우에 해당하는 Streaming Level만 동적으로 로드하여 메모리를 절약할 수 있음.
ex)  프리로딩, 새로운 지역, 또는 다른 미션 등을 담당
=>  Streaming Level은 Persistent Level의 하위 요소로서 로드 및 언로드가 가능합니다.


-  Persistent Level은 게임에서 기본적으로 로드되는 부분이고, Streaming Level은 필요에 따라 로드하여 사용할 수 있는 부분

=>  맵을 큰 단위로 구성하여 메모리와 로딩 시간을 최적화할 수 있도록 해주는 중요한 기능입니다.

 

  • SweepSingleByChannel

-  Unreal Engine에서 사용되는 충돌 검사 함수 중 하나

-  시작 위치와 끝 위치 사이에 지정된 충돌 채널(Channel)을 가진 모든 콜리전을 검사하고, 충돌이 발생하는 경우 콜리전의 정보를 반환한다.

-  캐릭터나 물체가 이동하는 도중에 충돌 검사를 수행하고 해당 충돌 정보를 처리해야 할 때 사용된다.

ex)  캐릭터가 이동 중인 경우 이동 경로에 장애물이 있는지 검사하거나, 물체가 어떤 물체와 충돌했는지 검사할 때 이 함수를 사용할 수 있다.


-  여러 매개변수를 사용하여 호출된다.

=>  가장 중요한 매개변수는 충돌 채널(Channel)
==>  충돌 채널은 콜리전 객체의 카테고리를 나타내며, 캐릭터, 물체, 지형 등의 콜리전 객체들은 각각 다른 충돌 채널을 가지고 있다.
ex)  캐릭터는 충돌 채널을 ECC_Pawn으로, 물체는 충돌 채널을 ECC_WorldStatic으로 설정할 수 있음.
=>  그 외의 매개변수로는 시작 위치, 끝 위치, 충돌 형태, 충돌 히트 정보 등이 있다.
=>  함수가 호출되면 시작 위치와 끝 위치 사이에 지정된 충돌 채널을 가진 모든 콜리전을 검사하고, 충돌이 발생하는 경우 콜리전의 정보를 반환한다.
=>  검사 결과는 FHitResult 구조체에 저장되며, 해당 구조체에는 충돌한 객체의 정보, 충돌 위치, 충돌 방향, 충돌한 물체의 속도 등이 포함됩니다.


-  함수 실행의 결과는 bool 타입이다.

=>  충돌 물체가 있다면 true, 없다면 false

 

  • UPrimitiveComponent

-  컴포넌트 중 하나로, 가상 공간에서 실제 물리적인 역할을 하는 객체

-  UPrimitiveComponent는 3D 모델링 소프트웨어에서 만든 메쉬나 기하 도형에 대한 정보를 가지고 있으며, 이를 기반으로 물리 엔진에서 충돌 검사, 충돌 반응, 물리 시뮬레이션, 뷰 프러스텀 등의 기능을 수행한다.

-  UPrimitiveComponent는 여러 가지 유형이 있으며, 각각 다른 기능을 수행한다.

ex)  UStaticMeshComponent는 정적인 메쉬를 표시하고, USkeletalMeshComponent는 애니메이션 및 스킨 정보를 표시한다.


-  UPrimitiveComponent는 라이트맵 UV 생성, 머티리얼 정보, LOD (Level of Detail) 관리 등 다양한 기능을 제공한다.

=>  이러한 기능을 통해 UPrimitiveComponent는 가상 공간에서 물리적인 행동과 시각적인 표현을 모두 수행할 수 있다.

 

  • DetachFromActor()

-  액터를 부모 액터나 컴포넌트로부터 분리(detach)한다.

=>  DetachRootComponent() 함수를 호출하여 액터의 루트 컴포넌트를 부모 액터나 컴포넌트에서 분리함.
=>  DetachRootComponent() 함수는 해당 액터가 물리 시뮬레이션을 사용하는 경우, 물리 시뮬레이션의 상태를 유지하고 물리 시뮬레이션을 다시 시작하지 않는다.


-  DetachFromActor() 함수는 옵션 매개변수를 사용하여 DetachmentTransformRules를 지정할 수 있다.

=>  이 규칙은 분리된 액터의 변환(transform)을 어떻게 처리할지를 정의한다.
ex)  FDetachmentTransformRules::KeepWorldTransform 옵션은 액터의 현재 월드 변환(transform)을 유지하고 분리된 액터를 월드 공간에서 유지하도록 지정한다.
이 옵션은 분리된 액터가 월드 공간에서 자유롭게 이동하면서 현재 위치와 방향을 유지해야 하는 경우 유용하다.


-  DetachFromActor() 함수는 부모 액터나 컴포넌트와의 관계를 끊기 때문에, 액터를 분리한 후에는 움직이지 않는다.

=>  이후에 액터가 이동해야 하는 경우, SetActorLocation() 함수나 AddActorLocalOffset() 함수를 사용하여 액터를 이동시켜야 한다.

 

-  DetachFromActor() 함수를 실행할 때, Actor가 이미 독립된 Actor라면 함수는 아무런 동작도 하지 않고 종료된다.

 

  • UPhysicsHandleComponent::GrabComponentAtLocationWithRotation()

-  물리적으로 시뮬레이션되는 UPrimitiveComponent를 월드에서 선택하고, 지정된 위치와 회전으로 그것을 잡아주는 함수

=>  주어진 UPrimitiveComponent의 물리학적 시뮬레이션을 멈추고, 그것을 지정된 위치와 회전에 고정시킨다.


-  함수 호출 시, 함수는 월드에서 주어진 위치와 회전에 가장 가까운 UPrimitiveComponent를 찾아서, UPhysicsHandleComponent는 해당 UPrimitiveComponent를 잡아 고정하고 물리학적 시뮬레이션을 중지한다.

-  함수의 인자
1.  UPrimitiveComponent* Component: 선택하고자 하는 UPrimitiveComponent 객체
2.  const FName& BoneName: 선택된 UPrimitiveComponent의 본 이름
3.  const FVector& Location: 선택한 UPrimitiveComponent`를 잡을 위치
4.  const FRotator& Rotation: 선택한 UPrimitiveComponent`를 회전시킬 회전값

-  이 함수를 사용하여 UPhysicsHandleComponent를 사용하여 물리 시뮬레이션 컴포넌트를 조작할 수 있다.

ex)  어떤 물체를 들어 올리거나 밀어내는 등의 작업을 할 수 있습니다.

 

  • UPhysicsHandleComponent::ReleaseComponent()

-  Physics Handle 컴포넌트가 현재 잡고 있는 Primitive Component를 놓아주는 역할을 함.

-  UPhysicsHandleComponent는 특정한 Primitive Component를 잡고 있는 경우, 이를 통해 위치나 회전값을 조정할 수 있다.

=>  더 이상 해당 Primitive Component를 잡고 있을 필요가 없어진 경우, ReleaseComponent() 함수를 사용하여 놓아주게 된다.


-  이 함수를 호출하면, Physics Handle은 현재 잡고 있는 Primitive Component를 놓아주고, 놓아진 Component에 대한 레퍼런스를 NULL 값으로 초기화한다.

-  ReleaseComponent() 함수는 UPhysicsHandleComponent가 지금까지 움직였던 컴포넌트에 대한 참조를 삭제하는 함수

=>  이 함수는 이전에 그랩된 컴포넌트를 놓을 때 호출됩니다.


-  컴포넌트를 놓게되면 해당 UPhysicsHandleComponent 객체가 놓았던 컴포넌트에 대한 참조를 유지할 필요가 없어지기 때문에, 해당 컴포넌트에 대한 레퍼런스를 NULL 값으로 초기화하는 것.

=>  놓은 컴포넌트에 대한 참조가 남아 있더라도 메모리 누수를 방지할 수 있다.
=>  다음에 컴포넌트를 그랩할 때 이전의 레퍼런스가 남아 있지 않도록 해줍니다.

 

  • GetRootComponent()

-  AActor 클래스에서 상속받은 함수로, 해당 Actor의 루트 컴포넌트를 반환한다.

=>  루트 컴포넌트는 해당 Actor가 가진 모든 컴포넌트들의 부모 역할을 한다.
ex)  게임에서 플레이어 캐릭터를 제어할 때, 캐릭터를 이동하거나 회전시키기 위해서는 캐릭터의 루트 컴포넌트를 이동시켜야 한다.
루트 컴포넌트는 일반적으로 캐릭터의 콜리전 컴포넌트나 스켈레탈 메시 컴포넌트 등 중 하나가 될 수 있다.


-  GetRootComponent() 함수는 Actor가 가진 컴포넌트들 중에서 가장 중요하게 다루어져야 하는 컴포넌트를 반환하는 함수로 볼 수 있다.

-  기본적으로 Actor는 UActorComponent를 상속받은 USceneComponent를 최상위 부모 컴포넌트로 가지며, 이 USceneComponent가 Actor의 root component이다.

  • AttachToComponent()

-  AActor나 USceneComponent를 다른 AActor나 USceneComponent에 부착(attach)하고 그 위치, 회전, 스케일 등을 조정하는 데 사용된다.

-  첫번째 매개변수는 부모 AActor나 USceneComponent


-  두번째 매개변수는 부착할 때 적용되는 규칙을 정의하는 FAttachmentTransformRules 구조체

 

-  이미 다른 Actor의 자식 Actor였다면, 기존의 부모 Actor에서 제거되고 새로운 부모 Actor의 자식으로 이동하게 된다

반응형

'TIL' 카테고리의 다른 글

[TIL] 20230403 - 20230408 성장일지  (0) 2023.04.10
[TIL] 20230322 - 20230324 성장일지  (0) 2023.03.24
[TIL] 20230320 - 20230321 성장일지  (0) 2023.03.22
[TIL] 20230315 성장일지  (0) 2023.03.15
[TIL] 20230310 - 20230313 성장일지  (0) 2023.03.13

댓글