slomo 0 일 때도 나이아가라를 재생시킬 방법이 있나요?

안녕하세요?

<br/>

배경에 설치한 나이아가라 액터를 slomo 0 로 정지하였을 때도

나이아가라 액터가 계속 업데이트되어 재생되게 해주고 싶습니다.

방법이 있을까요?

[Attachment Removed]

재현 방법
배경에 나이아가라 액터 배치

게임 플레이

콘솔 명령어로 slomo 0 입력

나이아가라 정지되어 있는 모습

[Attachment Removed]

안녕하세요.

문의해주신 Slomo 값을 0으로 설정하여 게임을 정지한 상황에서도 나이아가라가 계속 업데이트되도록 구성하는 방법은, Slomo의 하한선이 실제로 0인지 여부에 따라 접근 방식이 달라집니다.

Slomo의 하한선은 World Setting에서 Min Global Time Dilation으로 설정하실 수 있습니다.

먼저, Slomo의 하한선이 0보다 큰 경우입니다.

이 경우에는 비교적 간단한 방식으로 해결하실 수 있습니다. Slomo 값이 0보다 크다면, 월드의 DeltaTime은 Slomo 비율에 따라 감소하게 됩니다. 따라서 줄어든 DeltaTime을 다시 보정해 주는 방식으로 나이아가라의 업데이트를 유지할 수 있습니다.

구체적으로는, 나이아가라 컴포넌트의 CustomTimeDilation 값을 Slomo 값의 역수로 설정해 주는 방법입니다. 예를 들어 Slomo가 0.5라면, CustomTimeDilation을 2로 설정하여 감소된 시간을 다시 보정해 주는 구조입니다.

이 방식은 Slomo로 인해 느려진 시간 흐름을 상쇄하여 결과적으로 나이아가라가 원래 속도로 동작하도록 만드는 원리입니다. 다만, 이 방법은 Slomo 값이 0보다 클 때에만 정상적으로 적용 가능하다는 점을 참고해 주시면 좋겠습니다.

다음으로, Slomo의 하한선이 정확히 0인 경우입니다.

이 경우에는 월드의 DeltaTime 자체가 0이 되므로, 앞서 설명드린 보정 방식은 사용할 수 없습니다. 따라서 월드 시간과는 별개로 나이아가라를 구동하는 방식이 필요합니다.

1. 먼저, 나이아가라 컴포넌트의 AgeUpdateMode를 DesiredAge 또는 DesiredAgeNoSeek로 변경한 뒤, 매 틱마다 실제 프레임 시간 값을 직접 누적하여 DesiredAge에 반영하는 방식입니다.

여기서 사용하는 시간 값은 월드의 타임 딜레이션에 영향을 받지 않는 실제 프레임 시간입니다. 이를 매 프레임 누적하여 설정해 주면, Slomo가 0이더라도 현실 시간의 흐름에 맞추어 나이아가라가 자연스럽게 업데이트되는 모습을 확인하실 수 있습니다.

2. 또 다른 방법으로는 나이아가라를 ForceSolo 상태로 설정한 뒤, 매 틱마다 실제 프레임 시간을 기준으로 직접 업데이트를 수행하는 방식이 있습니다. 이 경우 나이아가라를 월드 시간 흐름과 완전히 분리하여 동작시킬 수 있습니다. 다만, 업데이트를 수동으로 관리하게 되므로 구조 설계 시 주의가 필요합니다.

아래는 예시코드입니다.

.h
 
#pragma once
 
#include "CoreMinimal.h"
#include "NiagaraComponent.h"
#include "CustomNiagaraComponent.generated.h"
 
/**
 * 
 */
 
UCLASS(ClassGroup = (Rendering, Common), Blueprintable, hidecategories = Object, hidecategories = Physics, hidecategories = Collision, showcategories = Trigger, editinlinenew, meta = (BlueprintSpawnableComponent, DisplayName = "Custom Niagara Particle System Component"))
class UDN573_API UCustomNiagaraComponent : public UNiagaraComponent
{
	GENERATED_BODY()
 
protected:
 
	virtual void BeginPlay() override;
	virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
 
};
 
.cpp
 
#include "CustomNiagaraComponent.h"
 
void UCustomNiagaraComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
	Super::TickComponent(FApp::GetDeltaTime(), TickType, ThisTickFunction);
}
 
void UCustomNiagaraComponent::BeginPlay()
{
	Super::BeginPlay();
 
	SetForceSolo(true);
}

감사합니다.

[Attachment Removed]