저번에 구현해놨던 아이템 스폰을 이어서 정리해보려고 한다.
과제를 하면서 이미 구현된 부분이 많지만, 제대로 이해되지 않은 부분이나 시간 때문에 쫒겨 깊게 보지 못한 부분들을 다시 이해하고 공부한다는 마음으로 작성하였다.
블루프린트도 많이 쓰고 생소한 클래스들도 많이 다뤄서 재밌었던 경험이었다.
구현해야 할 목록들
- 캐릭터- 캐릭터 애니메이션- 아이템 스폰
- 게임 흐름 설계
- 웨이브 설계
- UI 제작
아이템 스폰에서 현재 스폰될 볼륨까지 구현해놓았다.
이제 구현한 기능을 연결시켜줘야한다.
아이템 랜덤 생성 구현 과정
1. C++ 클래스를 상속받은 블루프린트를 만들어준다.
Create Blueprint class based on "클래스이름"을 클릭하면 해당 클래스를 기반으로 한 블루프린트가 생성된다.
아 참고로 이렇게 만든 블루프린트에서 여러 변수나 프로퍼티들을 수정하려면 리플렉션에 등록해줘야하고, 관련 매크로들을 채워줘야한다.
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
// 에디터에서 수정할 수 있지만, 블루프린트 내에서는 값을 변경할 수 없음
또는
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawning")
// 에디터와 블루프린트 모두 값 읽고 변경 가능
2. 생성한 블루프린트를 Level에 올린 후 맵의 영역에 맞게 크기를 조절해준다.
3. 생성할 아이템의 정보와 확률을 저장하고 있는 Item Data 구조체를 적용한다.
아이템의 생성확률을 코드에서 적용하면 아이템의 종류가 추가될 때마다 계속 수정해줘야하고 굉장히 번거로운 작업이 될 것이다.
그래서 언리얼에서 데이터 테이블이라는 구조체를 제공한다.
이 데이터 테이블은 저장된 정보를 csv나 json으로 관리해서 간편하게 정보를 불러오고 저장할 수 있는 장점이 있다!
Item Data 구조체 만들기
먼저 데이터 테이블의 각 행(Row)를 구조체로 매핑해줘야한다.
언리얼에서는 FTableRowBase 라는 기본 구조체를 제공한다.
#pragma once
#include "CoreMinimal.h"
#include "ItemSpawnRow.generated.h"
USTRUCT(BlueprintType)
struct FItemSpawnRow : public FTableRowBase
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName ItemName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TSubclassOf<AActor> ItemClass;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float SpawnChance;
};
이렇게 저장할 데이터의 행을 추가해준다.
아 그리고 언리얼 엔진에서 추가하게되면 cpp 파일도 같이 생성되는데 이 파일은 비어있어도 삭제는 하지 않는 것이 좋다고 한다.
언리얼에서 파일을 읽어올 때 헤더와 cpp 파일을 같이 읽어오는데 여기서 하나라도 없으면 오류가 날 가능성이 조금이도 증가한다는데 이 부분은 아직 잘 모르겠다.
이제부터 실제 데이터 입력을 해야하는데 방법이 총 2가지가 있다.
1. 엑셀 파일에 직접 데이터들을 입력해주는 방법
2. 언리얼이 제공하는 데이터 데이블에서 데이터 입력해주는 방법
상황에 맞게 2가지 방법 중 하나를 택해도 되고, 둘 다 사용해도 된다.
나의 경우는 아이템의 종류가 아직 4개밖에 없어서 2번 방법을 택하였다.
데이터 테이블을 생성할 경로에 마우스 오른쪽 클릭하여 Miscellaneous -> Data Table 클릭
테이블을 생성하고 ItemName과 해당 아이템을 구현한 클래스를 상속받은 블루프린트를 연결해주었다.
그리고 Spawn Chance는 스폰될 확률인데 총 100.00이 되게 잘 조절해주면 된다.
Row Name은 말 그래도 행의 이름이라 특별히 다른 곳에 영향을 미치지는 않지만 쉽게 구별하게 위해 아이템의 이름과 같게 적어주었다.
이렇게 아이템 정보 및 스폰 확률에 대한 입력을 완료하였다!
Item Data 구조체 연결
이제 아까 생성해둔 SpawnVolum 블루프린트를 다시 열어준다.
Spawing 카테고리(내가 C++ 코드에서 직접 생성한 카테고리)에 생성한 아이템 테이블을 추가해준다.
그리고 Event Graph 탭으로 들어가서 이렇게 연결시켜준다.
그리고 For Loop 노드의 Last Index의 값에는 아이템이 스폰될 원하는 최대값을 넣어준다.
결과
그럼 이렇게 내가 지정한 확률별로 아이템이 잘 생성된 것을 볼 수 있다.
마지막 말
아이템 스폰에 관한 과정을 경험해볼 수 있어서 좋았던 것 같다.
특히 Json이나 csv로 데이터를 가져오는 부분은 실무에서도 많이 사용될 것 같았는데 언리얼에서 제공하는 방식으로 접근하니까 개발자의 입장에서는 단순 입력(데이터를 직접 작성)하는 부분이 조금 귀찮긴 했지만 편했던 것 같다.
하지만 현업에서는 이런 작업을 혼자하는게 아니라 여러 명이서 하게 될텐데 그럼 아무래도 csv를 많이 사용할 것 같아서 추후에 csv로 데이터를 받아오는 작업을 보충해서 해봐야겠다.
'Unreal Engine' 카테고리의 다른 글
[ UE, C++ ] 적 Navigation 랜덤 이동 구현하기 (0) | 2025.02.21 |
---|---|
[ UE, C++ ] NavMeshVolume 추가 및 적 AI 추격 구현하기 (0) | 2025.02.20 |
[ UE, C++ ] 웨이브 시스템을 활용한 간단한 게임 만들기 (1) (0) | 2025.02.13 |
[ UE, C++ ] 아이템 만들기 (0) | 2025.02.07 |
[ UE ] StateMachine을 활용해 캐릭터에 생기 불어넣기 (0) | 2025.02.06 |