액터의 역할

언리얼 엔진의 네트워크 프레임워크는 기본적으로 서버/클라이언트 모델을 기준으로 만들어졌다.

 

서버는 클라이언트의 최신 상태를 유지하기 위해 액터를 사용한다. 서버가 특정 클라이언트를 업데이트할 때, 지난 업데이트 시점 이후 변경되었다고 보는 연관 액터를 수집한 다음, 액터의 최신 상태를 유지하기에 충분할 만큼의 정보를 클라이언트에 전송한다.

 

네트워크 모드 유형

NM_Standalone

ㄴ 로컬 머신에서 실행되며 원격 머신에서 클라이언트를 받지 않는 서버 (싱글 플레이어, 로컬 멀티플레이 게임에 적합)

 

NM_DedicatedServer

ㄴ 로컬 플레이어가 없어 사운드, 그래픽, 사용자 입력, 기타 플레이어 관련 기능을 제거하여 보다 효율적인 실행이 가능한 전용 서버. 신뢰 서버에서 호스팅되는 멀티플레이어 게임에 사용되며 경쟁형 MOBA, MMO, 온라인 슈팅 게임 등 퍼포먼스와 신뢰성이 중요한 서버가 필요한 경우에 사용

 

NM_ListenServer

ㄴ 로컬 플레이어가 있는 서버, 사용자는 써드 파티 서버 없이 게임을 구성하여 플레이할 수 있음. 호스트에 네트워크 지연시간이 없어 호스트 플레이어에게 약간 유리하게 적용될 수 있음.

 

NM_Client 

ㄴ 서버가 아닌 유일한 모드. 데디케이티드 또는 리슨 서버로 접속되는 클라이언트

 

서버의 역할

게임플레이 흐름의 구동을 담당 (서버의 GameMode 액터를 통해 구동되고, GameMode액터의 중요한 상태를 GameState 액터에 반영하면, GameState가 각 클라이언트에 리플리케이트)

ㄴ 새 맵으로 이동할 때가 되었음을 클라에게 알리기

ㄴ 액터의 리플레케이션

 

접속 프로세스 예시

1. 클라가 서버에 접속요청

2. 서버가 수락하면 현재 맵을 전송

3. 서버는 클라가 맵을 로드할 때까지 기다림

4. 로드 이후 AGameModeBase::PreLogin을 호출

ㄴ 서버에 접근 시도중인 플레이어를 수락 또는 거부할 수 있음

5. 수락되면 서버는 AGameModeBase::Login을 호출

ㄴ 새로운 PlayerController를 만들고 새로 접속된 클라이언트에 리플리케이트 시킨다. 클라이언트의 접속 과정에서 임시로 사용하고 있던 PlayerController를 대체한다.

ㄴ APlayerController::BeginPlay가 호출된다.

6. AGameModeBase::PostLogin이 호출된다. 이후 서버가 PlayerController에서 RPC 함수 호출을 시작해도 안전하다.

 

캐릭터의 레플리케이션

네트워크 환경에서 캐릭터는 캐릭터가 가지는 Character Movement 컴포넌트 때문에 레플리케이션된다. (클라이언트-서버 네트워킹이 자동으로 탑재되어 있다.)

 

개발자는 네트워크 Movement를 커스텀하기 위해 Character Movement 컴포넌트를 프레임워크로써 사용할 수도 있다.

 

Character Movement 컴포넌트의 TickComponent 함수에서는 PerformMovement 함수를 호출하여 플레이어의 input에 따른 예상 가속도를 계산한 뒤에 최종 움직임을 캐릭터에 적용한다. PerformMovement에서는 movement 종류(걷기, 떨어지기) 에 따라 다른 물리 함수를 적용하여 움직임을 계산한다.

 

네트워크를 사용하지 않는 환경에서는 PerformMovement가 틱마다 직접적으로 호출되지만 네트워크 게임에서는 다른 함수들에 의해 간접적으로 호출된다.

 

Network Role

Character Movement 컴포넌트는 이 컴포넌트를 소유하는 캐릭터의 network role에 따라 어떻게 replicate할지를 결정한다.

 

1. Autonomous Proxy

ㄴ 클라이언트의 플레이어가 조종하는 캐릭터

 

2. Authority

ㄴ 서버에서 존재하는 캐릭터

 

3. Simulated Proxy

ㄴ 클라이언트에 존재하는데 AI나 다른 클라이언트에 의해 조종되는 캐릭터

 

Movement Replication 정리

1. TickComponent 함수에서는 프레임에 대한 가속도 및 회전 변화를 계산하고, 로컬 제어 캐릭터의 경우 PerformMovement, 네트워크 클라이언트의 경우 ReplicateMoveToServer를 호출하여 이동을 캐릭터에 적용한다.

 

2. ReplicateMoveToServer 함수는 이동 대기목록(PendingMove list)에 이동을 저장하고 PerformMovement를 호출하여 ServerMove에 movement 파라미터, 클라이언트 액터의 결과 위치, 타임스탬프를 전달한다. ServerMove RPC함수를 호출한다. 

 

3. 서버에서 실행되는 ServerMove에서는 movement 파라미터를 디코딩한 정보를 토대로 캐릭터에 이동을 적용한다.

이동 결과 위치와 응답 시간의 차이를 비교하여 차이가 충분히 큰 경우 서버는 ClientAdjustPosition RPC 함수를 호출하여 클라이언트상 액터의 위치를 서버 버전의 위치로 조정한다. bUpdatePosition 플래그를 true로 설정한다.

 

4. 다음 프레임의 TickComponent 함수에서 bUpdatePosition 플래그가 true라면 ClientUpdatePosition함수를 호출하는데, 

여기에서는 서버 버전의 위치로 조정된 이동의 시점 이후 입력된 이동들(Pending move list에 저장된)을 모두 리플레이한다. (클라이언트와 서버의 Latency 사이에 발생한 입력들에 대한 처리가 필요하기 때문에) 

bUpdatePosition 플래그는 다시 false로 바꿔준다.

 

5. 다른 클라이언트가 소유한 액터(Simulated Proxy)의 움직임 업데이트 대부분은 매 틱마다 호출되는 SimulateMovement 함수와 내부에서 호출되는 MoveSmooth에서 이루어진다. 서버 업데이트를 받았을 때 simulated proxy의 위치가 튀어보이는것을 방지하기 위해 SmoothClientPosition 함수를 사용하여 캐릭터 표현 위치에 스무딩 작업을 해 준다.

 

 

https://docs.unrealengine.com/4.26/en-US/InteractiveExperiences/Networking/CharacterMovementComponent/

 

Character Movement Component

Detailed explanation of Character Movement Component

docs.unrealengine.com

'언리얼 5 > 정리' 카테고리의 다른 글

게임 플레이 아키텍처, 스마트 포인터, 태스크  (0) 2022.10.18
개발 구성, 엔진 아키텍처  (0) 2022.10.18
액터 종류  (0) 2022.10.18
레벨, 월드 세팅, 월드 파티션  (0) 2022.10.15
애셋과 레퍼런스  (0) 2022.10.14

게임플레이 아키텍처

UObject와 UCLASS 매크로
UObject에서 파생되는 클래스에 UCLASS 매크로를 사용하여 태그를 해주면 UObject 처리 시스템에서 인식하게 된다.
각 UClass는 Class Default Object라는 오브젝트를 하나 유지한다.
UClass에는 클래스를 정의하는 프로퍼티와 함수 세트가 들어있다. 이것들은 네이티브 코드에서 사용할 수 있는 일반 C++ 함수와 변수
+ 오브젝트 시스템 안에서의 동작을 제어하는 언리얼 전용 메타데이터까지 포함한다.

UObject에 제공되는 함수성
가비지 컬렉션
직렬화
네트워크 리플리케이션
자동 에디터 통합
레퍼런스 업데이트

비동기 애셋 로딩
ㄴ UObject* 프로퍼티 대신 FSoftObjectPath를 사용하여 특정 애셋에 대한 레퍼런스를 만들되 항상 로드되지는 않도록 한다.
ㄴ FSoftObjectPath를 약하게 참조하는 TSoftObjectPtr을 사용하여 애셋이 메모리에 존재하는지 값을 반환 받을 수 있고, 없다면 메모리에 로드한 다음에 다시 참조한다.

명령줄 인수
엔진 실행 방식을 조절하는 옵션 설정을 위해 엔진 실행파일에 전해줄 수 있는 인수
ㄴ 모드 : 메인 에디터 실행파일을 게임 혹은 서버로 실행시킬 수 있다.
ㄴ URL 파라미터 : 게임 시동시 특정 맵을 강제로 로드시키기 위해 맵의 주소를 전달
ㄴ 스위치 : 특정 키워드를 값 또는 키-값 쌍으로 게임이나 에디터에 전달할 수 있다.
ㄴ INI / 환경설정 : 게임이나 에디터가 로드하는 INI 파일을 임시로 덮어쓸 수 있다.

데이터 유효성 검사
ㄴ UObject에 정의된 IsDataValid 가상함수를 오버라이드하여 사용자 정의 조건으로 유효성을 검사할 수 있다.
ㄴ Data Validation 플러그인을 사용
ㄴ 애셋이 명명 규칙을 충족하는지 확인
ㄴ 공간 및 퍼포먼스 예산 집행
ㄴ 비순환 종속성 발견
ㄴ 단일 애셋 ~ 프로젝트 전체 범위로 데이터 유효성 검사를 할 수 있다.

애셋 레지스트리 
ㄴ 애셋 레지스트리는 에디터가 로드되면서 로드되지 않은 애셋에 대한 정보를 비동기적으로 모으는 서브시스템이다.
ㄴ 애셋에 대한 데이터를 검색 가능하게 만드려면, 프로퍼티에 AssetRegistrySearchable 태그를 추가해 줘야 한다.
ㄴ 애셋을 로드하지 않고 목록을 만들 수 있도록 메모리에 저장된다.

클래스별 애셋 목록 만들기
ㄴ 애셋 레지스트리 모듈을 로드한 다음 Module.Get().GetAssetsByClass를 호출하여 얻는다.
ㄴ 목록은 FAssetData 오브젝트 배열에 반환된다.
ㄴ FAssetData는 GetAsset함수를 사용하여 UObject*로 변환할 수 있다.

FAssetData에는 애셋의 프로퍼티 값의 목록인 TagsAndValues라는 이름과 값의 매핑이 들어있다.
이 정보는 애셋이 저장되어 UAsset 파일의 헤더에 기록될때 수집된다.
UPROPERTY 매크로의 AssetRegistrySearchable 플래그로 마킹된 프로퍼티만 TagsAndValues 맵을 채운다.
<변수이름 - 값>의 형태로

태스크 시스템
ㄴ 게임 플레이 코드를 비동기 실행할 수 있는 기능을 제공하는 작업 매니저, 종속 작업에 대해 방향성 비사이클 그래프를 만들고 실행할 수 있다.
ㄴ 태스크를 실행하려면 태스크의 디버그 이름과 호출 가능한 태스크 바디 오브젝트를 제공해야 한다.
ㄴ 태스크 실행(Launch)은 결과 FTask(태스크 핸들)를 반환할 수 있다. 태스크 바디에서 반환한 결과의 타입과 일치하는 TTask<타입> 으로 받는다.
ㄴ 태스크 우선순위는 태스크의 실행 순서에 영향을 준다. Launch할 때 인자로 지정할 수 있다.

busy wait 
ㄴ 대기중인 태스크가 완료될 때까지 다른 작업을 실행하려는 시도
ㄴ 스케줄러가 태스크를 선택할 수 없다..
ㄴ 데드락의 위험도 있다.

전제조건
ㄴ 선행 태스크 핸들을 후속 태스크 Launch할 때 인자로 넣어주면 태스크 간 종속성을 표현할 수 있다.

중첩된 태스크
ㄴ 전제 조건과 다른 점은 두 태스크가 동시에 실행되어도 괜찮지만, 완료는 순서가 있다는 점
ㄴ 태스크 A의 바디에서 태스크 B를 Launch하고, AddNested(TaskB)를 호출하면 태스크B는 A의 자식 태스크가 된다
ㄴ TaskA.Wait을 하게 되면 TaskB와 TaskA가 완료될 때까지 기다린다.
AddNested 함수는 태스크 내부에서 호출하지 않는 경우 Assert를 호출한다.

파이프
ㄴ 동시 실행이 아닌 연속적으로 실행되는 태스크로 이루어진 체인
ㄴ 여러 스레드에서 공유 자원에 접근할 때 뮤텍스를 잠그는 방법을 사용하지 않음
ㄴ 공유된 리소스에 대한 비동기 작업을 위해 존재한다. (비동기 인터페이스를 직접 구현할 필요가 없다)
리소스마다 파이프를 두고, 공유된 리소스에 대한 모든 액세스는 파이프에서 실행한 태스크 내부에서 수행한다.

태스크 이벤트
ㄴ 태스크 바디가 없고 실행할 수 없는 태스크 타입
ㄴ 명시적으로 Trigger함수를 호출해야 실행된다.
ㄴ 다른 태스크의 전제 조건으로 활용하여 다양한 작업을 할 수 있다.

언리얼 오브젝트 (UObject) 처리
ㄴ 자동 프로퍼티 초기화 : 생성자 호출 전 초기화시 자동으로 0으로 채워진다. (클래스, UProperty, 네이티브 멤버 모두)
ㄴ 레퍼런스 자동 업데이트 : AActor 또는 UActorComponent가 소멸되거나 다른 식으로 플레이에서 제거되면 리플렉션 시스템에서 보이고 있는 그에 대한 모든 레퍼런스는 자동으로 null이 된다.
UProperty가 아닌 오브젝트 포인터가 필요한 경우, TWeakObjectPtr을 대신 사용
에디터에서 애셋을 Force Delete한 경우에도 참조된 UObject UProperty가 자동으로 null이 된다.

Serialization

런타임 유형 정보 및 형변환
ㄴ 자식 클래스에서 Super로 부모 클래스에 접근할 수 있다.
ㄴ Cast 함수 템플릿을 사용해서 UObject를 형변환할 수 있다.

가비지 컬렉션
ㄴ 엔진에서는 레퍼런스 그래프를 만들어 어느 오브젝트가 아직 사용중이고 어느 것이 필요 없는지
ㄴ 주기적으로 소멸 예약시킨 UObject를 정리할 때, UObject 레퍼런스 트리를 검색하여 참조되지 않은 오브젝트,
즉 트리 검색에서 찾지 못한 것들은 더 이상 필요하지 않은 오브젝트라고 가정하고 제거한다.
ㄴ 살려두고자 하는 오브젝트가 있다면 UPROPERTY 레퍼런스를 유지하거나 그에 대한 포인터를 언리얼 엔진 컨테이너 클래스에 저장해야 한다.
ㄴ 액터는 자신의 Destroy 함수를 호출하여 명시적으로 소멸 예약시킨다. (컴포넌트는 소유 액터가 제거될 때 소멸)
ㄴ 가비지 컬렉션 튜닝을 위한 세팅은 프로젝트 세팅 -> 가비지 컬렉션에서 설정할 수 있다.

네트워크 리플리케이션
ㄴ 흔히 쓰는 모델 : 서버에서 변수가 변경되면 엔진에서 그 변화를 감지하여 모든 클라이언트에 신뢰성 있게 전송하는 것
ㄴ UProperty에 태그를 설정하면 네트워크 플레이 도중 데이터 복제 여부를 엔진에게 알릴 수 있다.
ㄴ UFuncion에 태그를 설정하면 server 태그가 붙은 함수는 클라이언트 머신에서 호출할 때 서버 머신에서 해당 액터의
서버 버전이 실행되도록 한다. client 함수는 서버에서 호출될 수는 있지만 해당 액터의 소유중인 클라이언트 버전이 실행된다.

언리얼 스마트 포인터 라이브러리
ㄴ TSharedPtr : 참조하는 오브젝트를 소유하며, 참조하는 쉐어드 포인터 또는 쉐어드 레퍼런스가 없을 경우에 오브젝트를 소멸시킨다. 
ㄴ TSharedRef : sharedPtr과 비슷하지만 항상 Null이 불가능한 오브젝트를 참조해야 한다는 점이 다르다.
ㄴ TWeakPtr : 오브젝트를 소유하지 않기 때문에 생명 주기에 영향을 주지 않는다.
ㄴ TUniquePtr : 다른 유니크 포인터에 넘겨줄 때는(소유권 이전) MoveTemp 함수로 넘겨준다.

스마트 포인터 구현 세부사항
ㄴ 일부 스마트 포인터 타입은 C++ 기본 포인터보다 느리기 때문에 렌더링과 같은 로우 레벨 엔진 코드에는 덜 유용하다.

스마트 포인터의 이점
ㄴ 메모리 누수 방지 : 스마트 포인터(위크 포인터 제외) 들은 공유된 레퍼런스가 없으면 오브젝트가 자동 소멸된다.
ㄴ 위크 레퍼런싱 : 위크 포인터는 참조 주기에 영향을 주지 않고 댕글링 포인터를 방지한다.
ㄴ 선택적인 스레드 안전 : 스레드 세이프 스마트 포인터와 그냥 스마트 포인터가 구분되어 있어서 스레드 안정성이 필요없다면 향상된 퍼포먼스를 구현할 수 있다.
ㄴ 런타임 안정성 : 쉐어드 레퍼런스는 절대 null일 수 없고, 언제든지 참조 해제할 수 있다.
ㄴ 메모리(?) : 스마트 포인터는 64비트 C++ 포인터 크기의 두 배(128비트)이다. 유니크 포인터는 예외로 64비트 크기
ㄴ 명확한 의도 : 관찰자 중에서 오브젝트의 소유자를 쉽게 분별할 수 있다.

스마트 포인터의 퍼포먼스 이점 
ㄴ 빌드를 출시할 때, 대부분의 스마트 포인터들을 참조 해제하는 속도가 C++ 기본 포인터만큼 빠르다.
ㄴ 스마트 포인터를 복사해도 절대 메모리가 할당되지 않는다.
ㄴ 스레드 세이프 스마트 포인터는 잠금 없는 구조이다.

스마트 포인터의 퍼포먼스 문제점
ㄴ 스마트 포인터의 생성 및 복사는 C++ 기본 포인터의 생성 및 복사보다 더 많은 오버헤드가 발생한다.
ㄴ 참조 카운트를 많이 유지하면 기본 사이클(?)이 복잡해진다. 

스레드 안정성
기본적으로 스마트 포인터는 싱글 스레드가 접근하는 것에 안전하기 때문에 멀티 스레드가 접근해야한다면 
스마트 포인터 클래스의 스레드 세이프 버전을 사용해야 한다.

프로그래밍 툴 : 로우 레벨 메모리 트래커
ㄴ 언리얼 엔진 프로젝트의 메모리 사용량을 추적하는 툴, 범위 태그 시스템을 사용하여
언리얼 엔진과 OS가 할당한 모든 메모리 기록을 유지함

Sparse Class Data 시스템
프로퍼티는 디자이너가 액터 비헤이비어에서 반복작업을
수행할 수 있는 좋은 방법을 제공하지만 게임을 출시할 때는 대다수의 프로퍼티가
상수처럼 사용되기 때문에 중복된 프로퍼티를 사용하는 경우 희소 클래스 데이터를 사용하면
이러한 프로퍼티를 단일 공유 구조체 인스턴스로 전송하여 메모리에 프로퍼티의 사본 단 하나만을 
유지하는 동시에 디자이너가 블루프린트 그래프에서 프로퍼티 값에 액세스하고 편집하도록 할 수 있다.

게임 플레이 클래스
ㄴ 애셋이나 클래스의 레퍼런스를 찾아야 하는 경우는 한 번만 찾도록 생성자에서 static으로 선언된
FObjectFinder나 FClassFinder에 찾아 놓고 이것을 사용해 프로퍼티를 초기화한다.

언리얼 엔진 아키텍처

Assert
ㄴ check 매크로 : DO_CHECK 매크로가 빌드에 컴파일되는 경우에 표현식을 실행
ㄴ verify 매크로 : DO_CHECK가 꺼져 있어도 표현식을 실행
ㄴ ensure 매크로 : 표현식을 검증하여 실패하면 그 지점까지 이르는 콜스택을 생성한다.

델리게이트
ㄴ 델리게이트는 힙에 메모리를 할당해야 하기 때문에 값으로 전달 가능하기는 하지만 가급적이면 참조
전달하는 편이 낫다.
ㄴ 델리게이트 선언은 제공되어 있는 매크로 중 하나를 사용하여 이루어진다.
선언한 델리게이트 유형을 사용하여 델리게이트 클래스의 인스턴스를 생성한다.
함수에 델리게이트를 동적으로 바인딩 후 델리게이트의 Execute를 호출하면 됨
ㄴ 캐릭터에 Onattacked 델리게이트를 public으로 만들어 놓고 다른 클래스들에서 이 델리게이트에 접근하여
호출되었으면 하는 함수를 등록하는 방식으로 사용할 수 있다.

타이머
ㄴ 타이머는 글로벌 타이머 매니저에서 관리한다. GetWorldTimerManager 
ㄴ SetTimer와 SetTimerForNextTick 함수로 타이머를 셋업하는데, 각각 오버로드가 다수 있다.
ㄴ SetTimer 함수는 딜레이 후 함수나 델리게이트를 호출하는 타이머를 설정하며, 그 함수 호출을 무한 반복하도록 설정할 수 있다.
ㄴ PauseTimer는 타이머 핸들을 사용하여 실행중인 타이머를 일시정지한다. 함수 호출 실행은 막히지만 경과 및 남은 시간은 그대로 유지된다.
ㄴ 액터에 종속된 다른 액터 초기화에 사용할 수 있다.


게임플레이 모듈
모듈의 루트 폴더는 해당 모듈과 이름이 동일해야 한다.
ㄴ Source\[모듈명]\Public 디렉터리에 헤더 파일
ㄴ Source\[모듈명]\Private 디렉터리에 C++ 파일
IMPLEMENT_PRIMARY_GAME_MODULE( <ModuleName>, "<GameName>");
ㄴ Source\[모듈명] 디렉터리에 빌드 파일(모듈명.Build.cs)

DefaultEngine.ini 파일에 추가한 모듈에 대한 내용을 추가해야 한다.

인터페이스
트리거 볼륨에 들어서면 함정이 발동되거나, 적에게 경보가 울리거나, 플레이어에게 점수를 주는 시스템을 가진 게임
ㄴ 함정, 적, 점수에서 ReactToTrigger 함수를 구현 
ㄴ 여러 클래스에서 공유 함수 기능이 필요하므로 인터페이스를 사용하여 ReactToTrigger 함수를 가상 함수로 선언

인터페이스 선언
UINTERFACE 매크로를 사용
UObject 대신 UInterface를 상속 (UInterface가 진짜 인터페이스는 아님)
헤더 파일에 UInterface 를 상속받는 클래스 이름에서 U를 I로 바꾼 클래스를 정의한다.
다른 클래스에서 상속하게 되는 실제 인터페이스는 이 I로 시작하는 클래스가 될 것이다.

프로퍼티 (UPROPERTY 매크로)
정수, (비트 마스크로 노출 가능)
부동 소수점 (float, double)
부울
스트링 
ㄴ FString : 고정적인 캐릭터 동적 배열
ㄴ FName : 스트링 테이블로 된 변경불능 대소문자 구분 없는 스트링에 대한 레퍼런스 
ㄴ FText : 현지화 처리를 위해 고안된 보다 탄탄한 스트링 표현'

구조체 (USTRUCT 매크로)

코어 리디렉트 
ㄴ 개발 도중 기존 클래스, 프로퍼티, 함수의 이름을 변경해야 할 경우가 있을 때 사용한다.
ㄴ 플러그인이나 프로젝트의 ini 파일에 구성

스태틱 메시 액터

ㄴ 메시의 지오메트리가 변화하지 않음
ㄴ 액터 자체는 움직이거나 변경될 수 있음
ㄴ 일반적으로 게임 월드 또는 기타 배경을 생성하는데 사용됨

브러시 액터

ㄴ 단순한 3D 지오메트리 (구체, 큐브, 원기둥)을 나타내는 액터
ㄴ 환경 프로토타입을 빠르게 만들고 레벨의 윤곽 작업을 할 때 사용

스켈레탈 메시 액터

ㄴ 지오메트리를 변형할 수 있는 애니메이팅된 메시를 나타내며, 일반적으로 애니메이션 시퀀스 도중 컨트롤 포인트를
사용하여 변형한다.

라이트 액터

ㄴ 디렉셔널 라이트 액터 : 평행광
ㄴ 포인트 라이트 액터 : 점광
ㄴ 스포트 라이트 액터 : 점적광
ㄴ 렉트 라이트 액터 : 사각형 평면으로부터 레벨에 라이트를 발산
ㄴ 스카이 라이트 액터 : 레벨의 먼 지역을 캡처하여 라이트 소스로 씬에 적용

카메라 액터와 시네 카메라 액터

앰비언트 사운드 액터

ㄴ 레벨의 특정 위치에서 루핑 사운드를 재생

오디오 볼륨 액터

ㄴ 오디오의 영향을 받는 영역을 정의하고 리버브 이펙트를 적용

트리거 볼륨 액터

ㄴ 레벨에서 액터가 다른 것과 인터렉션할 때 이벤트를 일으키는 액터
ㄴ 박스, 캡슐, 구체와 같은 형태를 선택할 수 있다.

플레이어 스타트 액터

ㄴ 레벨을 시작할 때 플레이어 캐릭터를 스폰할 위치를 지정

비주얼 이펙트 액터

ㄴ 레벨의 외형과 느낌을 변경하는데 사용, 한정된 3D 볼륨으로 정의

데칼

ㄴ 메시 표면에 배치되어 그 위에 머터리얼을 렌더링한다.

월드 빌딩 엑터

ㄴ 스카이 애트머스피어, 포그, 볼류메트릭 클라우드 등 사실적인 디테일을 더할 수 있다.


레벨을 만들 때 오픈 월드 템플릿을 선택하면 월드 파티션 기능을 사용하여 스트리밍 가능한 오픈 월드를 생성하는 레벨을 만들 수 있다.

 

월드 파티션

ㄴ 대규모 월드를 관리하기 위해 자동 데이터 관리, 거리 기반 레벨 스트리밍 시스템을 사용

ㄴ 스트리밍 소스와 셀의 거리에 따라 로드, 언로드하는 자동 스트리밍 시스템

ㄴ 사용자(개발자) 간의 파일 오버랩을 최소화할 수 있다.

ㄴ 엔진은 특정 시간에 플레이어가 보고 상호작용하는 부분만 로드한다. (플레이어 컨트롤러의 Enable Streaming Source 옵션이 켜져 있다면(디폴트))

 

스트리밍 소스

ㄴ 월드의 특정한 위치 주변 셀의 로딩을 유발하는 컴포넌트

ㄴ 플레이어 컨트롤러는 스트리밍 소스

ㄴ 플레이어 컨트롤러 외의 스트리밍 소스를 추가하기 위해서 월드 파티션 스트리밍 소스 컴포넌트를 사용하여 다른 스트리밍 소스를 월드에 추가할 수도 있다. (플레이어의 텔레포트를 구현해야 할 경우 사용할 수 있다.)

 

월드 파티션과 관련 있는 기능

1. One File Per Actor

ㄴ 여러 팀원이 액터 변경 작업을 하더라도 메인 레벨 파일을 저장할 필요가 없게 되어 사용자 간 작업이 겹치는 상황을 줄여준다. (에디터에서만 이용 가능하다, 모든 액터는 쿠킹될 때 각 레벨 파일에 임베드됨)

ㄴ 월드 파티션을 사용할 때 기본적으로 활성화되어 있다.

ㄴ 1. 특정한 액터에 대해 기능을 활성화 하는 방법 Detail -> Packaging Mode를 External로 설정

ㄴ 2. 전체 레벨의 모든 액터에 대해 기능을 활성화 하는 방법 World Settings -> Use External Actors 체크

현재 레벨 뿐만 아니라 모든 서브레벨을 변환하려면 레벨과 서브레벨을 자동으로 변환하는 커맨드릿을 사용할 수 있다.

 

2. 월드 파티션 - Data Layers

ㄴ 액터를 별도 레이어로 구성하고, 레이어를 로드 언로드하여 월드를 구성한다.

ㄴ 블루프린터로 데이터 레이어를 활성화 할 수 있다.

ㄴ Windows -> World Partition -> Data Layers 

ㄴ 레이어를 만들어 놓고, 액터의 detail -> Data Layers에서 액터를 특정 레이어에 추가할 수 있다.

ㄴ 레이어의 상태는 로드, 언로드, 활성화 중 하나로 표현된다.

 

3. Level Instancing

ㄴ 월드 파티션이 아닌 월드를 월드 파티션 시스템으로 쉽게 이식할 수 있게 해주는 레벨 기반 워크플로

ㄴ 여러 개의 액터를 그룹화하여 하나의 액터로 

 

4. 월드 파티션 - HLOD 

ㄴ 거리가 멀어 언로드된 월드 파티션 그리드 셀을 시각화하여 프레임당 draw 콜 수를 줄인다.

ㄴ 멀리 떨어져있고, 상호작용이 없는 액터를 계속 보이게 해야 할 경우 HLOD에 포함시키면 좋다.

ㄴ 액터를 HLOD 레이어에 추가하는 법 : 액터의 Details -> HLOD 프로퍼티

 

월드 파티션 활성화 방법

ㄴ 월드 세팅에 있는 스트리밍 활성화 옵션 체크

 

기존 레벨을 월드 파티션을 사용할 수 있도록 변환하기

방법 1. Tools -> Convert Level

방법 2. 월드 파티션 변환 커맨드릿 사용하기

 

다수의 레벨 관리

Window-> levels 

 

항상 하나의 Persistent Level이 있으며, 항상 로드되거나 레벨 스트리밍 볼륨, 블루프린트, C++ 코드를 총해 스트림 인 가능한 서브 레벨 하나 이상으로 구성된다.

 

서브레벨 생성은 기존 퍼시스턴트 레벨이나 서브레벨의 일부분을 떼어내거나, 새로운 레벨을 만들거나, 기존 레벨을 추가하는 식으로 이루어진다.

 

월드 세팅

ㄴ 일반적으로 게임 모드와 탐색에 영향을 주는 세팅과 게임의 라이팅, 오디오, 피직스 등을 환경설정하는 특수한 세팅을 포함한다.

 

'언리얼 5 > 정리' 카테고리의 다른 글

개발 구성, 엔진 아키텍처  (0) 2022.10.18
액터 종류  (0) 2022.10.18
애셋과 레퍼런스  (0) 2022.10.14
기초 지식 - 에디터 종류  (0) 2022.10.14
기초 지식 - 기본적인 용어 정리  (0) 2022.10.14

애셋 익스포트

ㄴ 프로젝트 내의 애셋은 .uasset 파일로 저장되어 있는데 (언리얼 엔진 전용 파일 포맷) 다른 언리얼 프로젝트에서 사용하려면 이 파일을 옮기면 된다.

ㄴ 애셋 유형에 따라 익스포트 가능한 파일 유형이 다르다. (FBX, OBJ, COPY 등)

 

레퍼런스 대체 툴

ㄴ 중복되는 애셋 전부를 선택하고 Asset Actions -> Replace References 

ㄴ 선택된 애셋 중 하나의 애셋만 남기고 제거하므로 조심해서 사용해야 한다.

 

애셋 이주

ㄴ 여러 프로젝트에서 같은 애셋을 이용할 때 이주 툴을 사용하여 에셋을 관련 레퍼런스 및 종속성과 함께 복사할 수 있다.

 

애셋 메타데이터

ㄴ 애셋 생성자의 이름, 프로젝트에서 애셋을 사용하려는 목적, 팀의 워크플로에서 애셋의 상태 등의 정보가 포함될 수 있다.

ㄴ 타사 애플리케이션에서 생성한 메타데이터를 애셋과 함께 언리얼 에디터로 임포트할 수도 있다.

ㄴ 런타임 게임플레이 코드에서 직접 액세스할 수는 없지만 언리얼 에디터에서 에셋 관리 작업을 스크립팅하는데 사용할 수 있다. (에디터 스크립팅 유틸리티 플러그인 설치가 필요)

ㄴ 프로젝트 세팅 -> game -> Asset Manager -> Asset Registry -> 메타데이터 태그 설정에서 특정 메타데이터 태그로 애셋을 필터링할 수도 있다.

 

자동 리임포트

ㄴ 외부 컨텐츠 제작 패키지에서 작업하여 저장한 변경사항을 별다른 사용자 입력 없이도 엔진에 자동 반영되도록 하는 기능. 사용자가 지정한 폴더 세트에 대해 소스 컨텐츠 파일의 변경사항을 모니터링하여 파일 변경이 있었으면 변경된 파일을 해당 애셋에 다시 임포트

ㄴ  editor preference -> Loading & Saving -> Auto Reimport 항목

 

클래스 뷰어

ㄴ Tools -> Class Viewer

ㄴ 사용할 수 있는 모든 클래스들을 보여준다. 필터링해서 볼 수도 있다.

 

프로퍼티 매트릭스

ㄴ 다수의 오브젝트나 액터의 프로퍼티를 한번에 편집할 수 있다.

'언리얼 5 > 정리' 카테고리의 다른 글

액터 종류  (0) 2022.10.18
레벨, 월드 세팅, 월드 파티션  (0) 2022.10.15
기초 지식 - 에디터 종류  (0) 2022.10.14
기초 지식 - 기본적인 용어 정리  (0) 2022.10.14
라이팅 설정  (0) 2022.10.05

일부 툴과 에디터는 플러그인을 설치하여 프로젝트에 필요한지에 따라 활성화 또는 비활성화할 수 있다.

 

레벨 에디터

ㄴ 레벨의 플레이 공간을 정의할 수 있다. 프로젝트를 열때 자동으로 켜진다.

 

스태틱 메시 에디터

ㄴ 스태틱 메시의 형태, 콜리전, UV 매핑 프리뷰, 스태틱 메시 에셋의 LOD 제어

 

머터리얼 에디터

ㄴ 메시의 시각적 형태를 제어할 수 있는 머터리얼을 편집

 

블루프린트 에디터

ㄴ 비주얼 스크립팅을 위한 UI를 제공함

 

피직스 에셋 에디터

ㄴ 스켈레탈 메시에 사용되는 콜리전과 피직스를 정의하는 데 사용된다.

 

비헤이비어 트리 에디터

ㄴ 비헤이비어 트리, 블랙보드, 태스크, 데코레이터, 서비스를 사용하여 AI를 생성할 수 있다.

 

나이아가라 에디터

ㄴ 파티클 효과 편집

 

UMG UI 에디터

ㄴ 위젯 블루프린트 에디터에서 비주얼 레이아웃 편집과 그래프를 이용해 스크립트 기능을 사용할 수 있다. 

ㄴ 스크립트 기능으로 위젯 블루프린트 자체적으로 플레이어 캐릭터의 레퍼런스를 얻어 체력과 체력 bar를 바인딩 할 수 있다.

 

https://docs.unrealengine.com/5.0/ko/umg-ui-designer-quick-start-guide/

 

UMG UI 디자이너 퀵스타트 가이드

언리얼 엔진 4 에서 언리얼 모션 그래픽 사용 시작 안내입니다.

docs.unrealengine.com

 

폰트 에디터

ㄴ 폰트와 폰트 페이스 에셋을 다룬다.

ㄴ 폰트 페이스 애셋은 폰트를 임포트할 때 생성되며, 폰트 애셋에서 참조할 수 있는 폰트 데이터를 저장한다.

ㄴ 폰트 페이스 애셋을 열면 Hinting 및 Loading Policy 세팅에 접근할 수 있다.

 

시퀀서 에디터

ㄴ 인게임 시네마틱을 제작할 수 있는 특수한 멀티트랙 에디터입니다. 

ㄴ 레벨 시퀀스(Level Sequences) 를 생성하고 트랙(Tracks) 을 추가하여 씬의 콘텐츠를 결정하는 각 트랙의 구성을 정의할 수 있습니다. 트랙은 애니메이션(캐릭터 애니메이팅), 트랜스포메이션(씬 안의 사물 이동), 오디오(음악 또는 사운드 이펙트 포함) 등으로 이루어질 수 있습니다.

 

애니메이션 에디터

ㄴ 스켈레톤 에셋, 스켈레탈 메시, 애니메이션 블루프린트, 그 외 다양한 애니메이션 애셋을 편집하는데 사용된다.

 

컨트롤 릭 에디터

ㄴ 엔진 내에서 캐릭터를 직접 리깅할 수 있는 애니메이션 툴을 제공한다. 리깅 및 애니메이팅 작업에 외부 툴을 이용할 필요가 없다.

 

사운드 큐 에디터

ㄴ 몇 가지 사운드 에셋을 조합하고 혼합하여 사운드 큐로 저장된 하나의 혼합된 출력을 생성할 수 있다.

 

미디어 에디터

ㄴ 외부 미디어의 URL이나 파일을 정의하여 엔진 내에서 재생할 수 있다.

 

nDisplay3D 환경설정 에디터

ㄴ 파워월, 돔, 곡면 화면 같은 여러 동기화된 디스플레이 장치(엔진 내에 존재하는)에서 언리얼 엔진 씬을 렌더링할 수 있다.

 

DMX 라이브러리 에디터

ㄴ 라이브 이벤트 산업에 사용된다.

'언리얼 5 > 정리' 카테고리의 다른 글

레벨, 월드 세팅, 월드 파티션  (0) 2022.10.15
애셋과 레퍼런스  (0) 2022.10.14
기초 지식 - 기본적인 용어 정리  (0) 2022.10.14
라이팅 설정  (0) 2022.10.05
컨테이너  (0) 2022.09.15

 

오브젝트

ㄴ UObject를 상속받는 클래스

ㄴ UObject에는 가비지 컬렉션, UProperty, 로딩 및 저장 직렬화 기능이 구현되어 있음

 

클래스

ㄴ C++나 블루프린트로 생성될 수 있다.

ㄴ 특정 액터나 오브젝트의 행동과 프로퍼티를 정의한다.

 

블루프린트 클래스

콘텐트 제작자가 기존의 클래스 위에 다른 함수성을 쉽게 (비주얼 스크립팅) 추가할 수 있도록 해주는 애셋

 

게임플레이 클래스

각 게임플레이 클래스 소스 파일 위에는, 클래스에 대해 (자동 생성되는) 제너레이티드 헤더 파일을 포함시켜 줘야 한다.

ㄴ A 접두사 : 스폰 가능한 오브젝트(액터)의 서브클래스들에 붙음

ㄴ U 접두사 : 월드에 직접 인스턴싱 될 수 없는 오브젝트, 보통 액터에 포함되는 컴포넌트를 의미함

ㄴ 클래스 헤더 : 각 게임플레이 클래스 소스 파일 위에는, 클래스에 대해 (자동 생성되는) 제너레이티드 헤더 파일을 포함시켜 줘야 한다.

#include "ClassName.generated.h"

 

ㄴ 클래스 선언 : UCLASS 매크로를 사용하여 엔진 및 에디터 전용 속성을 전달한다.

클래스 지정자나 메타데이터 지정자가 전달된다.

UCLASS([specifier, specifier, ...], [meta(key=value, key=value, ...)])
class ClassName : public ParentName
{
    GENERATED_BODY()
}

 

에디터에서 C++ Classes 폴더에서 C++ 클래스를 추가할 수 있고, 여기서 부모 클래스를 지정하면서 만들 수 있다. 접두사는 에디터가 부모 클래스 종류를 보고 알아서 붙여준다.

자동으로 만들어지는 헤더 파일에는 UCLASS와 GENERATED_BODY 매크로가 자동으로 포함되어 있다.

헤더에서는 새로 추가할 프로퍼티들 윗줄에 UPROPERTY 매크로를 추가해줘야 한다.

 

클래스를 설계할 때 C++ 전용 / 블루프린트 전용 / 혼합형 으로 만들 수 있다.

C++ 전용으로 만든 클래스를 블루프린트 클래스가 상속받도록 하면 블루프린트로 확장할 수 있지만 해당 클래스에서 생성한 함수, 변수, 컴포넌트는 블루프린트에 접근할 수 없다. 다음과 같은 지정자가 있어야 한다.

ㄴ 이벤트 함수에는 UFUCTION 매크로와 BlueprintNativeEvent 지정자

ㄴ 프로퍼티에는 UPROPERTY 매크로와 BlueprintReadOnly 혹은 BlueprintReadWrite 지정자

ㄴ UCLASS 매크로에는 Blueprintable 지정자

 

C++ 클래스를 상속받는 블루프린트 클래스를 생성하면, 블루프린트 관리 창에서 상속한 클래스에서 만든 프로퍼티, 함수들이 보인다. 이벤트 그래프나 Construction Script를 활용하여 기존 함수의 기능들을 오버라이딩 할 수 있다.

 

액터

ㄴ 액터 인스턴스는 SpawnActor로 생성한다.

ㄴ 레벨에 배치할 수 있는 모든 오브젝트 (유니티의 게임오브젝트 역할)

ㄴ 액터 자체에는 트랜스폼 정보가 없지만 루트 컴포넌트로 씬 컴포넌트를 가진다면 액터가 트랜스폼 정보를 활용할 수 있다.

ㄴ 가비지 컬렉팅 대상이 아니므로 Destroy를 사용하여 명시적으로 소멸시켜줘야 한다.

 

컴포넌트

ㄴ 액터에 서브 오브젝트로 붙을 수 있는 특수한 타입의 오브젝트

일반적인 서브 오브젝트의 기본 작동방식과는 상반되게, 액터 안에 서브 오브젝트로 생성된 컴포넌트는 인스턴스로 생성됩니다. 특정 클래스의 액터 인스턴스 각각은 컴포넌트의 고유 인스턴스를 별도로 갖는다

 

핵심 컴포넌트 3가지

UActorComponent  : 액터 컴포넌트

ㄴ 기능만 가지고 있는 컴포넌트, 모든 컴포넌트의 베이스 클래스

USceneComponent : 씬 컴포넌트

ㄴ 트랜스폼 정보가 있는 컴포넌트(계층 구조를 이룰 수 있는), 액터 컴포넌트의 자식 클래스

UPrimitiveComponent : 프리미티브 컴포넌트

ㄴ 씬 컴포넌트의 자식 클래스, 그래픽적 표현을 갖는 컴포넌트 (메시, 콜리전, 빌보드, 파티클 시스템 등)

컴포넌트가 매 틱마다 업데이트 되려면 액터 컴포넌트가 등록되어 있어야 한다. 액터가 스폰될 때 해당 액터의 서브 오브젝트로 생성되는 컴포넌트는 자동으로 등록되지만 게임 중간에 생성되는 컴포넌트는 수동 등록해줘야 한다. RegisterComponent 함수를 사용한다.

 

ㄴ 액터의 서브클래스

ㄴ 주로 플레이어나 NPC로 사용됨

ㄴ 폰의 서브클래스로 DefaultPawn이나 SpectatorPawn을 사용할 수도 있다.

 

캐릭터

ㄴ 폰의 서브클래스

 

플레이어 컨트롤러

ㄴ 주로 플레이어를 나타내는 캐릭터나 폰을 Possess(빙의)한다.

플레이어의 입력을 게임 안의 상호작용으로 변환

멀티플레이어 게임의 주요한 네트워크 상호작용 지점

 

AI 컨트롤러

ㄴ 사용자는 플레이어 컨트롤러를 사용하여 폰을 제어하고 AI 플레이어는 AI 컨트롤러를 사용하여 폰을 제어한다.

 

플레이어 스테이트

게임 참여자의 스테이트를 말한다.

ㄴ 멀티플레이어 게임의 경우 모든 컴퓨터에 모든 플레이어의 플레이어 스테이트가 존재한다.

 

게임 모드

ㄴ 플레이 중인 게임의 규칙을 설정한다.

ㄴ 멀티플레이어 게임의 경우 게임 모드는 서버에만 존재한다.

ㄴ 하나의 레벨에는 하나의 게임 모드만 존재할 수 있다.

 

게임 스테이트

게임 내의 모든 클라이언트에 복제할 정보가 들어 있는 컨테이너 (서버가 모든 클라이언트에 전달해야 할 정보)

멀티플레이어 게임의 경우 게임 스테이트에 대한 로컬 인스턴스가 각 플레이어의 컴퓨터에 하나씩 있고, 로컬 게임 스테이트 인스턴스는 서버의 게임 스테이트 인스턴스에서 업데이트된 정보를 가져온다.

 

브러시

ㄴ 큐브, 구체와 같은 3D shape을 묘사하는 액터

ㄴ Gemoetry Mode에서 진행

레벨 및 오브젝트의 초기 프로덕션 단계에서 프로토타입을 빠르게 제작하는 데 유용하지만 레벨 디자인의 최종 방식으로는 권장되지 않는다.

 

볼륨

ㄴ 연결된 효과에 따라 용도가 달라지는 바운드된 3D 공간

ㄴ 투명벽, 트리거를 만들 수 있다.

 

레벨과 월드

ㄴ 레벨은 작은 단위의 게임플레이 영역이고 월드는 레벨들의 컨테이너

ㄴ 각 레벨은 .umap 파일로 저장됨

ㄴ 월드 세팅의 일반적인 세팅 그룹에는 게임 모드와 탐색에 영향을 주는 등의 세팅이 있다. 기타 좀 더 특수한 세팅은 게임의 라이팅, 오디오, 피직스 등을 환경설정하는 데 사용된다.

'언리얼 5 > 정리' 카테고리의 다른 글

애셋과 레퍼런스  (0) 2022.10.14
기초 지식 - 에디터 종류  (0) 2022.10.14
라이팅 설정  (0) 2022.10.05
컨테이너  (0) 2022.09.15
AI Controller & Behavior Tree  (0) 2022.09.14

+ Recent posts