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

 

인벤토리 아이템 객체로 사용할 InventoryItemInstance UObject C++ 클래스를 생성한다.

 


빌드 설정에 NetCore 모듈을 추가한다.

 


헤더를 추가하고 초기화에 사용할 Init() 함수를 선언한다.

객체가 네트워크를 통해 참조되기 위해서는 IsSupportedForNetworking() 함수를 오버라이드해야 한다.

 

리플리케이션에 필요한 GetLifetimeReplicatedProps() 함수를 오버라이드한다.

 

아이템 객체의 정적 데이터 클래스의 CDO를 반환하는 헬퍼 함수도 선언한다.

 


CDO에서 아이템의 정적 정보를 가져오기 위한 클래스 정보와 장착 여부를 저장해본다.

  • 모든 속성은 네트워크를 통해 복제되어야 한다.

 


헤더를 추가하고 함수들을 구현한다.

 


C++ 클래스 생성시 None을 선택해 빈 클래스를 생성한다.

  • 이 클래스에는 인벤토리 설계에 필요한 구조체들을 선언할 것이다.

 


헤더를 포함하고 클래스 전방 선언을 한다.

  • UCLASS() 매크로가 포함되지 않은 헤더와 소스 파일이므로, 비주얼 스튜디오에서는 보이나 에디터에서는 뜨지 않는다.

 

 

네트워크 간에 정보를 빠르게 복제하기 위해 Fast Array Serialization 방식을 사용한다.

  • FFastArraySerializerItem, FFastArraySerializer 구조체를 사용해 구조체 배열을 빠르게 복제할 수 있다.
  • FFastArraySerializerItem은 원소의 래퍼이고, FFastArraySerializer은 배열의 래퍼이다.
  • 단, 배열에 변화가 생겼을 때 꼭 Dirty로 마킹해줘야 하고 복제 과정에서 원소들의 순서가 동일함을 보장하지 않는다는 특징이 있다.

 

원소로 사용될 Fast Array Serializer Item 구조체를 선언한다.

  • 직렬화되기 위해서는 GENERATED_BODY()와 UPROPERTY() 매크로를 지정해야 한다.


GENERATED_BODY() 매크로를 사용하려면 generated.h 헤더를 마지막에 포함해줘야 한다.

 

 

배열로 사용될 Fast Array Serializer 구조체를 선언한다.

  • NetDeltaSerialize() 함수를 구현해야 한다.
  • 원소를 추가하고 삭제하는 방법을 제공해야 한다.
  • 직렬화되기 위해서는 GENERATED_BODY()와 UPROPERTY() 매크로를 지정해야 한다.

 


Fast Array Serialization을 사용하기 위한 또 하나의 구조체를 선언한다.

 

 

함수를 구현하기 전에 헤더를 포함한다.

 


원소를 추가하는 AddItem() 함수를 구현한다.

  • TArray<T>::AddDefaulted_GetRef() 함수는 T 타입의 원소를 배열에 추가하고 레퍼런스를 반환한다.
  • 래퍼 내의 실제 원소에 NewObject() 함수로 새로운 아이템 객체를 할당하거나 전달 받은 아이템 객체를 할당한다.

 

Fast Array Serialization에서 배열에 변화가 있었기 때문에 Dirty로 마킹해준다.

  • 그렇지 않으면 변화 없음으로 처리되어 복제되지 않는다.
  • 추가된 원소를 특정할 수 있으므로, 원소를 Dirty로 마킹해준다.

 


원소를 삭제하는 RemoveItem() 함수를 구현한다.

  • TArray::CreateIterator() 함수로 배열을 순회할 수 있는 반복자를 가져올 수 있다.
  • UObjectBaseUtility::IsA() 함수는 객체가 전달된 클래스의 파생 클래스인지 확인하는 함수다.

 

일치하는 객체를 찾아 배열에서 제거하고, 변화가 발생했으므로 Dirty로 마킹해준다.

  • 삭제된 원소는 특정할 수 없으므로, 배열 자체를 Dirty로 마킹해준다.

 

'Unreal Engine > Advanced UE5 Multiplayer Programming' 카테고리의 다른 글

인벤토리 아이템 액터  (0) 2023.05.20
인벤토리 컴포넌트  (0) 2023.05.19
인벤토리 아이템 정적 데이터  (0) 2023.05.17
인벤토리 구조  (0) 2023.05.16
능력 간의 관계 설정  (0) 2023.05.15
profile

Make Unreal REAL.

@diesuki4

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

검색 태그