




- xlsx 파일을 csv 파일로 변경하면 언리얼에서 Import 할 수 있게된다.

- 위의 이름과 동일한 구조체를 먼저 선언해 줘야한다.

- ABCharacterStat.h 에 선언



- 구조체를 선언할 때 FTableRowBase 라는 구조체를 상속받아야 한다.
- 주의점 : 엑셀 데이터 테이블의 컬럼에는 Name 이라는 이름의 컬럼이 들어가야 한다.
- 키값이 됨
- 이 Name 이라는 Key 값들을 이용해 각각에 대해서 접근할 수 있다.
- 고유한 식별자를 부여
- 컬럼을 제외한 나머지 데이터들을 구조체에 선언

- 연산자 오버로딩을 바꾸지 않기 위해 모든 데이터 형식을 float 로 통일

- 위에서 만든 ABCharacetStat.h 를 상속받는 데이터 테이블 생성

- Reimport → CSV 파일 선택

Data Table 을 관리할 별도의 클래스 생성
- 이러한 클래스는 게임 내에 단 하나의 인스턴스에서 관리하게 만드는 것이 좋기 때문에 싱글턴으로 생성

- 다양한 싱글턴 클래스들을 제공한다
- GameMode 의 경우 멀티 포함 전체 게임 내에서 단 하나만 존재
- GameInstance 의 경우 컨텐츠에 관여하기보다는 주로 어플리케이션의 데이터를 관리하는 용도로 많이 사용
- 고로 게임 컨텐츠에 직접적인 영향을 미치는 새로운 클래스를 생성해 싱글톤으로 등록하자
- 엔진이 초기화 될 때 GEngine 이라고 하는 전역 변수에 자동으로 만들어줌

- Project Settings → Engine → General Settings → Default Classes → Advanced

- Object 를 상속받는 싱글톤 클래스 생성

- GameSingletonClass 에 등록
- 프로젝트를 껏다켜야 반영됨
- 생성자에서 엑셀 데이터 테이블을 불러들이는 기능 추가
- 모든 게임 코드에서 싱글톤으로 접속할 수 있게 에셋메니저와 비슷하게 Get() 함수 만들기



- Error 가 있는지 확인

- 크게 3가지 레이어로 구성
- 위에서 아래로만 참조 가능하고 그 반대로는 못하게 설계

- Character 는 자신의 레벨에 따라 방금 제작한 GameSingleton 으로부터 Stat 정보를 가져와서 BaseStat 이라고 하는 멤버변수에 저장한다.
- ModifierStat 의 경우 Character 가 무기를 착용할 때 Weapon 으로부터 Stat 정보를 받아와 이 ModifierStat 에 저장함.
- 캐릭터의 최종 스탯은 이 BaseStat 과 ModifierStat 을 더한 값으로 공격판정을 진행하도록 설계
ABCharacterStatComponent 의 구조 살짝 변경

- MaxHp 값은 BaseStat 으로 바뀌기 때문에 제거

- 위의 4가지 값들은 캐릭터가 초기화 될 때마다 언제든지 값이 변할수가 있기 때문에 Transient 키워드 추가




- 생성자에는 CurrentLevel 값만 설정



- 전부다 바꿔준다
스테이지를 하나씩 클리어할 때마다 NPC의 레벨이 하나씩 올라가서 더 높은 스탯을 가지도록 설정



- ABStageGimmick 에 추가



- ABCharacterBase 에 추가

- NPC 의 레벨을 새로운 레벨로 설정


- 잘 적용된 모습


- Camera Preview 로 사이즈 조절 가능

- 보면 BaseStat 은 잘 설정되어있는데 CurrentHp 값이 여전히 100으로 되어있다.

- SpawnActor 라는 API 를 사용해서 액터를 생성하게 되면 액터와 액터가 가지고 있는 모든 컴포넌트의 BeginPlay 함수가 바로 호출이 된다.

- 위의 함수가 실행됨
- 여기서 CurrentLevel 은 1이니 1로 설정됨

- 기믹의 경우 이미 SpawnActor 를 호출해서 BeginPlay 를 실행한 상태에서 SetLevel 을 진행했기 때문에 CurrentHp값이 반영이 안되고 BaseStat 에만 반영이 된 모습
- 이러한 문제를 해결하기 위해서 SpawnActorDeffered 라고 하는 지연 생성함수를 제공한다.
- 이 함수는 마지막에 FinishSpawning 함수를 호출해야 그때서야 BeginPlay 함수가 호출이 되는 방식
- PostInitialize 함수도 마찬가지

- 잘 작동
- 이처럼 모든 스폰 코드는 초기값이 반영이 되어야 한다면 지연생성 코드로 바꿔주는 것이 좋다.
- 알수없는 오류를 미연에 방지할 수 있음



- 모두 지연생성으로 변경
- 상자 자체에서 설정한 델리게이트에 의해서 이벤트가 발동하면 제어하기가 불편하다. 그래서 상자에 설정된 델리게이트의 타이밍을 뒤로 미루고 기믹의 진행을 위해서 설정한 델리게이트를 미리 그전에 설정하도록 만듬.

- 바인딩을 생성자가 아닌 여기에서 진행
캐릭터가 무기를 흭득할 때 부가 스탯을 얻도록 설정

- ABWeaponItemData 에 추가

- 추가정보 설정

- 추가


- 무기를 얻으면 Modifier Stat 이 변경되는 모습
NPC 가 스폰될때 각기 다른 NPC 로 스폰되도록 설정


- 에셋의 경로들이 NPCMeshes 라고 하는 변수에다가 선언되어 있는데 + 는 배열의 요소를 의미함
- 맨 위에 [] 로 감싸져 있는 부분이 개체의 주소
- Script 로 시작하므로 C++ 개체를 가리킴
- NPCMeshes 라고 하는 TArray 변수가 ABCharacterNonPlayer 에 선언되어 있다면 이것의 값을 지정해준다.

- UCLASS 에 config=ArenaBattle 의 의미는 위의 DefaultArenaBattle.ini 파일을 내가 사용해서 불러들이겠다는 것을 의미
- UPROPERTY(config) 는 해당 config 파일로부터 내가 데이터를 불러오겠다는 의미
- 프로젝트가 로딩될 때 자동으로 NPCMeshes 변수가 초기화 됨
- 로딩을 비동기로 진행하기 위해서 FStreamableHandle 이라고 하는 구조체 선언

