[UE5] 이득우 Part 2. 8강 아이템 시스템

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

트리거 박스의 구현

  • 루트에 트리거를 설정하고 자식에 메시 컴포넌트를 부착
  • 이펙트는 기본 값으로 비활성화 상태로 두고 오버랩 이벤트 발생시 발동되도록 설정
  • 이펙트 종료시 액터가 제거되도록 설정

실습

  • 액터 상속한 아이템 박스 클래스 생성
    • Trigger용 박스 컴포넌트
    • 메쉬 컴포넌트
    • 이펙트 용 파티클시스템 컴포넌트

    • 루트를 트리거, 나머지를 SetupAttachment
    • 메쉬는 SetCollisionProfileName(TEXT("NoCollision"))
    • 이펙트는 bAutoActivate = false

    • 트리거 OnComponentBeginOverlap
      • 델리게이트
      • F12를 이용해서 인자 구성 확인 가능
      • 블루프린트에서도 사용 가능하도록 다이나믹 델리게이트로 선언되어 있음
        -> 연결해주는 함수는 UFUNCTION() 으로 지정을 해줘야 함
      • AddDynamic으로 바인딩
    • 바인딩할 함수에 이펙트 활성화, 메쉬 삭제, 충돌 끄기
      • 이펙트에 OnSystemFinished 델리게이트
        -> 액터가 사라지는 함수 바인딩

  • 데이터 에셋 상속받은 아이템 데이터 클래스 생성
    • enum
      • 웨폰, 포션, 스크로
      • UENUM(BlueprintType) 설정
  • 아이템 데이터 클래스를 상속 받은 웨폰 아이템 데이터 클래스 생성
    • 웨포 메쉬 속성
  • 에디터에서 아이템 폴더에 하위 세 폴더를 만들고 포션과 스크롤은 아이템 데이터로 생성, 웨폰은 웨폰 아이템 데이터로 생성

아이템 애셋

  • 무기 타입 : 캐릭터에 무기 부착 ( 무기에 의한 부가 스탯 강화)
    • 공격거리, 공격반경, 공격속도, 공격대미지
  • 포션 타입 : 캐릭터 hp 회복
  • 스크롤 타입 : 캐릭터 스탯 상승
    • 기본공격력, 기본방어력, 최대hp, 이동속도

-> 스탯은 이후 구현, 다른 타입 데이터 클래스도 추후 생성

프로젝트의 주요 레이어

  • 새로운 아이템이 추가될 때마다 함수나 로직을 추가하는 것은 번거로움
    -> 의존성을 최대한 분리한 상태에서 설계

  • 데이터 레이어 : 게임을 구성하는 기본 데이터
    • 스탯 정보, 캐릭터 레벨 테이블 등
  • 미들웨어 레이어 : 게임에 사용되는 미들웨어 모듈
    • UI, 아이템, 애니메이션, AI 등
  • 게임 레이어 : 게임 로직을 구체적으로 구현하는데 사용
    • 캐릭터, 게임 모드 등

  • 게임 -> 미들 -> 데이터 순으로는 직접 참조
  • 반대로는 인터페이스를 통해 접근

실습

  • 캐릭터 아이템 인터페이스 클래스 생성
    • 아이템 획득 가상 함수 생성, 캐릭터가 상속받음

  • 아이템 획득 함수
    • 아이템의 열거형 값에 따라 Switch를 통해 구현할 수도 있지만 델리게이트를 이용

  • 델리게이트 다수를 배열로 관리
    • 인자로 사용 불가
      -> 감싸는 구조체를 만들음
      -> Wrapper 구조체를 TArray 배열로 선언
      -> 타입 순서대로 델리게이트를 생성해서 넣어줌
  • 웨폰 속성에 스켈레탈 메쉬 컴포넌트 생성
    • 소켓 부착
    • 무기 아이템 획득 시 웨폰의 메쉬를 아이템의 웨폰 메쉬로 설정

소프트 레퍼런싱

소프트 레퍼런싱 vs 하드 레퍼런싱

  • 액터 로딩시 TObjectPtr로 선언한 언리얼 오브젝트도 따라서 메모리에 로딩됨
  • 이를 하드 레퍼런싱이라고 함
  • 게임 진행에 필수적인 언리얼 오브젝트는 괜찮지만 데이터 라이브러리에 1000종의 아이템 목록들을 모두 로딩하는 것은 메모리에 큰 부담
  • 필요한 데이터만 로딩하도록 TSoftObjectPtr로 선언하고 대신 에셋 주소 문자열을 지정
  • 필요시에 에셋을 로딩하도록 구현을 변경할 수 있으나 에셋 로딩 시간이 소요
  • 현재 게임에서 로딩되어 있는 스켈레탈 메시 목록 살펴보기

실습

  • 아이템 데이터의 스켈레탈 메쉬 속성은 TSoftObjectPtr로 변경
    • 소프트 레퍼런싱이기 때문에 로딩이 됐는지 안됐는지 모름
    • IsPending : 로딩이 됐는지 확인
      -> 안됐으면 LoadSynchronous : 동기적으로 로딩
    • Get 함수로 메쉬를 가져옴

0개의 댓글