8. 아이템 시스템
이펙트(파티클 시스템)
DataAsset vs. PrimaryDataAsset- DataAsset : 경로로 구분, 게임의 각종 설정 정보나 리소스 데이터를 관리하는 에셋
- PrimaryDataAsset : 고유한 Primary Asset ID를 통해 엔진의 Asset Manager에서 직접 인식하고 관리할 수 있는 에셋
AssetManager란?
- 게임 실행 중에 PrimaryAssetId로 애셋 조회/로드언로드 가능
- 전역적으로 식별가능하며 일괄관리가 가능함, AssetManager 관리를 받지 않는 일반 DataAsset은 개별 객체로 수동 관리해줘야 함
- PrimaryAssetId는 PrimaryAssetTag와 PrimaryAssetName 두 개 조합으로 구성됨
AssetBundle이란?
- 하나의 에셋 내에서도 필요한 부분만 로드할 수 있음
- 일반 DataAsset은 특별한 설정 없이는 자신이 참조하는 에셋을 모두 한 번에 불러옴(PDA가 아니어도 GetPrimaryAssetId 직접 구현하고 AssetManager 설정하면 번들 기능 사용 가능)
정리하면
- DataAsset은 정적인 설정 데이터를 에셋화한 것
- PrimaryDataAsset은 대규모 리소스 관리, DLC/모듈화, 필요 리소스의 동적 로드 지원 목적의 DataAsset.
데이터를 코드로 직접 관리하지 않고 파일로 관리하는 것의 장점:
- 유지보수 용이성
- 협업 용이성
- 파일만 존재하면 null check 불필요
프로젝트 레이어 설계

- 데이터 레이어 : 게임을 구성하는 기본 데이터 ( 스탯 정보, 캐릭터 레벨 테이블 등등 .. )
- 미들웨어 레이어 : 게임에 사용되는 미들웨어 모듈 ( UI, 아이템, 애니메이션, AI 등등.. )
- 게임 레이어 : 게임 로직을 구체적으로 구현하는데 사용 ( 캐릭터, 게임 모드 등등.. )
- 위에서 아래로는 직접 참조하되, 아래에서 위로는 인터페이스를 통해 접근하도록 설정
Data Asset 다량 사용 시 고려사항
- 프로젝트에 수백 개 이상의 Data Asset이 존재해도 큰 문제는 없지만, 너무 세분화된 에셋은 오히려 관리 비용을 늘릴 수 있습니다.
- Asset Manager는 지정된 폴더를 스캔하여 Primary Data Asset 목록을 유지하므로, Primary Asset의 유형이 지나치게 많으면 초기 스캔 비용이 증가할 수 있습니다.
- 그러나 이 비용은 한 번이고, 검색 결과 역시 경량화되어 관리되므로 일반적으로 감내할 만합니다.
- 또한 Primary Asset ID의 이름(Name) 부분은 기본적으로 에셋 이름으로 설정되기 때문에, 에셋을 리네임하면 ID가 바뀐다는 점도 유의해야 합니다.
Data Table과의 비교
- Data Table은 하나의 파일에 여러 행(row)의 데이터를 가지고 있어 한꺼번에 일괄 편집하거나 CSV로 입출력하기 편리하지만, 개별 행을 찾는 데 인덱스나 이름으로 조회하는 과정이 필요합니다.
- 블루프린트에서 Data Table의 특정 행을 가져오려면 데이터 테이블을 순회하거나 RowName으로 찾는 비용이 들 수 있는데, 복잡한 테이블일수록 이 오버헤드가 커질 수 있습니다 (Data Asset Workflows and Pitfalls : r/unrealengine).
- 반면 Data Asset은 필요한 데이터만 개별 객체로 직접 참조할 수 있으므로, 코드나 블루프린트에서 곧바로 프로퍼티에 접근할 수 있어 접근 비용이 낮습니다 (Data Asset Workflows and Pitfalls : r/unrealengine).
- 또한 Data Asset은 그 안에 다른 에셋 레퍼런스를 바로 물고 있을 수 있어 에디터 상에서 에셋 간 참조를 연결하기 쉬운 장점이 있습니다.
- 한편으로 Data Table은 엑셀 같은 형태로 대량의 데이터를 관리하기 좋고, Data Asset은 객체 지향적으로 데이터 구조를 관리하기 좋습니다.
- 실제 개발에서는 소량의 복잡한 데이터는 Data Asset으로, 대량의 단순 테이블 데이터는 Data Table로 쓰는 식으로 병행하기도 합니다.
실행 중 데이터 수정 여부
- Data Asset(Primary 포함)은 기본적으로 런타임에 데이터를 수정하지 않고 읽기 전용으로 사용하는 것이 권장됩니다. 일반적으로 이러한 에셋의 UPROPERTY들은 EditDefaultsOnly, BlueprintReadOnly 등으로 선언하여 게임 실행 중에는 값을 바꾸지 못하게 설계하며 (Primary Data assets only have exactly 1 instance stored in memory, right? : r/unrealengine), 오직 에디터에서 설정한 기본값을 참조하는 용도로 씁니다.
- 실제로 언리얼에서 Data Asset 객체는 게임이 시작하면 로드된 상태로 메모리에 존재하고, 별도로 New해서 인스턴스를 만드는 일이 거의 없습니다 (Primary Data assets only have exactly 1 instance stored in memory, right? : r/unrealengine).
- 만약 런타임에 값이 변경되어야 하는 가변적인 데이터라면 Data Asset보다는 세이브 게임 객체나 별도의 구조체/클래스를 사용하고, Data Asset은 초기 설정값 제공만 담당하는 편이 좋습니다 (Primary Data assets only have exactly 1 instance stored in memory, right? : r/unrealengine).
- 예를 들어 인게임에서 획득한 아이템의 내구도나 퀘스트 진행도 같은 값은 Data Asset이 아니라 별도 컴포넌트나 저장 시스템을 통해 관리해야 합니다.
9. 무한 맵의 제작
설계도
- 총 4개 상태, 순차진행
- READY: 입장 처리
- FIGHT: NPC와 대전
- REWARD: 보상 선택
- NEXT: 다음 스테이지로 이동
구현
- 스테이지 트리거 볼륨 배치
- 각 문에 트리거 볼륨 배치
- 문 회전 게임 상태에 맞게 설정
- NPC 스폰
- 아이템 상자 스폰
- 다음 스테이지 스폰
- NPC 죽음 감지
- 아이템 상자 오버랩