트리거 박스의 구현
- 루트에 트리거를 설정하고 자식에 메시 컴포넌트를 부착
- 이펙트는 기본 값으로 비활성화 상태로 두고 오버랩 이벤트 발생시 발동되도록 설정
- 이펙트 종료시 액터가 제거되도록 설정
실습
- 액터 상속한 아이템 박스 클래스 생성
- 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 함수로 메쉬를 가져옴