UE5 Issues : 이모저모

2025. 2. 13. 22:56·Unreal Engine

1. Lerp


Lerp는 이론적으로는 A와 B 값 사이의 값을 (Alpha를 통해) 구해주는 의미이다.

  •  A(0)와 B(100) 사이의 값을 Alpha(0.3)을 통한 결과는 30 이다.
    • float Res = FMath::Lerp(A, B, Alpha); 
    • Res = 30.f;
  • 이 함수를 응용해 보자면, A에서 B로 움직일 때 자연스러운(부드러운) 움직임을 구현할 수 있다.
void ALerpActor::Lerping()
{
	if (GetActorLocation().Z <= Destination.Z)
	{
		FVector Res = FMath::Lerp(Origin, Destination, GetWorld()->GetDeltaSeconds());
		SetActorLocation(Res);
		Origin = Res;
	}	
}

 

 

2. Sin


캐릭터가 아이템에 닿으면, 해당 아이템이 흔들리는 효과를 주고 싶어서 FMath::Sin 함수를 접하게 되었다.

  • 라디안 단위의 값(Value)을 통해 Sin 값을 리턴해주는 함수이다.
  • float FMath::Sin(float Value);

실제 게임에서는 아래와 같이 함수를 구성해 보았다.

  • Amplitude는 움직일 진폭을 나타내고, Frequency는 주기를 뜻한다.
  • TimeElapsed는 Tick에서 계속 DeltaTime을 곱해준 값이다.
void ASinActor::SinMovement()
{
	float Amplitude = 200.f;
	float Frequency = 2.f;

	float Offset = Amplitude * FMath::Sin(TimeElapsed * Frequency);
	FVector NewLocation = Origin + FVector(0, 0, Offset);
	SetActorLocation(NewLocation);
}

 

 

3. Launch Character


캐릭터가 아이템에 닿으면, 캐릭터를 뒤로 날려주기 위해서 해당 함수를 사용하게 되었다.

  • LaunchVelocity : 캐릭터에게 적용할 속도
  • bXYOverride : true로 지정한 경우 캐릭터의 XY속도에 더하지 않고, 대체
  • bZOverride :  true로 지정한 경우 캐릭터의 Z 속도에 더하지 않고, 대체
UFUNCTION (BlueprintCallable, Category=Character)  
virtual void LaunchCharacter  
(  
    FVector LaunchVelocity,  
    bool bXYOverride,  
    bool bZOverride  
)
  • LaunchCharacter 함수의 내부 모습은 아래와 같다. 
    • bool변수가 false인 경우는 현재 캐릭터의 Velocity를 LaunchVelocity값에 더한 후 Launch 함수를 Call해주었다.
    • 실제로 바꿔서 실행해 보았지만, 차이점을 잘 느끼지 못했다.
void ACharacter::LaunchCharacter(FVector LaunchVelocity, bool bXYOverride, bool bZOverride)
{
	UE_LOG(LogCharacter, Verbose, TEXT("ACharacter::LaunchCharacter '%s' (%f,%f,%f)"), *GetName(), LaunchVelocity.X, LaunchVelocity.Y, LaunchVelocity.Z);

	if (CharacterMovement)
	{
		FVector FinalVel = LaunchVelocity;
		const FVector Velocity = GetVelocity();

		if (!bXYOverride)
		{
			FinalVel.X += Velocity.X;
			FinalVel.Y += Velocity.Y;
		}
		if (!bZOverride)
		{
			FinalVel.Z += Velocity.Z;
		}

		CharacterMovement->Launch(FinalVel);

		OnLaunched(LaunchVelocity, bXYOverride, bZOverride);
	}
}

 

 

4. GameInstance 세팅


GameInstance 클래스를 만들고, 코드에서 GameInstance를 통해 함수를 call했는데 동작을 하지 않아서 정리한 이슈이다.

  • 매우 간단한 사실이지만, 프로젝트 세팅-> 맵 모드 -> GameInstance 에서 게임 인스턴스 클래스를 지정해 주어야 한다.

 

 

5. 타이머 로직


캐릭터가 아이템을 먹으면, 캐릭터의 입력이 반대로 되는 효과를 받게 되는데 특정 시간 이후 다시 원래대로 돌아오는 로직을 구현하면서 겪었던 생각에 대한 내용이다.

  • 처음 생각한 로직
    • 캐릭터가 bool 변수(아래 코드에서 TestBool)를 가지고 있어서, bool이 true인 경우 특정 효과를 실행
    • 아이템을 먹은 경우 아이템 클래스에서 Character의 bool변수를 바꿔준 후
    • SetTimer를 통해 몇 초 뒤에 Character의 bool 변수를 바꿔주는 함수를 실행
  • 그러나 이렇게 사용하면, Restore함수가 실행되지 않는다. (DestroyItem이 Timer 전에 call 되버려서 실행이 되지 않는 것 같았다.)
void ABadItem::ActivateItem(AActor* Activator)
{
	Super::ActivateItem(Activator);

	if (Activator && Activator->ActorHasTag("Player"))
	{
		APlayerCharacter* PlayerCharacter = Cast<APlayerCharacter>(Activator);
		if (PlayerCharacter)
		{
			PlayerCharacter->TestBool = true;

			GetWorldTimerManager().SetTimer
			(
				timer
				, this,
				&ABadItem::Restore
				, 3.f
				, false
			);
		}
	}

	DestroyItem();
}
  • 개선된 로직
    • 캐릭터가 bool변수를 가지고 있고, bool 이 true인 경우 특정 효과를 실행하는 것은 동일
    • 아이템을 먹은 경우 PlayerCharacter가 ReverseMove라는 함수를 call 한 다음
    • 나머지 로직을 모두 PlayerCharacter에서 수행한다.
      • ReverseMove함수에서 bool 변수 true로 변경 후 Timer 실행
      • Timer를 통해서 PlayerCharacter의 함수인 Restore 함수를 실행
      • Restore함수에서 bool 변수를 다시 false로 변경
    •  이 방식을 선택하게 된 이유는 아이템을 먹은 이후의 동작이 Character에서 이루어지기 때문이다. (UI 등의 동작)
//BadItem.cpp의 수정된 로직
if (PlayerCharacter)
{
	PlayerCharacter->ReverseMove();
}

//PlayerChacater.cpp의 로직
void APlayerCharacter::ReverseMove()
{
	bIsReverseMove = true;
    
	GetWorldTimerManager().SetTimer
	(
		ReverseMoveTimerHandle
		,this
		,&APlayerCharacter::RestoreMove
		,ReverseMoveDelayTime
		,false
	);
}

void APlayerCharacter::RestoreMove()
{
	bIsReverseMove = false;
}

 

'Unreal Engine' 카테고리의 다른 글

UE5 Issues : Enhanced Input (Triggered & Started)  (0) 2025.02.23
UE5 Issues : 애니메이션 (Motion Matching, Blend Pose)  (0) 2025.02.21
Unreal Engine - 3D UI  (0) 2025.02.13
Unreal Engine - UI Animation  (0) 2025.02.13
Unreal Engine - Main Menu UI (Start, Restart)  (0) 2025.02.12
'Unreal Engine' 카테고리의 다른 글
  • UE5 Issues : Enhanced Input (Triggered & Started)
  • UE5 Issues : 애니메이션 (Motion Matching, Blend Pose)
  • Unreal Engine - 3D UI
  • Unreal Engine - UI Animation
gbleem
gbleem
gbleem 님의 블로그 입니다.
  • gbleem
    gbleem 님의 블로그
    gbleem
  • 전체
    오늘
    어제
    • 분류 전체보기 (177)
      • Unreal Engine (66)
      • C++ (19)
      • 알고리즘(코딩테스트) (27) N
      • TIL (60)
      • CS (4)
      • 툴 (1)
  • 블로그 메뉴

    • 홈
    • 카테고리
  • 링크

    • 과제용 깃허브
    • 깃허브
    • velog
  • 공지사항

  • 인기 글

  • 태그

    상속
    cin함수
    addonscreendebugmessage
    motion matching
    C++
    enhanced input system
    character animation
    applydamage
    additive animation
    Vector
    템플릿
    매크로 지정자
    blend pose
    map을 vector로 복사
    BFS
    gamestate
    DP
    const
    싱글턴
    actor 클래스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gbleem
UE5 Issues : 이모저모
상단으로

티스토리툴바