inflearn logo
강의

講義

知識共有

ゲインウのアンリアルプログラミング Part3 - ネットワークマルチプレイヤーフレームワークの理解

13講 キャラクター ムーブメントの拡張

CompressedFlags를 이용한 InputThrottle, InputSteering 전달 방법 질문

188

songjang339215

投稿した質問数 1

0

기본적으로 지원하는 단순 이동이 아니라 자동차처럼 Throttle와 Steering을 구현하려고 합니다.

알려주신 방법을 응용해 다음과 같이 구현했습니다.

 

USTRUCT(BlueprintType, Blueprintable)

struct FDriveInput

{

	GENERATED_BODY()

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)

	float Throttle = 0.0f;

	

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)

	float Steering = 0.0f;

	uint8 GetCompressedFlags() const

	{

		uint8 Compressed = 0;

		int32 ThrottleBits = FMath::Clamp(FMath::CeilToInt((Throttle + 1.0f) * 7.5f), 0, 15);

		int32 SteeringBits = FMath::Clamp(FMath::CeilToInt((Steering + 1.0f) * 7.5f), 0, 15);

		Compressed |= (ThrottleBits << 4);

		Compressed |= (SteeringBits & 0x0F);

		return Compressed;

	}

	void SetFromCompressedFlags(uint8 Flags)

	{

		int32 ThrottleBits = (Flags >> 4) & 0x0F;

		int32 SteeringBits = Flags & 0x0F;

		Throttle = (float(ThrottleBits) / 7.5f) - 1.0f;

		Steering = (float(SteeringBits) / 7.5f) - 1.0f;

	}
};

 

FNetworkPredictionData_Client_TitanCharacter::FNetworkPredictionData_Client_TitanCharacter(const UCharacterMovementComponent& ClientMovement)
	: Super(ClientMovement)
{

}

FSavedMovePtr FNetworkPredictionData_Client_TitanCharacter::AllocateNewMove()
{
	return FSavedMovePtr(new FSavedMove_TitanCharacter);
}

void FSavedMove_TitanCharacter::Clear()
{
	Super::Clear();
	DriveInput.Steering = 0.0f;
	DriveInput.Throttle = 0.0f;
}

void FSavedMove_TitanCharacter::SetInitialPosition(ACharacter* Character)
{
	Super::SetInitialPosition(Character);

	UTitanCharacterMovementComponent* Movement = Cast<UTitanCharacterMovementComponent>(Character->GetCharacterMovement());
	if (Movement)
	{
		DriveInput = Movement->DriveInput;
	}
}

uint8 FSavedMove_TitanCharacter::GetCompressedFlags() const
{
	uint8 Result = Super::GetCompressedFlags();
	Result |= DriveInput.GetCompressedFlags();
	return Result;
}

 

}

void UTitanCharacterMovementComponent::OnMovementUpdated(float DeltaSeconds, const FVector& OldLocation, const FVector& OldVelocity)
{
	UpdateWithDriveState(DeltaSeconds, DriveFlow.DriveState);
}

void UTitanCharacterMovementComponent::UpdateFromCompressedFlags(uint8 Flags)
{
	Super::UpdateFromCompressedFlags(Flags);
	DriveInput.SetFromCompressedFlags(Flags);
}

 

UpdateWithDriveState 는 실제 캐릭터가 InputThrottle와 InputSteering을 가지고 움직이는 부분입니다.
이렇게 하니까 다른 플래그와 겹쳐 아무런 입력을 하지 않았는데 점프를 한다거나, 손실압축의 특성때문에 입력을 하지 않아도 0이 아닌 다른 값이 전달되는 문제가 있었습니다.

관련해서 도움을 받고 싶습니다. VehicleMovementComponent도 알아봤는데, CharacterMovementComponent를 확장해서 만들 수 있는 방법은 없는건가요?
제가 찾아보면 좋을 법한 키워드 또는 해결방법을 알고 싶습니다.

unreal-engine 네트워크 언리얼-c++

回答 1

0

ideugu

안녕하세요.
보내주신 코드의 일부만으로는 제가 정확히 도움드리기는 힘들 것 같습니다. 다만 캐릭터 무브먼트 컴포넌트 자체가 자동차와는 무관하게 설계된 것이라 이를 확장하는 것은 별로 추천드리고 싶지 않네요.
ChaosVehicleMovementComponent가 플러그인으로 분리되어 있고 네트웍 동기화를 지원하다보니, 이를 분석하는 것이 장기적으로는 구현하고자 것에 도움이 될 것으로 보여집니다.

5.6버전 Networking Insights 실행안됨 문제에 관하여

0

24

1

8강 중간, 분수대의 SetOwner 에 대해 궁금합니다.

0

73

2

플레이어(Actor) 로 (리슨)서버에서 생성 되나요?

0

96

2

2강) HandleBeginPlay 의 역활이 궁금합니다.

-1

70

2

3강 중간, 모드 로그로 찍을 시 스탠드얼론이 안찍힙니다.

1

73

2

CompressedFlag 질문

0

55

2

10강까지 머리 위 체력바가 표시가 안됩니다.

0

105

3

10강까지 머리 위 체력바가 표시가 안됩니다.

0

93

2

16:44 부분에서 질문이 있습니다.

0

100

2

12:50 NetMulticast RPC 커넥션 관려하여 질문이 있습니다.

0

116

2

github 3-5 파트 프로젝트에서 컴파일 에러가 발생합니다.

0

112

3

언리얼 인사이트 5.6버전 networking insights 가 뜨지 않습니다.

0

163

3

Insight 사용이 안되어서 문의 드립니다!

0

126

2

하위 레벨...?? High Level 말씀하신거죠..??

0

143

1

조건식 프로퍼티 리플리케이션 질문

0

141

2

ArenaBattle에 Log추가하는 곳에 에러가 나타나 질문 드립니다.

0

158

2

7강에서 DORM_Initial 안됨

0

126

3

안녕하세요 강의 내용 정리에 관련해서 질문있어요

0

128

2

캐릭터 클래스의 mesh 관련

0

129

2

3파트 6강 분수대 로테이트에 문제가 생겼습니다.

0

127

3

클라이언트의 오너십 설정에 대해서 궁금합니다.

0

197

3

프로퍼티 리플리케이트 동기화 보장 개념.

0

220

2

결국엔 액터 기본함수들은 어디든 똑같이 일단 실행되는건가요?

0

86

2

3분 39초 경에 질문이 있습니다

0

73

2