스테이지 기믹 기획
- 스테이지는 플레이어와 NPC가 1:1로 싸우는 장소
- 스테이지는 4개의 상태
- READY : 플레이어 업장 처리
- FIGHT : NPC와 대전
- REWARD : 보상 선택
- NEXT : 스테이지 이동 처리
- 반복
준비 단계
- 스테이지 중앙에 트리거 볼륨 준비
- 플레이어가 트리거 볼륨에 진입하면 대전 단계로 이동
대전 단계
- 플레이어가 못 나가게 스테이지의 모든 문을 닫고 대전할 NPC 스폰
- NPC가 없어지면 보상 단계
보상 선택 단계
- 정해진 위치에 4개의 상자에서 랜덤하게 아이템 생성
- 상자 중 하나 선택하면 다음 스테이지 단계로 이동
다음 스테이지 선택 단계
- 스테이지의 문을 개방
- 문에 설치된 트리거 불륨을 활용해 통과하는 문에 새로운 스테이지를 스폰
스테이지 기믹 설계, 구현
- 스테이지에 설치한 트리거 볼륨의 감지 처리
- 각 문에 설치한 네 개의 트리거 볼륨의 감지 처리
- 상태별로 설정할 문의 회전 설정
- 대전할 NPC의 스폰 기능
- 아이템 상자의 스폰 기능
- 다음 스테이지의 스폰 기능
- NPC의 죽음 감지 기능
- 아이템 상자의 오버랩 감지
에셋 매니저
- 언리얼 엔진이 제공하는 에셋을 관리하는 싱글톤 클래스
- 엔진이 초기화될 때 제공되며, 에셋 정보를 요청해 받을 수 있음
- PrimaryAssetId를 사용해 프로젝트 내 에셋의 주소를 얻어올 수 있음
- PrimaryAssetId는 태그와 이름의 두 가지 키 조합을 ㅗ구성되어 있음
- 특정 태그를 가진 모든 에셋 목록을 가져올 수 있음
랜덤 보상 설정
- 아이템 데이터에 ABItemData라는 에셋 태그를 설정
- 프로젝트 설정에서 해당 에셋들이 담긴 폴더를 지정
- 전체 에셋 목록 중에서 하나를 랜덤으로 선택하고 이를 로딩해 보상으로 할당
실습
- 액터 상속 받은 기믹 클래스 생성
- 스테이지 메쉬 속성
- 트리거 박스 속성
- 오버랩 함수
- 게이트 메쉬 속성
- 4개가 필요해서 Map으로 관리
- 문 마다 트리거 배치해서 TArray로 관리
- 오버랩 함수
- 스테이지 상태 열거형
- private로 하는 게 좋음(protected)
- 상태는 set 함수로만 변경할 수 있도록
- set은 switch로 하면 굉장히 복잡하기 때문에 이번에도 델리게이트를 이용
- 마찬가지로 wrapper 구조체로 델리게이트 생성
- 에디터에서 상태 값을 변경한다고 해서 지정된 함수들이 실행되는 것이 아님
- OnConstruction 함수를 이용
- 에디터에서 속성들을 변결할 때 연동된 것들이 같이 시뮬레이션
- 레벨 디자인 할 때 편리
- OnConstruction는 모든 속성이 변경될 때 마다 호출
- NPC 속성
- TSubclassOf 사용
- 지정한 클래스로부터 상속받은 클래스 목록만 표시
-> 블루프린트로 확장해서 사용
-> 모든 액터 목록을 조사하면 창이 굉장히 늘어나지만 목록을 한정시켜 편리하게 지정- 스폰 딜레이 속성
- NPC 죽었을 때 보상 단계를 위한 함수
- NPC가 스폰됐을 때 연동하기 위한 함수
- 스테이지 기믹 액터 생성 함수
- 트리거 컴포넌트가 overlap 됐을 때 호출하는 함수
- 트리거 컴포넌트의 태그를 통해서 socket 가져옴
- GetSocketLocation를 통해 소켓 위치를 얻어옴
- 해당 위치에 이미 다른 스테이지가 설치되어 있을 수도 있음
-> OverlapMultiByObjectType를 통해서 검사
-> 해당 위치에 없으면 스폰
- 보상 박스 클래스 지정
- TSubclassOf 사용
- 리워드 박스 배열
- TWeakObjectPtr
- 스폰된 상자들은 스테이지 기믹 액터와 무관하게 자기 스스로 동작
-> TObjectPtr를 사용하면 언리얼 엔진은 아직 사용되고 있다고 판단
-> 메모리에서 소멸되지 않을 수 있음- 리워드 박스 위치 Map
- 키로 관리
- 오버랩 함수
- 리워드 박스들을 순회하는데 약참조이기 때문에 유효성 확신 불가
- IsValid로 검사
- 같은 박스면 박스가 알아서 동작
- 다른 박스면 소멸
- 스폰 함수
- 아이템 랜덤하게 얻어야함
- 프로젝트 세팅 - 에셋 매니저
- 관리할 에셋을 추가
- 폴더 지정
- 아이템 데이터 클래스에서 GetPrimaryAssetId 오버라이드
- 태그 이름과 GetFName를 이용해서 에셋 이름
-> 식별자 Id 만들음- 상속 받은 웨폰 아이템 데이터에도 똑같이
-> 태그를 공유하는 같은 종류의 에셋이라고 지정된 것
- 아이템 박스에 PostInitializeComponents 구현
- UAssetManager는 엔진이 초기화 될 때 언제나 로딩이 된다고 보장
- Get 스태틱 함수로 가져올 수 있음
- GetPrimaryAssetIdList로 지정한 폴더 내에 있는 모든 에셋에 대해서 태그 아이디를 가지고 있는 에셋들의 목록을 배열로 반환
- FSoftObjectPtr를 통해서 로딩