본문 바로가기

게임프로그래밍/실습2

[실습2] 45. 마우스 커서 데이터 서버로 보내기

1. 마우스 커서 데이터 서버로 보내기

 

클라이언트에서 현재 마우스 커서의 위치를 서버로 보내는 법을 알아보자.

 

클라이언트일 경우 실행할 함수를 만들자.

 

void SendMounseCursorData();

 

엑티베이트 함수에서 현재 로컬(클라이언트)인지 확인해서 이 함수를 실행한다.

void UTargetDataUnderMouse::Activate()
{
    const bool bIsLocallyControlled = Ability->GetCurrentActorInfo()->IsLocallyControlled();
    if (bIsLocallyControlled)
    {
       SendMounseCursorData();
    }
    else
    {
       // 서버에 있을 때, 타겟 데이터를 수신해야한다.
    }

 

타겟 데이터란 말 그대로 타겟의 데이터를 가지고 있는 구조체를 말한다.

 

void UTargetDataUnderMouse::SendMounseCursorData()
{
    APlayerController* PC = Ability->GetCurrentActorInfo()->PlayerController.Get();
    FHitResult CursorHit;
    PC->GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);

    FGameplayAbilityTargetDataHandle DataHandle;
    FGameplayAbilityTargetData_SingleTargetHit* Data = new FGameplayAbilityTargetData_SingleTargetHit();
    Data->HitResult = CursorHit;
    DataHandle.Add(Data);

 

클라이언트에서 커서 데이터를 얻고 이를 타겟 데이터에 저장한 뒤 핸들로 패키징을 하고 서버로 데이터를 전송하면 된다.

 

그 방법을 알아보자.

 

기본적으로 아래 함수를 사용할 것이다.

ServerSetReplicatedTargetData
AbilitySystemComponent->ServerSetReplicatedTargetData(
    GetAbilitySpecHandle(),
    GetActivationPredictionKey(),
    DataHandle,
    FGameplayTag(),
    AbilitySystemComponent->ScopedPredictionKey
);

 

각각의 매개변수들을 채웠다.

 

이제 데이터를 서버로 보냈고 추가로 브로드캐스트 해서 처리하면 된다.

 

브로드 캐스트할때 데이터 핸들 자체를 보내도록 하자.

 

델리게이트 선언을 바꾸었다.

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMouseTargetDataSignature, const FGameplayAbilityTargetDataHandle&, DataHandle);

 

이제 함수를 완성시키자.

void UTargetDataUnderMouse::SendMounseCursorData()
{
    FScopedPredictionWindow ScopedPrediction(AbilitySystemComponent.Get());
    
    APlayerController* PC = Ability->GetCurrentActorInfo()->PlayerController.Get();
    FHitResult CursorHit;
    PC->GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);

    FGameplayAbilityTargetDataHandle DataHandle;
    FGameplayAbilityTargetData_SingleTargetHit* Data = new FGameplayAbilityTargetData_SingleTargetHit();
    Data->HitResult = CursorHit;
    DataHandle.Add(Data);


    AbilitySystemComponent->ServerSetReplicatedTargetData(
       GetAbilitySpecHandle(),
       GetActivationPredictionKey(),
       DataHandle,
       FGameplayTag(),
       AbilitySystemComponent->ScopedPredictionKey
    );

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

 

FScopedPredictionWindow

 

위의 구조체는 스코프 범위 내에서 예측 윈도우를 설정하는 구조체이다.

 

서버로 데이터를 보내는 데는 이렇게 하면 될 것이다. 서버에서 데이터를 받을 수 있어야 할 것이다. 그리고 예측키와 관련된 부분도 서버에서 처리해야 할 것이다.

 

다음에는 서버에서 이 데이터를 받는 방법을 알아보자.