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
위의 구조체는 스코프 범위 내에서 예측 윈도우를 설정하는 구조체이다.
서버로 데이터를 보내는 데는 이렇게 하면 될 것이다. 서버에서 데이터를 받을 수 있어야 할 것이다. 그리고 예측키와 관련된 부분도 서버에서 처리해야 할 것이다.
다음에는 서버에서 이 데이터를 받는 방법을 알아보자.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 47. 발사체에 대미지 부여 효과를 주는 게임플레이 이펙트 적용하기 (0) | 2024.12.04 |
---|---|
[실습2] 46. 서버에서 타겟 데이터 수신하기 (0) | 2024.12.04 |
[실습2] 44. 어빌리티 태스크 (0) | 2024.12.04 |
[실습2] 43. 발사체 생성 능력 만들기 (0) | 2024.12.03 |
[실습2] 42. 마우스 클릭으로 움직이게 하기 (0) | 2024.12.03 |