
이제 항아리를 부쉈을 때 다양한 종류의 보물이 나오도록 구현해보자.
이를 구현하기에 앞서 플레이어가 모은 보물의 양에 따라 골드량이 달라지는 것을 구현해보자.
우선 Treasure 클래스에 Gold변수를 추가해서 보물이 가진 골드량을 나타내도록 하자
Treasure.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Items/Item.h"
#include "Treasure.generated.h"
/**
*
*/
UCLASS()
class SLASH_API ATreasure : public AItem
{
GENERATED_BODY()
protected:
virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) override;
private:
UPROPERTY(EditAnywhere, Category = Sounds)
USoundBase* PickupSound;
UPROPERTY(EditAnywhere, Category = "Treasure Properties")
int32 Gold;
};
이렇게 해주고 Treasure 클래스를 바탕으로 만들어둔 블루프린트 클래스가 기본으로 두 다른 파생 블루프린트 클래스를 만들어주자.


보면 부모의 이벤트를 자동으로 호출하고 있는것도 볼 수 있다.

이제 이 방법으로 다양한 아이템을 만들어주자.

이렇게 만들어준 보물들중에 랜덤하게 스폰하도록 코드로 구현해보자. 이를 위해 TArray를 사용할 것이다.
BreakableActor.h
private:
UPROPERTY(EditAnywhere, Category="Breakable Properties")
TArray<TSubclassOf<class ATreasure>> TreasureClasses;
BreakableActor.cpp
void ABreakableActor::GetHit_Implementation(const FVector& ImpactPoint)
{
UWorld* World = GetWorld();
if (World && TreasureClasses.Num() > 0)
{
FVector Location = GetActorLocation();
Location.Z += 75.f;
int32 Selection = FMath::RandRange(0, TreasureClasses.Num() - 1);
World->SpawnActor<ATreasure>(TreasureClasses[Selection], Location, GetActorRotation());
}
}
이렇게 해주면 랜덤하게 보물이 드랍된다.

여기에 약간의 효과를 추가해보자 이번에는 이펙트에 나이아가라 시스템을 사용해볼 것이다.
이를 위해 나이아가라시스템을 만들어주자.


이렇게 생성해주면 기본적인 요소들이 만들어져있다.

이 요소들을 살펴보면 다양하게 있는데 이를 통해 이펙트가 만들어지게 되는 것이다. 이 하나하나가 규칙이라고 보면 된다.
이 중에 렌더는 말 그대로 화면에 보이도록하는 것인데 지금은 하얀 입자 하나하나가 스프라이더 이고 이를 보이게 해준다.
Emitter State는 생명주기에 관한것으로 Self는 자체 수명 주기를 사용하는 것이다. 만약 이것을 시스템으로 바궈주면 시스템에서 생명주기를 정해주게 되는 것이다. 무한정 반복되며 주기는 2초이다.
SpawnRate 초당 스폰되는 Emitter의 수이다.
파티클 스폰은 스폰되는 모양에 관한 것으로 각 입자에 대한 초기값이다. 이때 Color값을 1보다 높게하면 반짝이는 효과를 낼 수 있다.


그리고 Shape Location을 조절해주는 것으로 이펙트 산란구역을 설정해줄 수 있다.

이펙트의 속도도 느리게 하고 나오는 각도도 조절해주자

그리고 이 이펙트가 자동으로 종료되는 것이 아닌 우리가 종료시키고 싶기 때문에 Kill Particles를 해제해준다.

Drag는 커질수록 입자의 속도를 느리게 해준다.

여기에 입자들이 소용돌이처럼 돌도록 하기위해 Vortex Velocity를 추가해주자. 그리고 Kill Particles를 다시 체크해주자.


효과는 성공적으로 만들었으니 이를 모든 아이템에서 작동하도록 아이템 코드에 나이아가라 시스템 변수 추가해주자.
Item.h
private:
UPROPERTY(EditAnywhere)
class UNiagaraComponent* EmbersEffect;
Item.cpp
#include "NiagaraComponent.h"
// Sets default values
AItem::AItem()
{
// 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;
ItemMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ItemMeshComponent"));
RootComponent = ItemMesh;
Sphere = CreateDefaultSubobject<USphereComponent>(TEXT("Sphere"));
Sphere->SetupAttachment(GetRootComponent());
EmbersEffect = CreateDefaultSubobject<UNiagaraComponent>(TEXT("Embers"));
EmbersEffect->SetupAttachment(GetRootComponent());
}
컴파일해준다음 BaseTreasure에 만들어둔 나이아가라 시스템을 추가해주자.

잘작동하는 것을 볼 수 있다.

이를 무기에도 붙여주는데 무기는 장착했을 때 이 효과가 없어지게 해주자.
Weapon.cpp
#include "NiagaraComponent.h"
void AWeapon::Equip(USceneComponent* Inparent, FName InSocketName)
{
AttachMeshToSocket(Inparent, InSocketName);
ItemState = EItemState::EIS_Equipped;
if (EquipSound)
{
UGameplayStatics::PlaySoundAtLocation(
this,
EquipSound,
GetActorLocation()
);
}
if (Sphere)
{
Sphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}
if (EmbersEffect)
{
EmbersEffect->Deactivate();
}
}
'게임공부 > Unreal Engine' 카테고리의 다른 글
[Unreal Engine][C++]20. Actor Component (0) | 2025.01.16 |
---|---|
[Unreal Engine][C++]19. Actor Component (0) | 2025.01.14 |
[Unreal Engine][C++]17. Treasure (0) | 2025.01.03 |
[Unreal Engine][C++]16. Breakable Actors2 (1) | 2025.01.02 |
[Unreal Engine][C++]15. Breakable Actors (0) | 2024.12.31 |