[UE5] 이득우 Part 2. 9강 무한맵의 제작

공부 스파이럴·2024년 1월 27일
0

스테이지 기믹 기획

  • 스테이지는 플레이어와 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를 통해서 로딩

0개의 댓글