Make Unreal REAL.
article thumbnail
Advanced Unreal Engine 5 Multiplayer Gameplay Programming

 

InventoryComponent C++ 클래스를 생성한다.

 

 

 

컴포넌트 리플리케이션

네트워크 리플리케이션에 대한 컴포넌트 셋업하기 입니다.

docs.unrealengine.com


헤더를 포함하고 InitializeComponent(), ReplicateSubobjects(), GetLifetimeReplicatedProps() 함수를 오버라이드한다.

  • ReplicateSubobjects() 함수는 액터 컴포넌트가 아닌, 서브오브젝트를 복제하고자 할 때 사용한다.

 

아이템 정적 정보 클래스를 통해 아이템 객체 배열인 InventoryList에 아이템을 추가하고 삭제하는 기능을 제공한다.

  • 추가의 경우, 전달 받은 아이템 객체를 바로 인벤토리에 추가하는 기능도 제공한다.
  • BP에서도 함께 사용할 함수는 오버로딩을 사용할 수 없기 때문에 다른 이름으로 선언해야 한다.

 

 

인벤토리 아이템 목록을 관리하는 FInventoryList 타입의 변수를 선언한다.

  • Fast Array Serialization 방식을 사용하는 FFastArraySerializer를 부모로 하는 배열의 래퍼이다.
  • ReplicateSubobjects() 함수를 통해 InventoryList의 아이템 객체를 복제한다.

 

정적 데이터 클래스 배열을 통해 모든 캐릭터가 기본적으로 갖고 있게 할 DefaultItems 변수도 선언한다.

 


InitializeComponent() 함수가 호출되게 하기 위해서는 bWantsInitializeComponent를 true로 설정해주어야 한다.

 

컴포넌트가 기본적으로 복제되도록 설정한다.

 


함수를 본격적으로 구현하기 전에 헤더를 포함해주고 디버깅에 사용할 콘솔 변수를 선언해준다.

 


InitializeComponent() 함수를 구현한다.

  • 정적 데이터 클래스 배열로부터 인벤토리 목록에 기본 아이템을 추가한다.

 

 

인벤토리에서 아이템을 추가하고 삭제하는 함수를 구현한다.

 


ReplicateSubobjects() 함수를 구현한다.

 

액터 컴포넌트가 아니라, 서브오브젝트인 InventoryList의 아이템 객체를 복제한다.

 


GetLifetimeReplicatedProps() 함수를 구현한다.

 

인벤토리 배열 레퍼인 InventoryList를 복제하도록 등록해준다.

 


TickComponent() 함수에 아까 선언했던 콘솔 변수의 값을 이용해 디버깅 기능을 구현한다.

 

InventoryList에서 각 아이템들을 순회하면서 이름을 출력한다.

  • UInventoryItemInstance::GetItemStaticData() 함수는 아이템의 정적 데이터 클래스의 CDO를 반환하도록 구현되어 있다.

 


캐릭터 클래스에 방금 구현했던 Inventory 컴포넌트를 추가한다.

  • Inventory 컴포넌트는 구현에 따라 플레이어 컨트롤러나 플레이어 스테이트에 붙일 수도 있고, 캐릭터에 붙일 수도 있다.
  • 캐릭터에 붙일 경우 캐릭터가 죽으면 인벤토리도 함께 소멸하고, 죽어도 유지하려면 플레이어 컨트롤러나 플레이어 스테이트에 붙이면 된다.

 


캐릭터의 생성자에서 Inventory 컴포넌트를 할당해주고 복제하도록 설정한다.

 


컴포넌트 복제를 위해 GetLifetimeReplicatedProps() 함수에서도 등록해준다.

 


캐릭터 BP의 Inventory 컴포넌트에서 기본적으로 소지할 아이템 목록인 Default Items에 정적 데이터 클래스들을 설정해준다.

 


인벤토리 Component를 구현해 성공적으로 아이템 목록을 출력했다.

  • InitializeComponent() 함수에서 Default Items에 있는 정적 데이터 클래스 목록을 통해 아이템을 추가했기 때문이다.

 


멀티 플레이어에서는 인벤토리를 수정하기 전에 캐릭터가 권한을 갖고 있는지 확인해야 한다.

우선은 기본 아이템을 추가하는 Inventory 컴포넌트의 InitializeComponent() 함수에 권한을 확인하는 부분을 추가한다.

  • 서버만 기본 아이템을 추가하도록 하고, 나머지는 리플리케이션을 통해 복제되도록 한다.


이후부터 권한을 가진 서버만 인벤토리를 수정할 수 있도록 구현할 것이다.

 


멀티 플레이어에서도 리플리케이션을 통해 아이템 객체가 복제되었다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그