29 - Niagara

Overcle·2023년 3월 13일
0

학원

목록 보기
22/29

요약
1. Niagara에서 사용자 파라미터는 5.0까지는 이미터에서 추가가 가능했지만.
5.1 부터는 시스템에서 추가가 가능하다.

용어 설명
1. 이미터 : 1개 이상의 모듈을 이용해 임펙트를 구현하는 기능
2. 시스템 : 1개 이상의 이미터를 담을 수 있는 가방.

Tip
1.

Niagara


Niagara란?

파티클 Cascade System을 보안하기 위해 출시된 기능이며.
맨 처음 출시 의도와 다르게 좋은 기능이 된 기능이다.

Particle Cascade System은 파티클 입자, 불똥, 등등 입자 하나하나 처리를 하기 떄문에.
무거워 지는 부분을 보안하기 위해 쓰레드를 사용하여 최적화를 진행한다.

여기서 Niagara는 GPU 쓰레드까지 사용가능하기 때문에,
입자 뿐만이 아니라 스켈레톤 메쉬 같은 부분도 빠른 처리가 가능하다.
시뮬레이선에서도 빠르게 진행을 할 수 있어. 많은 관심을 받게되었다.

결론은 월래 파티클 때문에 나온 기능이지만, 어쩌다 보니 군중 처리까지 가능하게된 기능.

결국 요즘은 하드웨어가 값이 싸지는 시기다 보니. 요즘 나오는 기능은 거의 다 Niagara를 이용한 에셋이 또는 게임이 많다.


나이아가라에서는 시스템과 이미터 를 주의깊게 보면 된다

이미터는
하나의 모듈 (기능 or 함수)
를 모아 하나의 임펙트를 구현하는 기능이다.

시스템은
여러개의 이미터를 담아 놓을 수 있는 가방이다.

Niagara CPU, GPU



GPU로 변경하기 위해서는 고정 바운드를 써야한다.
고정 바운드를 사용할때는

쉐이프 로케이션과 설정 범위값을 맞추는게 좋다.

이미터 스폰, 업데이트
파티클 스폰, 업데이트.

는 이름과 동일하게 클래스와 비교하자면 스폰은
Init. 즉 생성자와 BeginPlay부분과 유사하며
업데이트는
Tick과 유사하다.

파티클 스폰은 입자가 하나하나 스폰될떄마다 아래의 함수가 전부 호출되게 된다.

Lifetime Mode는 랜덤봐 Set이 있으며 랜덤으로 할경우 최소와, 최대를 설정할 수 있다.
입자 하나가 살아있는 시간은 5 ~ 8초로 설정되어있다.

Color Mode는 3가지의 Mode가 있으며, 설정 안하기, 단색모드, 랜덤 모드 가 있다.

랜더에서는 입자의 형태를 설정할 수 있으며.
각 재밌는 설정을 할 수 있다.

각 이미터엔 재밌는 설정값들이 기본으로 제공되어 있으며, 확인해볼것,

Niagara C++으로 구현


1. 모듈 추가 및 GameInfo.h 추가

Build.cs

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","AIModule","GameplayTasks","NavigationSystem","UMG", "UMGEditor","Niagara" });

GameInfo.h

#include "NiagaraComponent.h"
#include "NiagaraFunctionLibrary.h"

ParticleNiagara.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "ParticleBase.h"
#include "ParticleNiagara.generated.h"

UCLASS()
class UE11_API AParticleNiagara : public AParticleBase
{
	GENERATED_BODY()

public:
	AParticleNiagara();

protected:
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = true))
	UNiagaraComponent* mParticle;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	virtual void SetParticle(UNiagaraSystem* Particle);
	virtual void SetParticle(const FString& Path);

public:
	UFUNCTION()
	void ParticleFinish(UNiagaraComponent* Particle);
};

ParticleNiagara.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "ParticleNiagara.h"

AParticleNiagara::AParticleNiagara()
{
	mParticle = CreateDefaultSubobject<UNiagaraComponent>(TEXT("Particle"));

	mParticle->SetupAttachment(mAudio);
}

void AParticleNiagara::BeginPlay()
{
	Super::BeginPlay();

	//mParticle->OnSystemFinished.AddDynamic(this, &AParticleCascade::ParticleFinish);

	//mParticle->SetNiagaraVariableFloat(TEXT("SpawnCount"), 30.f);
	mParticle->OnSystemFinished.AddDynamic(this, &AParticleNiagara::ParticleFinish);
}

void AParticleNiagara::SetParticle(UNiagaraSystem* Particle)
{
	if (IsValid(Particle))
		mParticle->SetAsset(Particle);
}

void AParticleNiagara::SetParticle(const FString& Path)
{
	UNiagaraSystem* Particle = LoadObject<UNiagaraSystem>(
		nullptr, *Path);

	if (IsValid(Particle))
		mParticle->SetAsset(Particle);
}

void AParticleNiagara::ParticleFinish(UNiagaraComponent* Particle)
{
	Destroy();
}

머 플머가 Niagara는 만질일이 없지만. 어떤게 어떤기능이고. 어느 느낌을 낼려면 어디 부분을 수정해야 할 정돈 되야하니. 맥락은 필수적으로 알아야한다.

profile
게임 프로그래머 지망생의 발자취

0개의 댓글