하아찡

[언리얼5] 서버 캐릭터 움직임 처리 - 2 본문

C++/이것저것서버테스트

[언리얼5] 서버 캐릭터 움직임 처리 - 2

하아찡 2025. 2. 18. 17:19

언리얼 버전 5.5.3

서버언어 C++로 구성했습니다.

 

이전에 적어둔 문제점과 추가해야될점

문제점

1. 액터를 위치값을 건들다보니 애니메이션이 작동하지않음. -> 걷는 모션이 작동하지않음. 다른방법으로 수정해야함.

2. 움직일때 마다 서버에 움직임 데이터를 보내다보니 너무 많은 데이터가 들어감. 약간의 보정처리를 해줘야할듯.

 

추가해야될점.

1. 점프 처리를 아직하지않음. 구성은 어떻게 해야할지 고민중. 일단 생각한건 점프패킷을 하나 만들어서 점프할때 패킷을 보내도록 추가할듯함.

2. 시선처리 -> 이것도 과도하게 데이터를 보낼거같으니 움직임 보정처리할때 비슷하게 처리하면 될듯함.

 


문제점 - 1

원인

기존 코드에서 SetActorLocation() 함수를 사용해서 캐릭터를 움직이게 처리를해둠.

 

해결

해당 코드를 아래 코드로 변경함.

AddMovementInput(GetActorForwardVector());

 

 

문제점 - 2

원인

움직일때마다 서버에게 패킷을 전송함.

 

해결

일정 시간 딜레이를 줌.

 

추가된 문제

일정시간 딜레이를 주다보니 캐릭터 위치가 오차범위가 크게 발생함.

너무 크게 오차가 생길경우 캐릭터를 강제로 이동시킴. 너무 크지않다면 해당 캐릭터가 서버측에 움직이지 않을때 보정 처리를 해줌.

 

추가해야될점은 Tick함수에 추가가 됐음.

점프 패킷을 받을경우 점프를 시킴.

 

시선처리는 SetActorRotation(); 를 사용해서 처리함. Yaw값은 서버를 통해서 받아온 값으로 넣어줌

SetActorRotation(FRotator(0, DestInfo->yaw(), 0));
void AlllllllllqqqCharacter::Tick(float DeltaSeconds)
{
	Super::Tick(DeltaSeconds);


	{
		FVector Location = GetActorLocation();
		MyPlayerInfo->set_x(Location.X);
		MyPlayerInfo->set_y(Location.Y);
		MyPlayerInfo->set_z(Location.Z);
		MyPlayerInfo->set_yaw(GetControlRotation().Yaw);
	}

	if (IsMyPlayer() == false)
	{
		const Protocol::MoveState State = MyPlayerInfo->movestate();
	
		if (State == Protocol::MOVE_STATE_RUN)
		{
			FVector TargetLocation(DestInfo->x(), DestInfo->y(), DestInfo->z());
			FVector CurrentLocation = GetActorLocation();
			float Distance = FVector::Dist2D(CurrentLocation, TargetLocation);

			bIsMoving = false;
			SetActorRotation(FRotator(0, DestInfo->yaw(), 0));
			AddMovementInput(GetActorForwardVector());
			if (Distance > MarginRange) {
				//거리차이가 심해졌을경우 위치 강제이동
				SetActorLocation(TargetLocation);
			}
			PreYaw = DestInfo->yaw();

		}
		else if (State == Protocol::MOVE_STATE_IDLE) {
			MoveToServerLocation();
		}
		else if(State == Protocol::MOVE_STATE_JUMP)
		{
			Jump();
		}


		if (bIsMoving)
		{
        	// IDLE 상태일때 캐릭터의 위치를 보정시켜줌
			FVector TargetLocation(DestInfo->x(), DestInfo->y(), DestInfo->z());
			FVector CurrentLocation = GetActorLocation();
			FVector Direction = (TargetLocation - CurrentLocation).GetSafeNormal2D();
			float Distance = FVector::Dist2D(CurrentLocation, TargetLocation);
			if (Distance > MarginRange) {
				//거리차이가 심해졌을경우 위치 강제이동
				SetActorLocation(TargetLocation);
			}
			SetActorRotation(FRotator(0, PreYaw, 0));
			AddMovementInput(Direction, 1.0f); // 목표 방향으로 이동
		}
	}
}

 


 

결과물

 

 

강제이동 범위가 작아서 강제이동 값을 늘려줘야 겠습니다....

반응형

'C++ > 이것저것서버테스트' 카테고리의 다른 글

[언리얼5, C++] 맵 이동 - 2  (0) 2025.02.25
[언리얼5, C++] 맵 이동  (0) 2025.02.23
[C++서버] 서버 채널 분할  (0) 2025.02.21
[언리얼5] 채팅  (0) 2025.02.20
[언리얼5] 서버 캐릭터 움직임 처리  (0) 2025.02.16