본문 바로가기

Memorize: RECALL

Key 값을 이용한 Character, Weapon, Skill 데이터 관리

Key를 사용한 이유

 처음에는 직접 Mesh와 Animation, Transform을 설정해주었다. 그러나 하나의 프로퍼티를 변경할 때마다 모든 값을 그에 맞추는 것은 번거로운 작업이었고, 그 값을 매번 기억하는 것 역시 비효율적이었다. 그래서 DataTable에 값을 저장한 후, 키 값을 변경하면 그에 맞추어 자동으로 변경되게끔 제작하였다.

 또한 젤다의 전설: BOTW와 비슷하게 같은 무기의 같은 스킬도 레벨에 따라서 다른 효과를 입히도록 만들기 위해 Level 시스템을 도입했다. 그렇기에 Weapon에 Skill의 클래스는 직접 저장할 수 있더라도, Skill의 Data는 직접 저장하지 못하고 DB처럼 값을 기반으로 찾아올 필요가 있었다. 이를 구현하기 위해 Weapon의 키, Level, Skill의 인덱스를 조합하여 Level에 맞는 Skill의 키 값을 얻어오는 시스템을 만들었다.

 

Character의 Key 기반 데이터 시스템

 Character의 Key는 Weapon과 달리 다른 시스템에 영향을 주지 않는다. 그렇기에 DataTable에서 Key에 맞는 데이터를 가져온 후, 그 데이터를 실제로 적용하면 끝이다. 물론 데이터 테이블이 없거나, Key가 존재하지 않는 경우 전부 Default로 세팅해주었다.

Character의 Data와 값을 읽어오는 코드

 

Weapon, Skill의 Key 기반 데이터 시스템

 Weapon은 Weapon Component에서 소유하는 Server에만 존재하는 객체이다. 초기화 이전에 서버인지 확인을 하며, Weapon Component에서 Key의 관리와 초기화를 책임지게 된다. 또한 0번 Key는 무기가 없을 때의 Key이고, 255번은 Invalid Key로 규정했다. 또한 Weapon이 정상적으로 초기화되었는지 확인하여 실패했을 경우, Key에서 제거한다.

Weapon Component의 Initialize

 

 Weapon의 초기화는 Data 검증, Skill 배열 객체 초기화, Visual Data 초기화 순으로 이루어진다. 실제 Skill Data의 초기화는 이때 하지 않는데, 전 포스팅에 쓰여있듯이, Weapon의 초기화는 Visual Data가 포함되기에 Editor Time에도 실행되나, Skill의 초기화는 Visual Data가 포함되지 않기에 BeginPlay에서 진행된다. 또한 객체 생성을 줄이기 위해, 한 Weapon에 있는 클래스가 같은 Skill 객체는 한 개만 생성되고, 실제 Skill 실행 때 데이터를 적재하게 된다. 그렇기에 Skill Data를 초기화하는 책임은 Weapon이 맡게 된다.

BeginPlay에서 실행되는 Skill Data의 초기화, Skill 실행 때 적재되는 Skill의 Data

마지막으로, Skill Data를 초기화하는 코드이다. Skill의 Key는 Weapon Key + Level + 규칙에 의해 생성된 Key가 된다.  이렇게 얻는 Key를 통해 Skill Data Table에서 Skill의 Data를 얻어오게 된다. Key의 생성 규칙은 다음 포스팅에 포함될 것이다. 

 

Skill Data를 초기화하는 코드