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

 

아이템과 겹칠 시 충돌 함수에서 캐릭터의 획득 함수를 바로 실행하거나, 키 입력에 인벤토리 관련 함수를 바로 바인딩하는 고전적인 방법 대신, 이벤트 태그를 전달해 상호작용 하는 방법에 대해 알아본다.

  • 추가적인 Gameplay Ability를 만드는 대신 이벤트와 이벤트 태그를 활용하면, 어떤 능력에도 종속적이지 않은 독립적인 컴포넌트를 만들 수 있다.

 

우선 인벤토리 컴포넌트에 이벤트 태그 관련 헤더를 추가한다.

 

각 동작의 게임플레이 태그와 태그를 전달 받았을 때 수행될 콜백 함수를 선언한다.

 

게임 플레이 태그를 UPROPERTY로 만들어 에디터에서 설정하지 않고, static으로 만들어 다른 클래스에서 참조할 수 있도록 하면 이벤트를 받은 쪽에서 쉽게 확인할 수 있다.

 

 

에이터에서 태그를 설정하지 않기 때문에, Gameplay Tags Manager를 통해 런타임에 태그를 생성하고 각 태그에 저장해주는 함수를 선언한다.

 

실질적으로 태그에 따른 로직을 수행하는 HandleGameplayEventInternal() 함수와 서버 RPC 함수를 선언한다.

  • GameplayEventCallback() 함수는 서버일 경우 HandleGameplayEventInternal() 함수를 실행하고, 클라이언트일 경우 서버 RPC 요청을 보낸다.
  • 능력으로부터 독립적인 컴포넌트로 만들 것이기 때문에 스스로 복제해야 한다.
    따라서, 모든 작업은 서버에서만 일어나도록 서버 RPC 함수를 만들어야 한다.

 


헤더를 포함하고 static 변수들을 처리해준다.

 


생성자에서 static bool 변수와 Gameplay Tags Manager를 이용해 AddInventoryTags() 함수를 통해 4개의 태그가 생성되고 저장되로록 한다.

  • 모든 캐릭터의 인벤토리 컴포넌트에서 실행되면 태그 추가 작업이 여러 번 실행되기 때문에, 한 번만 실행시켜 주기 위함이다.


Gameplay Tags Manager를 통해 태그를 생성하고 저장하는 AddInventoryTags() 함수를 구현한다.

 


InitializeComponent() 함수에서 각 태그를 전달 받았을 때 실행할 콜백 함수를 등록한다.

  • 여기서는 GameplayEventCallback() 함수를 통해 HandleGameplayEventInternal() 함수에서 일괄적으로 처리한다.

 


태그를 전달 받았을 때 실행되는 콜백 함수인 GameplayEventCallback() 함수를 구현한다.

  • 역할에 따라 실제 처리 함수 혹은 서버 RPC 요청을 보낸다.

 

 

서버 RPC 요청을 받으면 실제 로직을 수행한다.

 


태그를 전받 받았을 때 실제 처리 로직에서는 각 태그별로 동작을 정의한다.

  • Payload를 통해 함께 전달 받은 Instigator와 OptionalObject에는 실물 아이템과 메모리 상 아이템 객체의 주소가 들어 있는데, 둘 모두 복제되고 있으므로 받는 쪽에서도 그대로 사용할 수 있다.
  • const_cast<T*>() 함수로 const를 제거할 수 있다.

 

 

실물 아이템 Item Actor 클래스에 구 컴포넌트와 겹칠 시 실행될 콜백 함수를 선언한다.

 


헤더를 추가하고 구 컴포넌트의 OnComponentBeginOverlap 다이나믹 델리게이트에 함수를 등록한다.

 

 

실물 아이템이 캐릭터와 겹칠 시 캐릭터에 아이템 획득 이벤트 태그를 전달하도록 한다.

  • ItemActor는 이미 복제되고 있기 때문에, FGameplayEventData::Instigator에 this 포인터를 담아 보내도 멀티 플레이어에서 정상적으로 작동한다.

 


이제 캐릭터에 입력을 추가하고, 각 입력에는 캐릭터에 각각의 이벤트 태그를 보내도록 한다.

 


SetupPlayerInputComponent() 함수에서 입력에 함수를 바인딩한다.

 


컴포넌트를 가져와 함수를 바로 실행하는 고전적인 방식 대신, 독립적인 컴포넌트에 이벤트 태그를 전달해 처리하는 방식으로 구현한다.

 

 

에디터에서 Jump Input Action을 복사해 3개 입력을 추가로 생성한다.

 


Input Mapping Context에 3개 입력에 키를 할당한다.

 


캐릭터 BP에서 3개 입력에 대한 Input Action을 지정한다.

 

 

이번에는 월드에 미리 배치된 실물 아이템을 획득해 테스트할 것이므로, 인벤토리 컴포넌트에서 기본 아이템은 제거해준다.

 


월드에 BP_TestItem 실물 아이템을 배치해주고 테스트 해본다.

 


잘 획득된다.

 

 

장착 및 해제도 잘 된다.

 

 

장착한 아이템 버리기도 잘 된다.

 


멀티 플레이어에서도 잘 된다.

 

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

인벤토리 아이템 액터  (0) 2023.05.20
인벤토리 컴포넌트  (0) 2023.05.19
인벤토리 구조체 선언  (0) 2023.05.18
인벤토리 아이템 정적 데이터  (0) 2023.05.17
인벤토리 구조  (0) 2023.05.16
profile

Make Unreal REAL.

@diesuki4

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

검색 태그