IT/UE5

[UE5] 스턴상태일때 좌우연타시 스턴시간 감소 구현 [튕겨나는 발판 - 3]

u149_cinderella 2025. 3. 21. 21:04

https://idol-kotori.tistory.com/189

 

[UE5] 함정을 밟으면 일정 시간동안 스턴상태 [튕겨나는 발판-2]

일단 기존에 만들어 두었던 enum class를 사용해서 상태관리를 하는중이었는데 이걸 만들면서 스턴상태도 생각해서 미리 넣어뒀었다.그래서 발판을 밟는 경우 Stun상태(키입력이 먹히지 않음)로 만

idol-kotori.tistory.com

지난 포스팅에서 스턴상태를 주는것까지 구현을 했다.

 

이번에는 좌우연타시 스턴시간을 줄여야한다.

 

이를 위해서는 기존처럼 overlap함수에서 바인딩하는게 아니라 캐릭터 자체에서 타이머를 바인딩하고

좌우 입력될때마다 타이머를 해제하고 남은 시간에서 조금 정도 줄여서 다시 타이머를 할당해주면 된다.

 

근데 가장 큰 문제는 내가 아직 Enhanced Input이 익숙하지 않다는거다...

일단 해보자 하다보면 익숙해지겠지

 

void ARunner::StunStart(float DeltaTime)
{
	GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ThisClass::EndStun, DeltaTime, false);
}

void ARunner::ReduceStun(float DeltaTime)
{
	float CurrentRemaining = GetWorld()->GetTimerManager().GetTimerRemaining(TimerHandle);

	// 만약 타이머가 이미 종료 중이라면 무시
	if (CurrentRemaining <= 0.f)
	{
		return;
	}

	// 감소량만큼 남은 시간을 줄입니다.
	float NewRemainingTime = FMath::Max(CurrentRemaining - DeltaTime, 0.0f);

	// 타이머를 재설정합니다.
	GetWorld()->GetTimerManager().ClearTimer(TimerHandle);

	if (NewRemainingTime > 0.f)
	{
		GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ARunner::EndStun, NewRemainingTime, false);
	}
	else
	{
		// 만약 남은 시간이 0이면 바로 스턴 해제
		EndStun();
	}
}

void ARunner::EndStun()
{
	ChangeRunnerState(ECharacterState::ECS_Idle);
}

일단 이렇게 만들어줬다.

TimerHandle은 FTimerHandle변수이다.

 

이러고 트랩에서 직접 스턴 타이머를 넣는게 아니라 stunstart를 호출하기만 하면 된다.

 

이제 문제는 스턴상태에서 좌우키를 클릭할때인데

 

엄청나게 많은 수정끝에 완성했다.

void ARunner::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent))
	{
		EnhancedInputComponent->BindAction(ReduceStunAction, ETriggerEvent::Started, this, &ThisClass::CallReduceStun, 0.1f);

	}

	Super::SetupPlayerInputComponent(PlayerInputComponent);
}

 

IA를 하나 만들었고 CallReduceStun을 바인딩해줬다.

ReduceStunAction IA는 물론 좌우방향만 입력을 받고(bool로)  Characterstate가 stun이라면 reducestun을 실행한다.

 

결과

(로그는 ReduceStun이 호출될때마다 찍힌다.)

 

 

enhanced input에 대한 이해도가 부족해서 구현하는데 너무 오래걸렸다. 그래도 감은 좀 온다.