💭회고
드론 플레이어의 디테일 구현(히트 디스토션, 애니메이션, 부스터) 에 대해 학습했다.특히 프로펠러 없이 드론의 비행을 시각적으로 표현하는 방법, 애니메이션 연동, 부스터 효과 구현에 집중했다.
아직 부족하지만 이 학습을 통해 언리얼 엔진에서 비행 메카닉을 실감 나게 구현하는 방법을 익힐 수 있었다.또한, 시각적 효과를 강화하여 플레이어 경험을 향상하는 방법을 고민해볼 기회였다.
🗺️마인드맵
📒학습 내용
🔥 이전 작업 내용 : https://raindrovvv.tistory.com/15
1. 플레이어 컨트롤러에서 입력 설정
✅입력 매핑 컨텍스트(IMC) 활성화
✅IMC, IA 생성 및 설정
2. 폰 클래스로 드론 기본 토대 만들기!
✅기본 이동(IA_Move, IA_Look)
✅상승 이동(IA_MoveUp)
✅(마우스 움직임에 따른)Roll 회전 기능
✅비행 유지(호버링) 기능
3. 중력 및 틸트 효과
✅중력 적용
✅기울기(틸트) 효과
{TIL_250205} 폰 클래스로 드론 구현하기 (Drone Player)
💭회고나는 블로그에 학습 내용을 정리할 때, 핵심 개념을 먼저 이해하고, 코드와 함께 기능을 단계적으로 정리한다. 그래야 뭔가 더 머리에 잘 들어오는 것 같다. 오늘은 Pawn 클래스를 활용한
raindrovvv.tistory.com
지금까지 드론의 기본적인 구조를 구축하였다. 앞으로 구현하고 싶은 내용은 다음과 같다.
1. 프로펠러 디테일 구현
- 드론의 입력 값에 따라 병합된 프로펠러를 분리하여 회전하도록 설정한다.
- 그러나 현재 사용 중인 스켈레탈 메시에는 프로펠러가 포함되어 있지 않다는 문제가 있다(방금 알았다ㅋㅋ;;)
- 직접 프로펠러를 제작하여 장착할 수도 있지만, 이는 작업량이 많아 번거로울 수 있다.
- 그렇다면 프로펠러 없이도 드론이 비행하고 있음을 시각적으로 표현하는 방법을 고민해보자.
- 뜨거운 엔진 주변의 공기가 일그러지는 히트 디스토션(Heat Distortion) 효과를 활용하면 어떨까?
- 이 효과를 적용하면 프로펠러 없이도 드론의 비행을 생동감 있게 표현할 수 있을 것이다.
- 추가로 드론의 아랫부분에 먼지나 연기의 Particle Effect 를 더해 비행의 역동성을 높일 수 있다 ✨
2. 키 입력에 따른 애니메이션 연동
- 특정 키를 누를 때 드론이 해당 방향으로 기울어지는 애니메이션을 추가한다.
- 이를 통해 조작의 직관성을 높이고, 사용자에게 실감 나는 비행 경험을 제공할 수 있다.
3. 부스터 효과 구현
- 왼쪽 쉬프트 키를 누르면 달리는 캐릭터처럼 드론이 가속하도록 구현한다.
- 부스터 활성화 시 드론의 속도가 증가하고, 이에 맞는 시각적 효과를 추가한다.
- 예를 들어, 드론 후방에 빛나는 트레일 효과(Trail Effect) 를 적용하거나 부스터 음향을 추가하여 몰입감을 높일 수 있다.
앞으로 이러한 기능들을 구현함으로써 드론의 조작감과 시각적 완성도를 향상시킬 계획이다. 추가적으로, 환경과 상호 작용하는 요소들을 더해 드론 비행의 현실감을 더욱 높여보는 것도 좋은 아이디어일 것이다.
1️⃣ 프로펠러 디테일 구현 (히트 디스토션)
✅ 프로펠러 없이 비행을 표현하는 방법
- 현재 사용 중인 스켈레탈 메쉬에는 프로펠러가 포함되지 않음 → 직접 제작하면 작업량이 많음.
- 대안으로 히트 디스토션(Heat Distortion) 효과를 활용하여 드론 엔진의 열기가 공기를 휘저으며 비행하는 듯한 효과를 구현하기로 결정.
✅ 히트 디스토션 구현 과정
1. Unreal5 Niagra VFX: Distortion Waves EFFECT
이미지 파일을 제대로 찾지 못해 외곽의 네모 모양까지 나타나는 문제가 발생하였다. 원하는 효과를 얻기에는 한계가 있었다.
2. Realistic Heat Distortion in Unreal Engine 5
나이아가라 시스템을 이용하여 원하는 히트 디스토션 효과를 만들 수 있었다. 구현 결과는 만족스러웠다.
3. Heat Distortion Effect in UE4 - Unreal Engine 4 Quick Tutorials
가장 빠르게 적용할 수 있는 방법이었다. 스타터 팩에 포함된 불 이펙트를 수정하여 이펙트 안의 디스토션 효과만 사용하면 되었다. 표현도 꽤 괜찮게 나왔다.
2️⃣ 키 입력에 따른 애니메이션 연동
✅ 구현 목표
- 드론이 특정 키 입력에 따라 기울어지는 애니메이션을 추가하여 조작의 직관성을 향상.
- 좌우 이동(D/A 키) 시 드론이 자연스럽게 기울어지는 효과를 애니메이션 블루프린트를 활용해 구현.
✅ 구현 과정
1) 블루프린트 입력 연동
- D 키 입력 시 MoveRight 값이 +1, A 키 입력 시 -1 값을 출력하도록 설정.
- 이를 통해 애니메이션 블루프린트(ABP)에서 상태를 전환할 수 있도록 데이터 연동.
void ASP_Pawn::MoveRight(const FInputActionValue& Value)
{
float AxisValue = Value.Get<float>();
MoveRightValue = AxisValue;
Move(GetActorRightVector(), Value.Get<float>());
}
📌 좌우 이동 시 값이 설정되며, 애니메이션 블루프린트에서 이를 활용하여 상태 변경!
2) 애니메이션 상태 머신(State Machine) 설정
- Idle → Turn_Left / Turn_Right 상태 전환
- MoveRight 값에 따라 IsLeft, IsRight 변수를 설정하여 애니메이션 전환
3️⃣ 부스터 효과 구현
- 왼쪽 쉬프트 키를 누르면 드론이 가속되도록 설정.
- 부스터 활성화 시 속도 증가 및 시각적/음향 효과 추가.
- 부스터 효과 종료 시 원래 상태로 복귀.
✅ 구현 과정
1) 입력 처리(SprintAction(BoosterAction) 입력 바인딩 추가)
- `EnhancedInput` 액션 추가:
- 이름: `IA_Booster`.
- 타입: `Bool` 또는 `Axis1D (float)` (사용자의 의도에 따라).
- 키: `LeftShift` - `ASP_Pawn` 클래스에 부스터 관련 변수 추가:
private:
bool bIsBoosting = false; // 부스터 상태 여부
float BoostSpeed = 2000.0f; // 부스터 활성화 속도
- ActivateBooster(), DeactivateBooster() 함수를 생성하여 부스터 상태를 관리.
2) 부스터 동작 구현
입력 처리 : `SetupPlayerInputComponent`에 부스터 액션 바인딩
if (PlayerController->SprintAction)
{
EnhancedInput->BindAction(PlayerController->SprintAction, ETriggerEvent::Started, this, &ASP_Pawn::ActivateBooster);
EnhancedInput->BindAction(PlayerController->SprintAction, ETriggerEvent::Completed, this, &ASP_Pawn::DeactivateBooster);
}
부스터 활성화 및 비활성화 함수
void ASP_Pawn::ActivateBooster(const FInputActionValue& Value)
{
bIsBoosting = true;
}
void ASP_Pawn::DeactivateBooster(const FInputActionValue& Value)
{
bIsBoosting = false;
}
3) 이동 함수 수정
- 부스터가 활성화되면 이동 속도를 증가시킴.
void ASP_Pawn::Move(const FVector& Direction, float AxisValue)
{
if (FMath::IsNearlyZero(AxisValue))
{ Velocity = FMath::VInterpTo(Velocity, FVector::ZeroVector, GetWorld()->GetDeltaSeconds(), 2.0f);
return;
}
float CurrentSpeed = bIsBoosting ? BoostSpeed : MoveSpeed;
float SpeedMultiplier = (bIsGrounded && !bIsFlightHold) ? 1.0f : AirControlFactor;
FVector TargetVelocity = Direction * (AxisValue * CurrentSpeed * SpeedMultiplier);
// 부드러운 속도 보간
Velocity = FMath::VInterpTo(Velocity, TargetVelocity, GetWorld()->GetDeltaSeconds(), 6.0f);
}
4) 부스터 효과 추가
1. 파티클 컴포넌트 추가 : 드론의 `Mesh` 또는 충돌체에 파티클을 부착
- '스타터팩 - 스파크 파티클'을 활용하여 드론 부스트 효과 연출
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Effects")
class UParticleSystemComponent* BoosterEffect;
2. 사운드 컴포넌트 추가
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Effects")
class UAudioComponent* BoosterSound;
3. 파티클 & 사운드 활성화 : 키를 누르고 있을 때마다 활성화 되어야 하므로 tick 함수에 코딩
void ASP_Pawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
ApplyGravity(DeltaTime);
CheckGround();
ApplyTiltEffect(DeltaTime);
// 부스터 상태에 따른 파티클 효과 업데이트
if (bIsBoosting)
{
if(BoosterEffect && !BoosterEffect->IsActive()){
BoosterEffect->Activate();
}
if(BoosterSound && !BoosterSound->IsPlaying()){
BoosterSound->Play();
}
}
else
{
if (BoosterEffect && BoosterEffect->IsActive()){
BoosterEffect->Deactivate();
}
if (BoosterSound && BoosterSound->IsPlaying()){
BoosterSound->Stop();
}
}
}