스피드 부스트 아이템을 사용한 후 슬라이딩이나 수영을 하면 부스트 효과가 사라지고 기본 속도로 되돌아가는 문제가 발생했다.
OnRepIsSliding() 함수에서 슬라이딩 종료 시 MaxWalkSpeed 를 하드코딩된 기본값(400)으로 강제 설정
수영 모드에서 걷기 모드로 전환될 때도 유사한 문제 발생
CharacterMovementComponent 가 Movement Mode 변경 시 속도를 초기화하는 것이 원인
// 새로운 함수들 추가 (public 섹션)
UFUNCTION(BlueprintPure, Category = "Speed Boost")
bool IsEffectActive() const;
UFUNCTION(BlueprintPure, Category = "Speed Boost")
float GetCurrentSpeedMultiplier() const;
void ReapplyCurrentSpeed(); // 속도 재적용 메서드
void ADCCharacter::OnRepIsSliding()
{
if (bIsSliding) {
GetCharacterMovement()->MaxWalkSpeed = SlideSpeed; // 300
} else {
// 스피드 부스트 확인 후 적절한 속도 복원
if (USpeedBoostEffectComponent* SpeedComp = FindComponentByClass<USpeedBoostEffectComponent>()) {
if (SpeedComp->IsEffectActive()) {
SpeedComp->ReapplyCurrentSpeed();
} else {
GetCharacterMovement()->MaxWalkSpeed = WalkSpeed; // 400
}
} else {
GetCharacterMovement()->MaxWalkSpeed = WalkSpeed; // 400
}
}
}
// DCCharacter.h (protected 섹션)
virtual void OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode) override;
// DCCharacter.cpp
void ADCCharacter::OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode)
{
Super::OnMovementModeChanged(PrevMovementMode, PreviousCustomMode);
// 수영→걷기 전환 시 스피드 부스트 재적용
if (GetCharacterMovement()->MovementMode == MOVE_Walking && PrevMovementMode == MOVE_Swimming) {
if (USpeedBoostEffectComponent* SpeedComp = FindComponentByClass<USpeedBoostEffectComponent>()) {
if (SpeedComp->IsEffectActive()) {
SpeedComp->ReapplyCurrentSpeed();
}
}
}
}
MovementModeChangedDelegate 는 존재하지 않음OnMovementModeChanged 가상함수 오버라이드가 올바른 방법if (USpeedBoostEffectComponent* SpeedComp = FindComponentByClass<USpeedBoostEffectComponent>()) {
if (SpeedComp->IsEffectActive()) {
// 활성 상태일 때 처리
}
}
MulticastSetCharacterSpeed 를 통한 모든 클라이언트 동기화HasAuthority()) 필수