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초는 좀 많이 긴거같기도하다.
다음 포스팅은 스턴상태에서 좌우입력을 하면 스턴이 조금 짧아지게 만들어보자
(좌우 연타시 연타횟수만큼 스턴시간이 짧아짐)