본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 07. Cosmetic

Modular Gameplay Actors

AddComponent가 가능한 대상은 GameFrameworkComponentManager에 등록되어있어야 한다.

Character,PlayerController 대신 ModularCharacter, ModularPlayerController을 상속받으면 자동으로 등록된다.

 

Cosmetic

플레이어에 붙이는 Mesh또한 컴포넌트화해서 붙였다 뗐다 할 수 있다. 

 

ControllerComponent_CharacterParts

어떤 캐릭터 모양을 쓸지 여러개를 들고 있음 

메타데이터만 들고 있음

 

ControllerCharacterPartEntry

CharacterPart - CharacterPart에 대한 정의를 메타데이터로 가짐

액터의 TSubClassOf 클래스(메타데이터), 소켓 이름(파츠를 특정 소켓에 붙이고 싶을 경우 대비)을 가짐

CharacterPartHandle - 장착한 CharacterPart를 고유값으로 가짐

 

PawnComponent_CharacterParts

사용할 캐릭터 모양 하나를 말함

메타데이터를 받아 장착함

CharacterPartList 

AppliedCharacterPartEntry - 적용된 파츠 메타데이터, 핸들값, 인스턴스화된 액터를 가짐(파츠 교체시 제거 위해)

 

언리얼 데디케이트 서버 통신 방식은 배열 일부를 수정했을 때 배열 전체 데이터를 다시 보내야 한다.

그래서 SerializedArray 라는 방식을 이용하는데, 이 때 조건이 배열과 요소를 구분시켜야 한다. 그러면 

일부를 수정했을 때 일부 데이터만 보내면 된다. 그래서 CharacterPartEntry와 List로 나눈 것이다.

 

AnimBodyStyleSelectionSet

AnimBodyStyleSelectionEntry - Animation,Mesh간 Rule을 뜻한다.

Mesh와 GameplayTag를 가진다. GameplayTag에 맞는 Mesh를 가져온다.

 

ControllerComponent_CharacterParts는 GameFeature의 Add Components에서 추가하고,

PawnComponent_CharacterParts는 플레이어 블루프린트에서 직접 추가하는데 왜 그런걸까?

ControllerComponent는 가벼운 메타데이터를 들고 있고 PawnComponent는 무거운 Mesh를 들고 있다. 

그래서 한번에 모든 Mesh를 들고 다닐 수 없기 때문에 따로 추가한 후 종류별로 Mesh를 별도 설정한다.

 

 

 

장착 로직

AddCharacterPart

GetPawn에서 FindComponentByClass로 PawnComponent_CharacterParts를 찾고 거기에다

AddCharacterPart한다. 그러면 PawnComponent에서 CharacterPartList에 파츠를 추가한다.

 

CharacterPartList::AddEntry에서 AppliedCharacterPartEntry를 SpawnActorForEntry에 전달한다.

SpawnActorForEntry에서 OwnerComponent->GetSceneComponentToAttachTo로 Pawn을 구하고

전달받은 파츠의 메타데이터 PartClass를 SetChildActorClass 후 RegisterComponent하면 파츠가 스폰된다.

 

그리고 파츠(자식)가 폰(부모)보다 먼저 Tick되지 않도록 AddTickPrerequisiteComponent함수로 제한한다.

SpawnActorForEntry가 성공하면 BroadcastChanged를 실행하는데 게임플레이태그에 맞는

SkeletalMesh, PhysicsAsset을 Set한다.

 

Possess하는 Pawn이 바뀔 때 마다 OnPossessedPawnChanged함수를 바인드 해 실행하게 한다.

Pawn이 바뀌면 현재 파츠를 전부 제거하고 새로운 폰의 파츠를 부착한다.