Unreal

10강 게임데이터 관리

느억맘 2024. 2. 14. 18:58

 

 

 

 

  • 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 이라고 하는 구조체 선언