![[Unreal Engine C++] C++에서 Niagara System 스폰](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccm3GR%2FbtsHHnFsAtT%2FDx4718o4bPNKZLAtOZeqsk%2Fimg.png)
필자가 프로젝트를 진행하면서 사용하였던 나이아가라 시스템을 C++로 스폰시키고 사용 후 디스폰시키는 방법, 나이아가라 시스템을 패키징 할 때 발생할 수 있는 문제를 수정하는 방식을 확인해보자
Niagara System의 사용
게임 개발 프로젝트를 진행하면서 게임 특성중 하나인 정신력 게이지를 회복시키는 아이템을 추가하기로 하였다.
이 아이템은 촛불인데, 그 촛불에서 불이 나는 느낌을 내기 위해 나이아가라 시스템을 사용하고자 했다.
에셋으로 받은 불 나이아가라 시스템을 이미터의 수치값을 조정하여 파란색으로 수정 및 무한 재생하게 수정해주었다.
이를 C++에서 불러오고자 다음과 같은 코드를 작성하였다.
// SanityRecovary.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "NiagaraSystem.h"
#include "NiagaraComponent.h"
#include "SanityRecovery.generated.h"
UCLASS()
class CAPSTONE_API ASanityRecovery : public AActor
{
GENERATED_BODY()
...
public:
UPROPERTY(VisibleAnywhere, Category = Mesh)
UStaticMeshComponent* Mesh;
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "Default")
UNiagaraSystem* SanityFXSystem;
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category = "Default")
UNiagaraComponent* SanityFXComponent;
...
}
// SanityRecovary.cpp
#include "SanityRecovery.h"
#include "Components/WidgetComponent.h"
#include "NiagaraFunctionLibrary.h"
#include "CapstoneCharacter.h"
// Sets default values
ASanityRecovery::ASanityRecovery()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));
RootComponent = Mesh;
...
static ConstructorHelpers::FObjectFinder<UNiagaraSystem> NE(TEXT("NiagaraSystem'/Game/SICKA_mansion/ParticleSystems/Particle_Fire_Emitter_System_1.Particle_Fire_Emitter_System_1'"));
if (NE.Succeeded())
{
SanityFXSystem = NE.Object;
}
...
}
// Called when the game starts or when spawned
void ASanityRecovery::BeginPlay()
{
Super::BeginPlay();
SanityFXComponent = UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), SanityFXSystem, FVector(GetActorLocation().X, GetActorLocation().Y, GetActorLocation().Z + 60.0f));
if (SanityFXComponent)
{
SanityFXComponent->Activate();
}
}
...
void ASanityRecovery::Interaction()
{
...
SanityFXComponent->Deactivate();
}
촛불 액터에 상호작용할 시 나이아가라 시스템도 촛불과 같이 destroy()되는 것을 원했기 때문에 다음과 같이 작성하였다.
헤더 파일에 system과 그 것을 이용하는 액터의 하위 오브젝트 component를 생성해두고, ConstructorHelpers::FObjectFinder를 이용하여 레퍼런스를 불러온다.
이를 SpawnSystemAtLocation으로 생성시키고 Activate() 함수를 활용해 활성화 시켜준다.
이후에 디스폰을 할 때에는 Deactivate()함수를 이용해 비활성화를 시켜주면, 언리얼 내에서 비활성화한 나이아가라 시스템 컴포넌트를 자동으로 삭제시켜 준다.
게임을 패키징 할 때 발생할 수 있는 문제점
이 방식을 사용하면 문제없이 패키징 할 수 있다.
다만 나이아가라 컴포넌트에 대해 자세히 확인하지 않고 나이아가라 시스템만을 활용해서 액터에 추가 및 사용하였을 때에 문제점이 발생하였다.
컴포넌트를 사용하지 않고 시스템만을 이용해 스폰시킬 수 있고, 이를 에디터에서 확인하였을 때 문제없이 실행이 되었지만, 이 후 게임을 패키징 할 때 나이아가라 시스템 내에서 문제가 발생해 패키징이 안되는 문제점이 있었다.
이를 컴포넌트에 넣고, Active와 Deactive를 사용해 확실하게 지정해주어야 문제점이 발생하지 않을 것이다.
UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), SanityFXSystem, FVector(GetActorLocation().X, GetActorLocation().Y, GetActorLocation().Z + 60.0f)); (X)
///
SanityFXComponent = UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), SanityFXSystem, FVector(GetActorLocation().X, GetActorLocation().Y, GetActorLocation().Z + 60.0f));
SanityFXComponent->Active() (O)
'UnrealEngine > 공부' 카테고리의 다른 글
[Unreal Engine C++] Widget Blueprint를 이용해 세션 생성 및 접속 기능 만들기 (0) | 2024.08.15 |
---|---|
[GitLab] SourceTree를 활용해 팀 프로젝트 진행해보기 (0) | 2024.08.04 |
[Unreal Engine C++] Online Subsystem을 활용한 멀티플레이 구현 (1) | 2024.04.20 |
[Unreal Engine C++] 청크 개념을 이용한 랜덤 맵 생성 알고리즘 (0) | 2024.03.30 |
[Unreal Engine C++] 랜덤 맵 생성에 관한 아이디어들 (0) | 2024.03.29 |
CSE & GAME 개발 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다!