본문 바로가기

게임프로그래밍/실습2

[실습2] 46. 서버에서 타겟 데이터 수신하기

1. 클라이언트에서 보내는 데이터 서버에서 받기

 

데이터를 클라이언트에서 서버로 보내고 있다. 서버에서 이를 받아보자.

 

아래의 함수를 통해 서버로 데이터를 보내고 있다.

AbilitySystemComponent->ServerSetReplicatedTargetData

 

 

이제 서버에서 타겟데이터의 변화가 있을때 콜백함수를 바인딩할 수 있는 델리게이트를 만들어보자.

아래 함수를 통해 그것이 가능하다.

AbilityTargetDataSetDelegate

 

 

바인딩할 함수도 만들자.

 

브로드캐스트할때 보내는 데이터를 잘 받을 수 있게 함수 시그니처를 설정하였다

void OnTagetDataReplicateCallback(const FGameplayAbilityTargetDataHandle& DataHandle, FGameplayTag ActivationTag);

 

이제 바인딩을 하자.

 

AbilitySystemComponent.Get()->AbilityTargetDataSetDelegate(GetAbilitySpecHandle(), GetActivationPredictionKey()).AddUObject(this, &UTargetDataUnderMouse::OnTagetDataReplicateCallback);

 

추가로 서버에서 해당 델리게이트가 설정되기 전에 이미 타겟데이터가 완성이 될 수도 있다. 현재 델리게이트는 설정 될때만 해당하는 델리게이트라 추가로 이미 설정되어있을때도 함수를 실행시키기 위해 다른 델리게이트에도 바인딩해야한다.

 

시그니처는 동일하다.

CallReplicatedTargetDataDelegatesIfSet

 

위의 함수는 불리언 값을 반환한다. 설정이 되어있으면 알아서 브로드 캐스트를 한다.

 

반환값을 지역변수로 저장하자. 이 함수는 말했다싶이 타겟데이터가 완성이 되어있어야 true값을 반환하고 서버에서는 타겟데이터가 완성이 되어있어야 다음 작업을 진행할 수 있다.

 

지금까지의 구조이다.

FGameplayAbilitySpecHandle SpecHandle = GetAbilitySpecHandle();
FPredictionKey ActivationPredictionKey = GetActivationPredictionKey();
AbilitySystemComponent.Get()->AbilityTargetDataSetDelegate(SpecHandle, ActivationPredictionKey).AddUObject(this, &UTargetDataUnderMouse::OnTagetDataReplicateCallback);
const bool bCalledDelegate = AbilitySystemComponent.Get()->CallReplicatedTargetDataDelegatesIfSet(SpecHandle, ActivationPredictionKey);
if (bCalledDelegate)
{
    SetWaitingOnRemotePlayerData();
}

 

마지막 함수는 타겟데이터가 생성이 안되있으면 데이터가 생성될때까지 대기하는 함수이다.

 

이제 콜백함수에서 어떤 작업을 해야할지 알아보자.


2. 콜백함수 정의하기

 

아래 구문을 작성하자.

AbilitySystemComponent->ConsumeClientReplicatedTargetData(GetAbilitySpecHandle(), GetActivationPredictionKey());

 

해당 구문은 클라이언트에서 서버로 복제된 데이터를 소비하는 함수라고 한다. 정확한 기능은 타겟데이터에 캐시된 데이터를 초기화하는 기능을 가지고 있다.

 

서버에서 데이터를 받았으니 더 이상 클라이언트에서는 캐시된 데이터가 필요없고 이를 삭제하도록 하는 것이다.

 

이제 서버에서도 브로드캐스트한다.

 

if (ShouldBroadcastAbilityTaskDelegates())
{
    VaildData.Broadcast(DataHandle);
}

 

전체 함수구조는 아래와 같다.

 

void UTargetDataUnderMouse::OnTagetDataReplicateCallback(const FGameplayAbilityTargetDataHandle& DataHandle, FGameplayTag ActivationTag)
{
    AbilitySystemComponent->ConsumeClientReplicatedTargetData(GetAbilitySpecHandle(), GetActivationPredictionKey());

    if (ShouldBroadcastAbilityTaskDelegates())
    {
       VaildData.Broadcast(DataHandle);
    }
}

 

 

이제 에디터로 돌아가 노드들을 연결하자.

 

이런식으로 마우스 커서의 위치를 가져올 수 있다.