IT/UE5

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

u149_cinderella 2025. 3. 21. 18:23

일단 기존에 만들어 두었던 enum class를 사용해서 상태관리를 하는중이었는데 이걸 만들면서 스턴상태도 생각해서 미리 넣어뒀었다.

그래서 발판을 밟는 경우 Stun상태(키입력이 먹히지 않음)로 만들어주고 jump나 move는 캐릭터가 stun상태일때 사용할 수 없게하면 간단하게 스턴은 구현가능하다.

 

다만 일정시간동안 스턴 되어야한다는 점이 관건인데

 

void ATrap::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if (GEngine)
	{
		GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Blue, TEXT("OverlapBegin"));
	}
	ARunner* OtherCharacter = Cast<ARunner>(OtherActor);
	if (OtherCharacter)
	{
		// 두 액터(이 경우, 본인과 겹친 캐릭터) 사이의 방향을 계산하고, 위쪽 성분 추가
		FVector LaunchDirection = OtherCharacter->GetActorLocation() - GetActorLocation();
		LaunchDirection.Z = ZSize; // 약간 위로 튕기게 함

		LaunchDirection.X = LaunchDirection.X > 0 ? XYSize : -XYSize;
		LaunchDirection.Y = LaunchDirection.Y > 0 ? XYSize : -XYSize;

		LaunchDirection.Normalize();
		
		OtherCharacter->ChangeRunnerState(ECharacterState::ECS_Stun);//스턴상태넣어줌
		OtherCharacter->LaunchCharacter(LaunchDirection * LaunchStrength, true, true);// 캐릭터에 튕김을 적용

		FTimerHandle TimerHandle;
		FTimerDelegate TimerDelegate;
		TimerDelegate.BindUFunction(OtherCharacter, FName("ChangeRunnerState"), ECharacterState::ECS_Idle);
		GetWorld()->GetTimerManager().SetTimer(TimerHandle, TimerDelegate, StunTime, false);
		
	}
}

beginoverlap에서 타이머를 바인딩 해서 해결했다.

(StunTime은 UPROPERTY로 선언한 변수다 3.f가 기본값이다.)

 

trap액터 자체는 바꿀게 별로 없었지만 Runner를 스턴일때 움직이지 못하게 수정하는게 더 중요하다.

 

 

결과

 

3초는 좀 많이 긴거같기도하다.

 

다음 포스팅은 스턴상태에서 좌우입력을 하면 스턴이 조금 짧아지게 만들어보자

(좌우 연타시 연타횟수만큼 스턴시간이 짧아짐)