- 레벨 블루프린트를 사용한 오브젝트 사이의 통신

레벨에 존재하는 액터 선택후 레벨 블루프린트에서 우클릭하면 레퍼런스를 얻을 수 있다.

 

- 블루프린트 안에서 컴포넌트 사이의 통신

블루프린트에서 다른 블루프린트 오브젝트 레퍼런스를 프로퍼티로 저장하고 디테일 패널에서 할당

 

- 블루프린트 인터페이스를 사용하여 서로 다른 타입의 오브젝트 간에 원활하게 통신하기

 

블루프린트에서 블루프린트 인터페이스 함수를 호출 하는 것은 메세지 호출과 같다.

구현이 안되어 있으면 아무 일도 일어나지 않는다.

 

여러 항목이 한 이벤트를 처리해야 할 경우 Event Dispatcher를 사용

예) 보스가 죽었을 때 미니언이 같이 죽게 만들기

 

Event Dispatcher = C++에서 델리게이트 역할을 한다

GameMode 블루프린트에 두어 item Updated 델리게이트로 사용할 수 있다.

 

게임모드 내의 이벤트 (런타임) 에서 맵에 존재하는 액터의 레퍼런스를 얻고 싶은 경우

GetActor 류 함수를 사용 (Tag, Class 사용), 태그를 사용하는 경우 액터 태그와 컴포넌트 태그는 별개이므로 주의해야 한다.

런타임에서 액터를 찾는 함수는 느리므로 자주 사용하면 안된다. (Tick 내에서 호출 X)

 

'언리얼 5 > 에픽 게임즈 공식 강의' 카테고리의 다른 글

Gameplay  (0) 2023.02.21
Programming 2  (0) 2023.02.21
Enhanced Input Binding with Gameplay Tags C++  (0) 2023.02.21
Geometry Script  (0) 2023.02.20
Engine Structure  (0) 2023.02.20

- Game Instance

프로그램 시작 ~ 종료 내내 유지되는 오브젝트

리플리케이트되지 않음. 클라이언트와 서버 각각에 독립적으로 존재

레벨을 옮겨도 유지하고싶은 것들을 여기에 배치 (SaveGame 시스템 같은 것들)

 

- Game Mode

맵 로드시 가장 먼저 생기는 매니저 액터

서버에만 존재

멀티플레이어 게임에서 이미 만들어진 세션에 새로운 플레이어가 참여하면 GameMode가 폰 컨트롤러와 State를 만들어준다. 

 

- Game State

Player State 배열을 갖는다.

게임 상태에 대한 정보 저장

서버와 클라이언트에 리플리케이트된다.

 

- Player State

특정 플레이어에 대한 정보 저장

서버와 클라이언트에 리플리케이트된다.

 

캐릭터, 컨트롤러, 폰

- Physics

Pawns은 Kinetic 액터이기 때문에 무한한 질량을 가진다.

dynamic interaction에서 interactor만 영향을 받게된다.

Pawn에게도 영향을 주려면 추가 로직이 필요하다. (HitResult 정보를 사용하기)

 

- Default Pawn

Character의 형제 클래스

Default Pawn : 스태틱 메시 컴포넌트, Sphere 콜리전, Floating Pawn Movement 컴포넌트

Movement가 리플리케이트 되지 않음

 

- Spectator Pawn

Default Pawn의 서브 클래스

콜리전 X, Static Mesh X, 투명 카메라만 존재하는 Pawn

 

 

- Character Movement Component

네트워크에서 레플리케이트 됨

다양한 Movement Mode 보유 (walking jumping falling flying swimming

physics Interaction : physics가 movement에 어떻게 영향을 줄 것인가

 

- Movement Capability 

길찾기 관련 옵션 파라미터 (Non Player Controller의 경우)

캐릭터의 능력 (앉기, 점프, 수영하기) 활성화 여부

 

 

- Player Controller

Player Controller는 클라이언트에서 서버로 레플리케이트된다.

유저 Input과 일반적인 player pawn 관련 logic을 관리한다.

Input Latency를 최소화하기 위해 Pawn보다 먼저 Tick 된다. 

 

- AI Controller 

서버에만 존재한다. 

 

- MassEntity System프레임워크

효율적으로 대량의 데이터를 처리하게 해줌 

 

- Navigation

모바일 캐릭터에 다이나믹 NavMesh를 사용하는 것은 퍼포먼스 문제가 있다.

Pathfinding True 설정하고 AI 캐릭터에게 특정 장소로 이동하게 시키면 Navmesh를 사용해 길을 찾아서 이동한다.

 

- HUD 

리플리케이트되지 않음

플레이어 컨트롤러가 HUD 액터를 스폰함

'언리얼 5 > 에픽 게임즈 공식 강의' 카테고리의 다른 글

Blueprint Communication  (0) 2023.02.22
Programming 2  (0) 2023.02.21
Enhanced Input Binding with Gameplay Tags C++  (0) 2023.02.21
Geometry Script  (0) 2023.02.20
Engine Structure  (0) 2023.02.20

 

모든 C++ 코드(엔진, 프로젝트) 는 모듈에 속해 있다.

 

Unreal Build Tool 은 Cross-Platform 빌드 시스템이다.

 

각각의 모듈은 DLL로 컴파일된다.

 

플러그인은 모듈/ 애셋의 컬렉션이다.

플러그인을 사용하면 다른 프로젝트로 쉽게 코드를 공유할 수 있고 패키징하여 마켓플레이스에 올릴 수도 있다.

 

Feature Plugin

런타임에 활성화할 수 있는 Feature

 

Platform Extension

플랫폼 전용 코드를 독립시킨다.

 

 

UObject를 참조하는 모든 프로퍼티는 UPROPERTY 레퍼런스 이거나 Weak포인터 타입이어야 한다.

 

Struct는 Blueprint 함수를 가질 수 없다.

 

FString : 기본 String, Mutable

 

FName : global map에서 문자열을 해쉬/캐쉬 한다. FName은 단순히 인덱스를 저장하기 때문에 빠른 비교연산이 가능하다. 이름과 경로에 적합하다.

 

FText : 현지화 지원 가능한 문자열, 엔진의 Localization 시스템에서 지원한다. user face 텍스트에 사용된다.

 

LifeCycle

새로운 UObject 할당 : NewObject 함수

새로운 액터 : SpawnActor 함수

 

UObject는 다른 오브젝트들에 의해 참조되지 않으면 자동으로 제거된다.

액터는 Destroy 함수에 의해 제거되고 Garbage 컬렉터에 의해 메모리에서 제거된다.

 

UPROPERTY 매크로 없이 UObject를 만드는 경우 가비지 컬렉터에 보이지 않게 된다.

오브젝트가 컬렉팅 되었을 때 포인터가 메모리의 invalid 데이터를 가리키게 될 수 있다.

 

UObject를 가리키는 포인터

TObjectPtr

TWeakObjectPtr

TSubclassOf

TSoftPtr

TSoftClassPtr

 

UObject를 가리키지 않는 포인터

TUniquePtr

TSharedPtr

TSharedRef

TWeakPtr

 

인터페이스는 C++과 Blueprint에서 선언 가능하다. 블루프린트에서 선언된 인터페이스는 다른 블루프린트에서만 사용 가능하기 때문에 C++에서 선언하기가 권장된다.

 

- Static Function Library

특정 UObject에 속하지 않는 함수, Struct에 기능을 추가할 때 좋은 방법이다.

 

Data Object

데이터 조직, 로딩 방법을 제공한다.

- Data Asset, Data Table, Curve

 

- Delegate & Event

C++에서 이벤트를 구독하고 싶다면 이벤트가 구현되어 있어야 한다.

 

- Subsystem

기존의 클래스를 수정하지 않고도 기능을 확장할 수 있게 해준다.

전역에서 접근할 수 있다.

 

- Async Task Graph

다수의 CPU core에서 실행시키고 싶은 작업하고 싶을때 사용한다.

내부적으로 Thread pool을 사용한다.

 

 

맵 로드나 소프트 레퍼런스를 사용한 Object 로드 요청은 사용자에 의해 핸들링 가능하다.

하드 레퍼런스는 parent Asset에 의해 재귀적으로 로드된다.

 

하드 레퍼런스는 편리하지만 어떤 한 애셋이 프로젝트 나머지 애셋을 모두 참조하는 상황이 만들어지면 메모리와 로드 시간에 문제가 생길 수 있다.

 

가비지 컬렉터는 레퍼런스되지 않거나 Pending Kill 상태인 오브젝트를 1분에 한번씩 제거한다. 이 기능은 오버라이드 될 수 있다.

 

가비지 컬렉터는 Mark & Sweep 메서드를 사용한다. 멀티 쓰레드 작업이며 1프레임에 진행된다. 하지만 실제 Object 파괴는 여러 프레임에 걸쳐 진행된다.

 

- GameMode

레벨마다 존재하는 Object

멀티 게임에서는 서버에만 존재

레벨 변화 시 초기화되므로 데이터 저장에 적합하지는 않음

 

- GameInstance

애플리케이션 라이프타임을 가짐

global singleton이어서 전역에서 접근 가능

 

- GameState

서버에서 클라이언트로 Replicated됨

게임 정보

 

- PlayerState

서버에서 클라이언트로 Replicated 됨

개인 정보

 

- PlayerController

플레이어 컨트롤러는 소유한 클라이언트와 서버에만 존재한다.

 

- Movement Component

다양한 무브먼트 모드 지원

예측을 사용하기 떄문에 온라인에서도 지원되는 기능

 

- Cheat Manager

콘솔 커맨드를 사용하여 기능을 구현할 수 있다.

Ship할때는 지워짐

 

- Ticking

두 그룹으로 나눌 수 있다. Physics 도중, Physics 전

Transform이나 Collision을 사용하지 않는다면 Physics 도중에 틱하는게 좋다.

오브젝트마다 Tick rate, Tick dependency, Tick 활성화 여부를 결정할 수 있다.

Tick은 싱글 스레드로 실행되기 때문에 게임 성능에 중요하다.

매 프레임 Tick할 필요가 없는 오브젝트에 대해서는 Tick Frequency를 줄이자.

 

- Gameplay Ability System

Gameplay Ability를 다루는 멀티플레이어 지원 프레임워크

 

- Mass

많은 수의 개체에 대한 행동을 State Graph를 사용하여 분산 실행하여 다루는 방법

 

- Game Feature 

런타임에서 게임 기능을 켜고 끌 수 있는 플러그인

게임 모드를 컴포넌트 처럼 사용하는 것?

 

 

- 액터 리플리케이션

UProperty 혹은 컴포넌트 전체를 리플리케이트 할 수 있다.

 

- RepNotify

리플리케이트 설정한 변수 값이 바뀌었을 때 로직을 실행할 수 있게 해준다.

 

- OwnerShip

액터를 소유한 플레이어 컨트롤러만이 서버에 데이터를 보낼 수 있다.

서버는 모두에게 데이터를 보낼 수 있다.

 

- Replication Graph 플러그인

어떤 것이 다른 멀티플레이어에게 영향을 줄 것인지에 대한 규칙을 정할 수 있다.

예를 들면 Distance, Visibility 등

어떤 플레이어와 관련 있다고 간주되는 액터만 서버에서 클라이언트로 리플리케이트 하게 해준다.

대규모 멀티플레이어 게임에서 효율적으로 동작할 수 있다.

 

- Remote Procedure Calls (RPCs)

다른 클라이언트에 있는 함수를 호출할 수 있게 해준다.

RPC를 Reliable 혹은 Unreliable 하게 설정할 수 있다.

 

https://forums.unrealengine.com/t/difference-between-property-replication-and-rpc-technically/755737

 

Difference between Property Replication and RPC technically

Property Replication and RPC both replicate data between server and clients. And I have some questions about them. When they replicated? Is it end of tick or something? Is there bandwidth difference between two?

forums.unrealengine.com

 

언리얼 엔진 전용 툴, 플랫폼 전용 툴 모두 프로젝트에서 실행 가능하다.

 

- Visual Logger

Timeline Based 로깅

이벤트를 위한 디버그 비주얼과 메타데이터를 녹화한다.

별도의 구성 없이 네트워크 리플리케이션 로그도 지원한다.

 

- Console 

커맨드를 호출하거나 cVars를 수정하여 Feature를 활/비활성화 하여 Cost를 테스트할 수 있다.

나만의 콘솔 함수/변수를 만들 수 있다.

 

- Unreal Insights

Session Frontend 내부에 있던 나머지 기능들이 이것으로 대체됨

에디터 툴 메뉴에서 실행된다.

이전 툴에 없던 추가적인 기능으로 모든 스레드에서 일어나는 이벤트를 자세하게 보여준다.

메모리 할당 및 각각의 네트워크 패킷을 분석할 수 있다.

CPU, TPU 분석도 가능

에디터와 패키지 빌드 모두에서 사용할 수 있다. (Shipping Build 제외)

프로파일링 데이터를 저장하고 리플레이할 수 있다.

네트워크를 통해 다른 컴퓨터나 장치에 remote Profiling도 가능하다.

Instrumentation 매크로를 코드에 추가하여 세분화된 프로파일링을 할 수 있다.

 

- ProfileGpu

Console Command 한 프레임의 timing을 조사

 

- DumpGPU

한 프레임에서 사용된 모든 리소스들을 Interactive한 html 페이지를 사용하여 조사할 수 있게 해줌

draw Call, internal 버퍼 포함

 

- Gauntlet

빌드된 프로젝트를 실행하고 검증

멀티 플랫폼 자동화 테스트 용도

'언리얼 5 > 에픽 게임즈 공식 강의' 카테고리의 다른 글

Blueprint Communication  (0) 2023.02.22
Gameplay  (0) 2023.02.21
Enhanced Input Binding with Gameplay Tags C++  (0) 2023.02.21
Geometry Script  (0) 2023.02.20
Engine Structure  (0) 2023.02.20

Native Gameplay Tag Setup

Tag는 Native하게 정의되어 있으므로 Input Binding을 위해 참조할 수 있다. 또한 Editor에서 입력 구성을 위해 Data Asset에서도 사용할 수 있다.

싱글톤 구조체 FMyGameplayTags를 정의하고 초기화 시 NativeTag를 등록하는 로직을 구현한다.

 

MyGameplayTags.h

MyGameplayTags.cpp

 

Asset Manager

Native 게임플레이 Tag를 초기화하기 좋은 장소이다. 

StartInitialLoading 함수를 오버라이딩하고 여기서 태그를 초기화한다.

프로젝트 세팅에서 Asset Manager를 MyAssetManager로 설정하자.

 

MyAssetManager.h

MyAssetManager.cpp

 

Input Configuration

에디터의 input Action와 input tag를 연관지을 방법으로 Data asset을 사용한다. 

UInputAction과 FGameplayTag 페어를 가지는 단순한 구조체 (FTaggedInputAction) 를 사용하고, 구조체를 블루프린트에 이 타입을 노출시킨다.

Data Asset은 FtaggedInputAction의 배열을 가질 것이고 태그를 사용하여 InputAction을 찾는 헬퍼 함수도 갖게 된다.

 

InputConfig.h

InputConfig.cpp

 

Enhanced Input Component

커스텀 Enhanced Input Component : UEnhancedInputComponent::BindAction Wrapper 함수 (BindActionByTag) 소유

MyEnhancedInputComponent.h

 

Character Setup

헤더파일 : 캐릭터에 InputConfig 애셋 가리키는 포인터 추가, 동작 함수 추가.

 

구현파일 : SetupPlayerInputComponent 함수를 오버라이딩하여 캐릭터의 동작 함수와 InputAction을 연관된 게임플레이 태그를 사용하여 bind 한다.

 

Input Settings

기본 Player Input Class를 EnhancedPlayerInput으로 지정

기본 Input Component Class를 MyEnhancedInputComponent로 지정

 

Input Assets and Configuration

Input Action은 추상적인 게임 액션을 나타낸다. 

Input Action들은 bool, float vector와 같은 데이터 타입을 반환하는데, 이것들은 값을 수정하거나 트리거 규칙을 구성한다.

 

트리거 규칙은 언제 어떻게 조건을 통해 액션을 발동시킬 것인지 결정한다.

Pressed 트리거는 한번의 입력 동안 이벤트를 한 번 발생시키고 Pulse 트리거는 키 입력 동안 일정 간격으로 이벤트를 발생시킨다.

Modifier는 Input Action의 최종 출력을 조정하는 데 적용될 수 있다. 예를 들면 Dead Zone Modifier는 입력 변수를 상한선과 하한선 사이로 잘라준다.

 

Input Mapping Context

하드웨어 Input - Input Action을 매핑

플레이어가 탈것을 타는 경우에 새로운 InputMapping Context가 적용될 것이다. 

 

키보드와 마우스의 경우 바이너리 Key이므로 0-1 값을 기록한다.

Move의 경우 W와 S키에 Swizzle modifier를 적용해 1D input을 2D 액션의 Y 축에 매핑해야 한다.

A와 S에는 Negate modifier를 적용해 음수 값을 가지도록 한다.

 

 

Character Blueprint

1. 캐릭터 블루프린트에서 InputConfig 프로퍼티에 IC_BaseCharacter 데이터 애셋을 세팅

2. OnBeginPlay 이벤트에서 EnhancedInputLocalSubsystem 노드를  사용하여 Input Mapping Context 애셋을 등록한다.

3. 캐릭터를 GameMode에서 기본 Pawn으로 지정한다.

 

'언리얼 5 > 에픽 게임즈 공식 강의' 카테고리의 다른 글

Gameplay  (0) 2023.02.21
Programming 2  (0) 2023.02.21
Geometry Script  (0) 2023.02.20
Engine Structure  (0) 2023.02.20
All about Soft and Weak pointer  (0) 2023.02.20

Geometry Script 플러그인 설치

GeneratedDynamicMeshActor 상속하는 블루프린트 생성

 

박스 생성하기

Event On Rebuild Generated Mesh 노드에 Append Box 노드 연결

블루프린트 변수를 사용하여 Dynamic Mesh Object의 속성을 노출시켜 뷰포트에서 박스의 크기를 확인하며 변경할 수 있다.

 

Bake to Static Mesh

방법 1. Modeling Mode > Dynamic Mesh 선택 > Convert 

 

방법 2. 블루프린트에 함수 추가, Call In Editor 세팅 > Get Dynamic Mesh 노드와 Copy Mesh to Static Mesh Node 연결, Static Mesh 프로퍼티 추가하고 Copy Mesh 노드에 연결 

에디터에서 다이나믹 메시를 수정하고 Default 세팅에서 [함수 이름] 버튼을 눌러 스태틱 메시로 저장할 수 있다.

 

Displacement Map

Procedural displacement mesh Object 만들기

 

 

Frozen 프로퍼티를 사용하는 이유는 Normal Recompute 연산이 꽤 복잡하기 때문에 해당 Frozen 값을 False인 상태에서 메시를 월드에서 움직이면 에디터에서 느리게 동작한다.

 

액터의 Reset On Rebuild 프로퍼티의 기본값이 True여서 Frozen 을 True로 설정할 때 메시가 보이지 않을 수 있기 때문에  false로 설정해주자.

Frozen을 에디터에서 True로 설정하고 메시를 움직이면 에디터에서 빠르게 응답한다.

 

 

테셀레이션 적용 후 Displace Texture 맵을 다이나믹 메시에 적용한다.

Normal 계산은 자동으로 되는 것이 아니라서 ReCompute Normals 노드를 마지막에 배치해주어야 한다.

 

Mesh Booleans and Patterns

 

Allocate Compute Mesh 노드 : 해당 블루프린트에서 임시로 메시를 사용한다. Pool에 Request하여 얻어온다. Release 해주어야 한다.

 

Spehere 메시를 하나 할당하고, Append Mesh Repeated를 사용해 구체 4개짜리 메시를 또 할당한다.

 

메시 Boolean Subtract 연산을 사용해 Cube의 가장자리를 Sphere 메시 4개로 깎았다.

 

 

Y-to-Z-Up and Edit Pivot with an Asset Action

Unreal은 Z축이 Up벡터이기 때문에 Y축이 Up벡터인 프로그램에서 임포트한 애셋은 변형해줘야 한다.

 

Editor Utilities > Editor Utility Blueprint > Asset Action Utility

 

Get Supported Class 함수 오버라이드

Return Node 클래스를 Static Mesh로 설정 : 스태틱 메시 액터에 대해서만 액션을 지원하겠다는 의미

 

블루프린트 함수를 생성

선택한 모든 애셋에 대해 Static Mesh로 캐스팅 후 다이나믹 메시를 새로 생성

다이나믹 메시에 Static Mesh 복사 후 다이나믹 메시에 Transform Mesh 노드를 거치게 하여 회전시키고 다시 Dynamic Mesh를 기존 Static Mesh에 복사

 

Content Browser에서 선택한 Static 메시를 우클릭 > Scripted Asset Actions > 함수

메시의 피벗이 메시 중앙에 오는 현상을 해결하기

피벗을 메시의 Bounding Box 가장 낮은 부분 (z축) 으로 옮긴다.

 

Assigning Materials to Mesh Areas

 

Remap material IDs 노드 : 타겟 메시의 머터리얼 ID를 바꿔준다.

새로운 메시의 머터리얼 ID를 0에서 1로 리매핑 해주고 Append Mesh 노드를 통해 다른 메시에 붙여주는 경우 합쳐진 메시는 0과 1 두 개의 머터리얼 ID를 갖게 된다. 

Configure Material Set 노드를 사용하면 머터리얼 배열을 메시에 붙여줄 수 있다.

 

Using a BVH to Sample a Mesh Surface with Ray Intersections

BVH : Bounding Volume Hierarchy

 

1. Nearest Point on Mesh with BVH

각각의 삼각형에 쿼리하는 것 보다 BVH를 사용하는 것이 훨씬 효율적이다.

Build BVH For Mesh 노드는 BVH를 생성한다. 계산은 한 번만 이뤄지도록 출력 값을 변수로 Promote 해준다.

 

메시에서 바운딩 박스를 얻고 바운딩 박스에서 박스 사이즈와 박스 중심 위치를 추출하여 Ranfom Point in bounding Box from Stream 의 입력으로 보낸다.

 

이 노드를 루프시켜 랜덤 포인트를 Find Nearest Point On Mesh 노드의 입력으로 넣는다.

 

Append Box노드가 실행되는 순간 BVH 싱크가 깨진다. 아예 새로운 메시가 되어버리기 때문이다. 이런 방식으로 진행하면Add 할때 마다 BVH를 다시 빌드해주는 노드가 추가되어야 한다. 이는 비싼 연산으로 이어진다. 또한 추가되는 메시들이 서로 쌓일 수가 있다.

 

Find Nearest Point On Mesh 노드의 Nearest Result 를 Split 하면 가장 가까운 Point 뿐만 아니라 가장 가까운 삼각형의 ID를 얻을 수 있다.

Target Mesh의 Get Triangle Normal 노드에 삼각형 ID를 집어넣어 노말 벡터 값을 얻고, 이것을 Rotator로 변환한 후 붙이는 Box의 Rotation으로 설정하면 붙이는 박스가 표면에 정렬되게 만들 수 있다.

 

 

메시를 겹치게 하지 않으면서 연산의 수를 줄이는 방법으로는 Allocate Compute Mesh를 사용하여 다른 다이나믹 메시에 전부 Append Box 한 뒤에 한 번에 Append Mesh하는 방법이 있다.

 

2. BVH for Multiple Actor

액터 배열에서 메시를 얻기 - Single 메시로 모은다.

각각의 액터의 루트 컴포넌트에 대해 Copy Mesh From Component 노드를 실행시켜 Dynamic Mesh (Allocated Compute Mesh)에 옮기고, RayCast Mesh (Single 메시) 에 붙인다.

 

Copy Mesh From Component는 애셋이 아니라 레벨에 존재하는 컴포넌트를 대상으로 한다.

 

이번에는 Find Nearest Point on Mesh가 아닌 Find Nearest Ray Intersection with Mesh 노드를 사용한다.

 

 

3. BVH Caching for Huge Meshes

2번 로직을 새로운 World Cache 라는 이름의 블루프린트(Generated Dynamic Mesh)에 옮기고 OnRebuild Generated Mesh 이벤트에서 실행되지 않고 새로 만든 함수에서 실행되도록 한다. ( + Call In Editor 활성화 )

여기에서 BVH 빌드 연산이 진행되도록 한다.

 

Raycast 라는 이름의 블루프린트에 나머지 로직을 정리한다.

 

World Cache 블루프린트를 레벨에 배치 (투명함) 하고 새로 만든 함수를 에디터에서 실행하면 캐시가 생성된다. (보이지 않음)

 

배치하는 박스 수를 늘리고 줄이는 과정에서 더 좋은 퍼포먼스를 보인다. 메시를 다른 곳으로 이동시켰을 때 BVH 캐시를 갱신하지 않았다면 메시가 원래 위치하던 자리에 박스가 생긴다.

 

매우 큰 메시의 BVH를 만드는데는 몇 초가 소요될 정도이므로 큰 메시에는 이 방식이 효과적이다.

 

Convex Hull Blocking Volume Tool

 

레벨 안의 여러 액터를 선택하고 Editor Utility Widget의 기능을 실행시켜서 Convex Hull Blocking Volume을 생성

 

Editor Utilities > Editor Utility Widget

 

1. 선택한 액터들의 메시를 Combined 메시에 합쳐 놓는다.

2. 바운딩 박스에서 피벗 포인트 뽑아낸다.

3. Compute Mesh Convex Hull node로 Combined 메시의 Hull Mesh를 생성하는데 Transform Mesh 노드를 사용하여 Pivot 포인트로 조정한다.

 

4. Create Volume For Mesh 노드를 실행하여 월드에 볼륨을 추가한다.

 

5. 유틸리티 위젯에 디테일 뷰 변수를 추가하여 유틸리티 위젯에 노출시킨다.

 

'언리얼 5 > 에픽 게임즈 공식 강의' 카테고리의 다른 글

Programming 2  (0) 2023.02.21
Enhanced Input Binding with Gameplay Tags C++  (0) 2023.02.21
Engine Structure  (0) 2023.02.20
All about Soft and Weak pointer  (0) 2023.02.20
프로그래밍 시작하기  (0) 2023.02.19

https://dev.epicgames.com/community/learning/tutorials/98E/unreal-engine-begin-play-engine-structure

 

Begin Play | Engine Structure | Tutorial

A high level overview of the engine structure, features and related BeginPlay coursework, walking you through the schematic that forms the basis for all...

dev.epicgames.com

https://d1iv7db44yhgxn.cloudfront.net/post-static-images/Engine%20Structure@2x.jpg

 

언리얼 엔진에 접근할 수 있는 다양한 방법

엔진 코드에 접근하기 위해서는

- 엔진이 어떤 방식으로 작업을 진행하는지 볼 수 있다, 더 엔진을 잘 이해할 수 있게 된다. 엔진 코드를 수정할 것이 아니라면 Install 시 런처에서 add하면 된다.

- 엔진 코드를 수정하여 커스텀 애셋을 만들 수 있다.

- 커스텀 엔진 빌드를 하는 경우 레지스트리에 빌드 ID가 등록된다.

- 커스텀 엔진 경로를 기존 엔진 경로와 동일한 위치에 두면 Perforce로 버전을 관리할 때 UnrealGameSync 툴을 이용하여 프로젝트를 팀 내에서 공유할 수 있다. 사용자들은 로컬에서 컴파일하지 않고 미리 빌드된 바이너리들을 서버에서 다운로드 받을 수 있다.

 

폴더 구조

- 엔진의 폴더 구조와 프로젝트 폴더 구조는 유사하다.

프로젝트는 엔진의 확장과 같은 역할을 하기 때문이다. 

 

- Content 폴더

모든 애셋을 저장하는 폴더

애셋을 옮기고 싶으면 에디터의 Content Browser에서 옮겨야 엔진이 레퍼런스 변화를 기록할 수 있다.

 

- Binaries 폴더

빌드 모듈이 존재한다. (PDB 파일, UBT에 의해 만들어진 Executable 파일) 

엔진 폴더에는 다양한 툴이 존재한다. (Swarm Agent, SwarmCoordinator, UnrealInsights, UnrealEditor.exe )

 

- Config 폴더

프로젝트 세팅이 저장되는 곳

엔진 폴더에는 BaseEditor.ini 프로젝트 폴더에는 DefaultEditor.ini가 있는데 프로젝트 폴더에 있는 Config 파일이 엔진의 것을 오버라이드 할 수 있다.

 

Config 폴더 내에 Platform 폴더가 존재하는데 폴더 이름은 플랫폼 명으로 만들어지고, Config 파일 이름은 플랫폼 이름을 포함해야 한다.

 

- Saved 폴더

프로젝트의 첫 실행 시 생성되는 폴더이다.

로컬 세팅 및 몇몇 데이터를 생성한다.

Saved 폴더 아래에 있는 폴더들

수정된 애셋을 자동 저장하는 Autosaves 폴더 : 애셋 복구하는데 사용할 수 있다.

Config 폴더 : 로컬 프로젝트를 위한 모든 오버라이드 설정 파일 포함

Crashes폴더 : 크래시 발생 시 로그를 저장, Dump파일 생성 (콜 스택 확인용)

Log 폴더 : 과거에 에디터나 게임 세션에서 찍혔던 로그를 확인할 수 있다.

 

- Intermediate 폴더

첫 실행 시 생성되는 폴더

Visual Studio 프로젝트 파일, 컴파일된 오브젝트 파일, 애셋 레지스트리 파일 (분석을 위해 사용됨) 등

 

에디터가 잘 안 켜질 경우 Intermediate 폴더와 Saved 폴더를 백업 후 삭제한 다음 다시 시도해 볼 수 있다.

이 폴더들에 프로젝트의 사용자의 로컬과만 관련 있는 파일들이 존재하기 때문에 이 폴더들은 다른 사용자들과 공유되지 않기 떄문이다.

 

공유되는 폴더 및 파일은 Config, Cotent, Source, Uproject 파일, (필요하다면 Binaries 및 커스텀 폴더를 추가 공유한다.)

보통 커스텀 폴더에는 Source Asset을 담는다. 이렇게 할 경우 다른 모든 사용자들에게도 상대 경로가 동일하기 때문에 아티스트가 애셋을 업데이트해도 reimport 할 필요가 없다.

 

- 플러그인 폴더

엔진 플러그인 폴더에 있는 플러그인들은 어느 프로젝트에서 사용 가능하다. 빌트 인 플러그인과 마켓에서 설치한 플러그인들이  위치해 있다. 커스텀 플러그인을 만든다면 프로젝트의 플러그인 폴더에 저장된다.

 

- UProject 파일

프로젝트를 정의하는 파일이다.

모듈 정의, 활성화된 플러그인 , Engine Association (엔진 버전) 정보를 포함한다.

 

Config는 계층적으로 오버라이딩 된다.

엔진 > 엔진 플랫폼 > 프로젝트 > 프로젝트 플랫폼 > 로컬 

 

 

애셋을 관리하는 방법

 

애셋은 두 가지 방법으로 만들어진다.

1. 외부 DCC tool에서 Import 

2. 에디터에서 직접 만들기

 

엔진에서 material을 텍스처로 굽는 거나 Modeling 툴을 사용하여 3D 메시를 생성하는 것도 애셋을 생성하는 방법 중 하나다.

 

애셋이 생성되면 asset Validation 플러그인이 애셋의 퀄리티를 보장하기 위해 사용된다. C++ 나 BP를 통해서 룰을 만들 수 있다. 예를 들면 네이밍 컨벤션, 텍스처 해상도, 메시 정점 수 등을 제한할 수 있다.

 

애셋은 모든 프로퍼티, 압축되지 않은 포맷의 Raw Data를 포함하는데, 이는 나중에 쿠깅 과정에서 타겟 플랫폼에 최적화된다.

 

- Derived Data Cache

현재 플랫폼에서 사용되는 애셋의 버전을 저장한다.

 

- Shared DDC

공유 폴더에 있는 맵을 최초로 열면 셰이더 컴파일, distance field와 같은 데이터가 생성되는데 공유 폴더에 저장되면 누군가 한 번만 실행하면 된다. 

 

- Redirector 

레퍼런스가 업데이트 되지 않았는데 옮겨진 애셋 

다른 사용자가 레퍼런스 중인 애셋을 다른 곳으로 옮겼을 경우 기존 Path에 생성된다. 나중에 가능할 때 Redirector를 Fix 하면 된다.

 

Primary Asset과 Secondary Asset

Primary Asset은 AssetManager에 의해 관리된다.

사용자는 커스텀 Primary Asset type을 정의하고 AssetManager가 그것을 인식하게 할 수 있다.

Primary Asset은 Secondary Asset들의 로드를 관리한다.

Level은 Primary Asset이다. 레벨에 존재하는 모든 액터 (Secondary Asset)의 로드를 관리한다.

 

Tool

- Session Frontend 툴

Tool 메뉴에서 액세스하거나 독립형 애플리케이션으로 실행 가능하다.

PC나 네트워크로 연결된 장치에서 실행되는 게임에 연결할 수 있다.

내부 기능 :

Automated Testing

Console

legacy Profiler

 

- Device Output Log, Device Manager

연결된 장치의 로그 출력, 실행 관리

 

- Unreal Insights

Session Frontend 내부에 있던 나머지 기능들이 이것으로 대체됨

에디터 툴 메뉴에서 실행된다.

이전 툴에 없던 추가적인 기능으로 모든 스레드에서 일어나는 이벤트를 자세하게 보여준다.

메모리 할당 및 각각의 네트워크 패킷을 분석할 수 있다.

 

빌드

Unreal Automation Tool에 의해 관리된다.

다양한 방법으로 빌드할 수 있다

1. basic packing 프로세스를 에디터에서 직접 진행할 수 있다.

2. Project Launcher를 사용하여 특수 빌드를 진행할 수 있다.

3. Command List를 사용하여 진행할 수 있다. 

 

- Building

C++ 코드를 포함한 프로젝트는 바이너리 빌드부터 시작한다. 바이너리 빌드 시 빌드 설정이 필요하다. (타겟, State)

target : Standalone Game, Editor, Client, Dedicated Server

State : Debug, Development, Shipping

 

- Cooking

바이너리 빌드 한 후에는 Cooking 과정을 거친다.

애셋을 타겟 플랫폼에 최적화하는 작업이다. 

1. Cook by the book : 모든 애셋을 쿠킹한다. 시간이 걸린다.

2. Cook on the fly : Cook process가 생략되고 Cook Server가 내 장치에서 실행되어 게임에서 애셋이 필요할 때 쿠킹된다. 로딩 시간이 길어지지만 반복 작업을 하는데 있어서는 효율적이다.

 

- Staging

Cooked Asset이 Staging Directory로 이동하고 이동한 애셋들은 Packaging 프로세스를 거친다.

Staging Directory를 지정할 수 있다.

Saved 폴더 아래에 있다.

 

- Packaging

모든 애셋을 패키징할 때 하나의 파일에 저장하거나 여러개의 청크에 나눠서 저장할 수 있다 또는  UAsset 그대로 저장할 수 있다. UAsset 그대로 저장하는 경우에 유저는 애셋 데이터에 접근할 수 있게 된다.

패키징하는 경우에는 암호화되기 때문에 DLC나 패치를 생성하는데 활용된다.

 

패키징될 때 어떤 언어를 제공할 지 결정할 수 있다. Localize Text 및 Asset

 

- Asset Audit (애셋 우클릭)을 사용하여 어떤 Asset이 어떤 Chunk로 가는지 확인할 수 있다.

 

- 레퍼런스 뷰어

흰색 줄은 Hard Reference 

보라색 줄은 Soft Reference

 

Hard Reference로 참조하는 애셋은 애셋이 로드될 때 자동으로 로드된다.

Soft Reference로 참조하는 애셋은 사용자가 필요할 때 임의로 로드할 수 있다. - 모든 애셋이 레벨과 함께 로드될 필요가 없기 때문에 로딩 시간을 줄여줄 수 있다.

 

- Gauntlet

자동화된 테스팅 및 검증 툴

✔ 다음 포인터 유형 사용

TSoftObjectPtr : 해당 경로를 통해 로드되거나 로드되지 않을 수 있는 개체를 참조하는데 사용된다.

로드되지 않더라도 다른 레벨에 있는 액터를 가리킬 수 있다. 특별한 목적을 위해서 메시와 같은 애셋을 비동기 로딩하는 함수에서 사용된다. 블루프린트에서의 Soft Object Reference 블루프린트 변수 타입과 같은 역할이다.

 

TSoftClassPtr : 해당 경로를 통해 로드되거나 로드되지 않을 수 있는 클래스를 참조하는데 사용된다.일단 로드되면 사용자는 이것을 이용해 인스턴스를 만들 수 있다. 이것들을 비동기로 로드하는 함수에서 사용된다. 블루프린트에서의 Soft Class Reference 블루프린트 변수 타입과 같은 역할이다.

 

TWeakObjectPtr : 이미 인스턴스화된 객체를 참조하는데 사용된다. 객체가 사라지거나 가비지 컬렉팅되는 경우 Null값을 가지게 된다.

 

❌ 이러한 포인터 유형을 사용하지 마십시오.

  • FSoftObjectPath : 다른 포인터 유형 에서 내부적으로 사용됩니다. 결과를 캐시하지 않기 때문에 느립니다. 에디터에서 설정하면 UBlueprintGeneratedClass 대신 UBlueprint 클래스를 가리킬 것인데, 이는 일반적으로 게임플레이 코드가 원하는 것이 아닙니다. 하지만 Editor Plugins 제작자는 해당 기능을 원할 수 있습니다.
  • FSoftClassPath : FSoftObjectPath와 동일하지만 클래스 로딩과 관련된 일부 도우미 함수가 있습니다. 지금은 대부분 레거시 유형입니다.
  • FSoftObjectPtr : TSoftObjectPtr의 비템플릿 및 비-BP 노출 버전입니다.

 

Weak Pointer vs Soft Pointer

Weak Pointer는 존재하는 UObject를 대상으로 만들어진다. 이 UObject는 GUObjectArray 인덱스에 의해 이미 만들어진 UObject이다. 

Weak Pointer는 가리키는 대상이 가비지 컬렉팅 되었는지 알 필요가 없기 때문에 UPROPERTY로 지정하지 않아도 된다.

 

Soft Pointer는 로드되거나 로드되지 않을 수 있는 객체 또는 애셋에 대한 경로의 문자열 표현입니다. 개체가 쿼리되고 발견된 후 개체를 추적하기 위해 추가 Weak Pointer를 내부에 저장합니다

 

Soft Pointer

FSoftObjectPath

게임플레이 코드용 FSoftObjectPath 변수를 직접 만들지 마세요 . 그들은 확인된 개체를 캐시하지 않으므로 모든 쿼리는 개체를 다시 검색합니다. 또한 생성된 클래스( UBlueprintGeneratedClass , 경로 이름의 " _C ") 대신 블루프린트 클래스 애셋( UBlueprint ) 을 가리킵니다 . UBlueprint는 패키지 빌드에서 제거됩니다. TSoftObjectPtr 또는 TSoftClassPtr 을 사용하십시오 .

 

FSoftObjectPath는 모든 타입의 Soft 포인터에서 내부적으로 사용된다. 소프트 오브젝트 경로 변수는 블루프린트에서 생성할 수 있지만, 수행 중인 작업을 알고 있고 , UBlueprintGeneratedClass 클래스를 가리키고 싶지 않으며 캐싱이 필요하지 않은 에디터 유틸리티에서만 수행해야 한다.

 

블루프린트에서 사용하는 경우 개체 인스턴스가 아닌 디스크 상의 애셋만 선택할 수 있습니다. 인스턴스를 가리키려면  TSoftObjectPtr 을 사용하십시오

 

FSoftObjectPath는 템플릿이 아닙니다. 애셋 유형으로 선택을 제한하려면 MetaClass UProperty 메타데이터를 사용할 수 있습니다 (또는 해당 종류의 기능 대신 TSoftClassPtr 사용).

 

개체를 resolve 할 때 해쉬를 사용해 검색한다. 일반 혹은 WeakPointer에 비해 약간의 오버헤드가 있다. 확장 클래스는 일반적으로 그것들을 캐시하므로 다시 검색할 때 한번 resolve하면 다시 검색하지 않는다.

 

FSoftClassPath

FSoftObjectPath와 거의 동일하지만 로딩 관련 헬퍼 함수를 갖고 있다. 대부분 오래된 시스템이기 때문에 직접 만들어 샤용하는 대신에 TSoftClassPtr을 사용하자

 

FSoftObjectPtr

소프트 개체 및 클래스 포인터의 기본 클래스입니다. 내부적으로 오브젝트를 찾기 위한 FSoftObjectPath 와 찾은 후 캐싱하기 위한 FWeakObjectPtr을 유지합니다.

많은 기능이 있는 TPersistentObjectPtr을 확장합니다 .

USTRUCT가 아니므로 블루프린트에서는 사용할 수 없으며 C++에서만 사용할 수 있습니다.

TSoftObjectPtr 또는 TSoftClassPtr 의 두 가지 확장 유형이 있습니다 . 이 유형은 각각 개체 인스턴스 또는 애셋(CDO)을 가리키는 템플릿, 블루프린트에 Visible 되는 방식을 제공합니다. 이것들이 대신 사용되어야 한다.

Get()을 호출하면 기본 클래스에서 호출하여 내부 WeakPtr이 이전에 캐시되었는지(비 PIE 세션에서) 먼저 확인하고, 그렇지 않으면 FSoftObjectPath.ResolveObject를 호출하여 객체를 찾습니다.

 

TSoftObjectPtr

FSoftObjectPtr의 템플릿화된 Wrapper 이다. 블루프린트에서 사용될 수 있다.

경로 이름이 있는 모든 항목을 가리키는 데 사용할 수 있습니다. 디스크에 있는 애셋이든 레벨에 있는 개체든 로드되지 않을 수 있는 항목을 가리키는 데 가장 적합합니다.

 

액터가 현재 로드되지 않은 다른 레벨에 있어도 경로 값을 유지한다.

 

이미 인스턴스화된 액터를 참조하려면 TSoftObjectPtr 대신 TWeakObjectPtr을 사용하십시오.

기본값은 블루프린트 타입으로 설정할 수 없습니다 (블루프린트 타입을 사용하려면 TSoftClassPtr 사용). 하지만 Data Assets을 가리킬 수 있습니다.

 

이 값은 로드된 액터를 선택하여 인스턴스 Detail 창에서 설정하거나 현재 열려 있는 맵의 액터에 대한 Class Defaults에서 설정할 수 있습니다.

 

가리키는 객체가 로드되지 않았을 때 Get()이 호출되면 nullptr  반환 합니다 . 일단 로드되면 일치하는 전체 이름을 가진 액터를 반환하고 미래의 쿼리를 위해 캐시합니다.

 

TSoftClassPtr

TSubclassOf 처럼 작동하는 FSoftObjectPtr 주변의 템플릿 래퍼로 , 블루프린트 서브클래스용 UProperties 에서 사용할 수 있습니다 .

로드 여부를 쿼리할 수 있는 블루프린트 유형( UBlueprintGeneratedClass ) 을 가리키는 데 사용됩니다 . 클래스를 비동기적으로(또는 동기적으로, 장애가 발생하더라도) 로드하는 데 사용할 수도 있습니다. 

DataAssets는 인스턴스화하면 안 되므로 DataAsset에 대해서는 작동하지 않는다. 이것들에 대해서는 TSoftObjectPtr을 대신 사용해야 한다.

 

WeakPointers

소프트 포인터처럼 경로를 저장하지 않고, 이미 인스턴스화된 개체에 대해서 참조만 한다.

weak pointer는 int32 ObjectIndex와 int32 ObjectSerialNumber 두 값만 저장한다.

 

Get을 호출하면 먼저 ObjectIndex를 사용하여 GUObjectArray 에서 객체를 가져옵니다 (존재하는 경우).

 

"하지만 ObjectIndex는 32비트에 불과합니다. 액터를 계속 생성하고 제거하면 쉽게 숫자가 부족하지 않습니까 ? " 훌륭한 질문입니다. 예, 이론적으로는 그럴 수 있지만 항상 기껏해야 수십만 개의 객체만 살아 있기 때문에 해당 인덱스가 재사용됩니다.

 

그 때문에 인덱스 재사용의 경우 우리가 원하는 개체인지 확인하기 위해 ObjectSerialNumber가 있습니다. ObjectSerialNumber는 Weak 포인터가 UObject 를 처음 가리킬 때만  할당되며 , 그렇지 않으면 0입니다. 스레드 안전 증분 int32 카운터 입니다 .

 

" 일련 번호가 다 떨어지면 어떻게 됩니까? " 그것은 게임에 크래시를 일으킨다.  즉 , 일련 번호가 소진되기 전에 최대 2,147,483,647개의 고유 UObject 에 대한 새로운 약한 포인터를 만들 수 있습니다 . 대부분의 사용 사례에는 충분하지만 매우 오래 실행되는 프로세스 또는 약한 포인터의 이상한 사용을 고려하십시오.

 

일련 번호를 비교한 후 최종적으로 UObject IsValid() 가 아닌지 확인하고 , 그렇지 않으면( PendingKill 의 경우 ) null 을 반환하고 , 그렇지 않으면 객체를 반환합니다. 이 때문에 약한 포인터를 역참조하면 항상 유효한 UObject 또는 그렇지 않은 경우 nullptr이 반환된다는 것을 확신할 수 있습니다 .

 

모든 델리게이트는 AddUObject / BindUObject 함수를 사용할 때 Weak Pointer를 통해 UObject 에 대한 참조를 유지하므로 파괴 중 구독 취소에 대한 걱정 없이 델리게이트를 안전하게 구독할 수 있습니다. 이는 관리되지 않는 C++ 포인터를 사용하는 AddRaw / BindRaw 함수를 사용하는 것과는 반대이므로 UObject 를 다룰 때 이를 신중하게 다루고 전혀 사용하지 않으려고 합니다 . 

UObject가 아닌 C++ 클래스의 멤버함수를 등록하는 경우에는 AddRaw / BindRaw 사용

 

요약

요약하자면, 약한 포인터는 역참조할 때 약간의 오버헤드가 있는 UObject를 가리키는 훌륭하고 안전한 방법입니다 . 결국 그렇게 약하지 않습니다! UObject 가져오기 및 유효성 검사의 모든 내부를 처리하기 때문에 UPROPERTY 일 필요도 없습니다 

 

FWeakObjectPtr

메모리의 UObject에 대한 약한 포인터입니다. USTRUCT가 아니므 로 블루프린트에서 사용할 수 없습니다. C++에서만 가능합니다. 

TWeakObjectPtr 의 Base 클래스입니다 .

 

TWeakObjectPtr

일반 FWeakObjectPtr 의 템플릿 버전입니다. 블루프린트에서 사용할 수 있지만 C++에서 선언해야 합니다.

개체의 문자열 표현을 내부적으로 사용하지 않더라도 인스턴스 Detail 창(Class Defaults 말고) 에서 값을 설정할 수 있습니다 .

 

문자열 경로를 사용하지 않기 때문에 애셋을 찾는 오버헤드를 건너뛰지만 이미 인스턴스화된 개체로만 설정할 수 있습니다. 

 

C++에서는 인스턴스화된 UObject 가 어느 레벨에 있든 상관없이 이미 로드되어 있는 한 가리킬 수 있습니다 .

 

 

https://dev.epicgames.com/community/learning/tutorials/kx/all-about-soft-and-weak-pointers

 

 

All about Soft and Weak pointers | Tutorial

A deep dive into the different soft and weak pointer types in Unreal Engine.

dev.epicgames.com

 

 

 

모듈, 플러그인 플랫폼

 

모듈별로 컴파일이 진행된다.

다른 여러 프로젝트에서 모듈을 사용할 수 있다.

플러그인 : 활성화하거나 비활성화 할 수 있음, 엔진 혹은 프로젝트에 포함

플랫폼 : 플랫폼 전용 코드가 따로 생성됨

 

UBT : 현재 있는 모든 모듈과 플러그인을 확인하고 소스 코드 처리에 필요한 파일을 프로젝트에 생성

 

Base Type

- Enum

- 문자열

1. FString : 기본 문자열

2. FName : 액터 이름에 사용

3. FText : 현지화가 준비된 문자열

- Structs

- Collection

1. TMap

2. TArray : 배열의 배열은 설정할 수 없다

3. TSet

- Transform Types

1. FVector

2. FRotator : 오일러 각 사용

3. FQuat

4. FTransform

 

UObject : 가비지 컬렉터에서 처리할 오브젝트, 메모리 시스템에서 자동으로 처리되려면 UObject를 상속받아야 한다.

액터와 컴포넌트 모두 UObject를 상속받기 때문에 가비지 컬렉터로 관리된다.

 

UObject의 라이프사이클

생성 : 액터가 에디터에 있는 레벨에 배치되거나 코드나 블루프린트에의해 직접 스폰될 때

 

스마트 포인터에 의해 오브젝트들의 레퍼런스가 관리된다.

제거 : 더 이상 레퍼런스되지 않는 오브젝트는 가비지 컬렉터에 의해 메모리에서 제거된다.

 

Data Objects

1. Curves

2. DataAssets

3. DataTables

 

 

액터의 라이프사이클

Constructor

BeginPlay

InitializeComponents

EndPlay

 

레퍼런스가 없으면 PendingKill로 설정되고 곧 제거됨

PendingKill로 설정된 액터는 접근하면 오류를 발생시킴

 

Memory Management

Loading Assets Option : Automatic or Deferred

- 애셋을 즉시 로드하거나 애셋에 대한 레퍼런스를 설정해 놓고 스트리밍 시스템에서 이 애셋을 비동기로 로드하도록 할 수 있다. 맵에 배치된 액터를 제외하고 액터도 마찬가지이다.

 

Garbage Collection

Placed vs Spawned

- 맵에 배치된 액터는 맵이 언로드될 때 모두 자동으로 가비지 컬렉션이 수행됨

References chain

 

Gameplay Framework

GameMode는 서버에 있다

클라이언트에서는 GameMode에 액세스할 수 없다. 대신에 GameState를 통해 정보를 얻을 수 있다. GameMode에서 GameState를 변경한다.

 

Subsystem : 

Async Task : 비동기 작업

 

Replication

리플리케이션은 오너십을 기반으로 한다.

액터와 프로퍼티 모두 리플리케이션이 가능하다.

안정성 설정이 가능하다.

메시지를 자체적으로 생성할 수도 있다. (RPC)

변수 값 변경이 발생할 때 이벤트를 발생시킬 수 있다. (RepNotify)

 

Unreal Automation Tool에서 Build, Cook, Pack 프로세스를 진행한다.

 

디버깅 프로파일링 툴

Stats : CMD > stat fps 입력

Console Commands : 

Session Frontend : 프로젝트에서 실행되는 세션과 관련된 툴을 제공

Unreal Insights : 모든 스레드에서 발생하는 이벤트를 자세하게 보여줌 메모리 할당 정보 및 네트워크 각각의 패킷 정보를 분석한다.

CSV Profiler : 

Memreport : 메모리 프로파일링 커맨드라인

LLM : 로우 레벨 메모리, 메모리와 클래스에 있는 엘리먼트의 양을 정확하게 제공, 트래킹 가능

ProfileGPU 커맨드 : GPU에서 발생하는 작업을 볼 수 있다.

Gauntlet : 빌드 시 빌드를 자동으로 테스트

+ Recent posts