[Unreal]#24_Deactivate와 DeactivateImmediate
Unreal 개발 중 Niagara Component 클래스의 Deactivate 관련 함수에 대해 알아보겠습니다.
Overview
- 개요
- 코드
- 정리
#0. 개요
1. 마법 발사체의 이펙트
- Proejctile 클래스를 상속하는 Projectile_Magic(마법 발사체) 유형의 객체는 기본적으로 세 가지 이펙트를 컴포넌트로 갖습니다-Muzzle Effect(발사 효과), Projectile Effect(발사체 효과), Hit Effect(충돌 효과).
- 이때, 각 이펙트는 Niagara Component 클래스를 상속하여 Niagara Component 클래스의 함수들을 활용하는데, 활성화 시점과 비 활성화 시점에 각각 Activate 함수와 Deactivate 함수를 호출합니다.
- 이펙트의 생명 주기가 끝나는 시점에 호출할 함수로 Deactivate 함수와 DeactivateImmediate 함수를 고려할 수 있습니다.
2. Deactivate
#include "Components/ActorComponent.h"
virtual void Deactivate()
Details
- UActorComponent 클래스에서 정의한 Deactivate 함수는 Scene Compnent를 비활성화시킵니다.
2. Deactivate
#include "Particles/ParticleSystemComponent.h"
virtual void DeactivateImmediate()
Details
- UFXSystemComponent 클래스에서 정의한 Deactivate 함수는 Component의 비활성화를 강제합니다.
3. Deactivate vs DeactivateImmediate
- 두 함수의 차이점은 강제성입니다.
- Deactivate 함수는 컴포넌트의 비 활성화를 자연스럽게 수행합니다. 컴포넌트는 생명 주기 동안에 수행해야 할 동작들을 모두 완료한 뒤에 비활성화됩니다. 따라서, Deactivate 함수는 컴포넌트가 본인이 수행해야할 동작들을 모두 완료한 뒤에 비활성화될 수 있도록 합니다.
- DeactivateImmediate 함수는 컴포넌트의 비 활성화를 호출 시점에 즉시 수행합니다. 이 함수를 호출하면 그 즉시 컴포넌트는 수행하던 동작들을 모두 중지하고 최종적으로 비활성화됩니다.
- 정리하자면, Deactivate는 Niagara Component가 모든 동작을 완료할 때까지 기다렸다가 비활성화시키는 반면에, DeactivateImmediate는 Niagara Component가 모든 동작을 완료할 때까지 기다리지 않고 호출 시점에 그 즉시 해당 컴포넌트를 비활성화시킵니다.
#1. 코드
1. 발사 함수
void AProjectile_Magic::StartLaunched()
{
Super::StartLaunched();
// #0. Projectile Movement
CheckTrue(ProjectileMovement == nullptr);
ProjectileMovement->SetVelocityInLocalSpace(FVector(-1.f, 0.f, 0.f) * ProjectileMovement->InitialSpeed);
// #1. Muzzle Timer On
if (!!MuzzleEffect && OffMuzzleEffectRate >= 0.f)
{
GetWorld()->GetTimerManager().SetTimer(OffMuzzleEffectHandler, FTimerDelegate::CreateLambda([&]() {
MuzzleEffect->DeactivateImmediate();
}), OffMuzzleEffectRate, false);
}
}
Details
- 마법 발사체 클래스의 StartLaunched 함수는 발사체의 발사 시점에 호출되는 함수로 Velocity 설정과 함께 Muzzle Effect의 비활성화를 구현합니다.
- Muzzle Effect는 Niagara Component로 활성화되었다가, 비활성화되는 동작을 반복적으로 수행합니다.
- 따라서, 해당 이펙트는 생명 주기를 Deactivate 혹은 Deactivate Immediate 함수를 통해 관리해주지 않으면, 발사체가 발사되어 한참을 날아가는 중에도 사라지지 않고 지속적으로 활성화&비활성화 동작을 수행합니다.
- 이때, Deactivate 함수 대신에 정확한 Niagara Component의 생명 주기를 정해 주어 DeactivateImmediate 함수를 호출해야 Niagara Component는 지속적으로 활성화 + 비활성화 동작을 반복 수행하지 않고, 한 번만 수행하고 비활성화되로록 구현할 수 있습니다.
2. 발사 완료 함수
void AProjectile_Magic::EndLaunched()
{
Super::EndLaunched();
// #1. Hit Timer On
if (!!HitEffect && OffHitEffectRate >= 0.f)
{
GetWorld()->GetTimerManager().SetTimer(OffHitEffectHandler, FTimerDelegate::CreateLambda([&]() {
HitEffect->DeactivateImmediate();
}), OffHitEffectRate, false);
}
}
Details
- 마법 발사체 클래스의 발사 완료 함수는 Timer를 통해 Hit Effect의 비활성화를 구현합니다.
- Hit Effect도 마찬가지로 DeactivateImmediate 함수를 호출하여, 생명 주기가 끝난 시점에 그 즉시 비활성화되로록 구현할 수 있습니다!
#2. 정리
- Deactivate 함수는 컴포넌트가 모든 동작을 수행하고 비활성화되도록 기다려 자연스러운 비활성화를 구현합니다.
- DeactivateImmediate 함수는 컴포넌트가 수행하던 모든 동작을 중지하고 비활성화 되도록 강제합니다.
'게임개발 > Unreal C++' 카테고리의 다른 글
[Unreal]#26_Game Ability System(GAS) (0) | 2024.02.23 |
---|---|
[Unreal]#25_Collision Data (1) | 2023.12.02 |
[Unreal]#23_FString, FText, FName 변환 (0) | 2023.02.05 |
[Unreal]#22_TTuple (0) | 2023.02.05 |
[Unreal]#21_Custom Delegate (0) | 2022.11.02 |