본문 바로가기

Memorize: RECALL

Editor Time에 Character와 Weapon 교체하기

Editor Time 변경이 필요한 이유

 Player Character의 블루프린트나, 맵에 배치된 AI들의 프로퍼티만을 변경해도 Editor에서 바로 적용되게끔 하고 싶었다. 변경 즉시 피드백이 되어야 올바르게 변경되었는지 확인할 수 있기 때문이다. 물론 Skill Data 같은 Non-Visual적인 객체들은 Editor Time에 변경할 필요가 없다. 즉 Character와 Weapon의 키 값만 Editor Time에 확인하여 키 값에 맞게 교체하면 된다.

 

프로퍼티 변경을 인식하는 방법

 UObject의 수많은 Virtual 함수 중에 PostEditChangeProperty라는 함수가 있다. 프로퍼티가 변경된 후 호출되는 함수로 이를 이용해서 Editor Time 변경이 가능하다. 또한 #WITH_EDITOR를 이용해서 실제 빌드되는 소스에서 필요 없는 함수를 줄일 수 있다.

 

변경된 프로퍼티가 무엇인지 확인하기

 모든 프로퍼티가 변경될 때마다 수정하는 것은 비효율적이다. 오직 키 값의 변경이 있을 때만 수정하면 된다. PostEditChangeProperty 함수에서는 변경된 프로퍼티의 이름을 얻어올 수 있다. 이를 통해 변경된 프로퍼티의 이름과 키의 프로퍼티 이름이 같을 때만 수정하는 방법을 사용할 수 있다.

Weapon Component의 PostEditChangeProperty 코드

 

 여기서 GET_MEMBER_NAME_CHECKED 매크로는 언리얼 엔진에서 프로퍼티의 이름을 얻어오는 방법이다. 내부 구현은 단순히 프로퍼티의 이름을 FName으로 변경해 주는 것이지만, 클래스에 해당 프로퍼티가 있는지 확인해 주는 역할을 수행해준다.

GET_MEMEBER_NAME_CHECKED 내부 코드

BeginPlay와 PostInitializeComponents(InitializeComponent)의 차이

 기존의 변경한 것을 엔진을 실행하고 초기화할 때 받아올 필요가 있다. 즉 Visual Data를 키 값에 의존해 초기화할 필요가 있다. 이를 위해 PostInitializeComponents(InitializeComponent)를 사용해야 한다. 이는 BeginPlay처럼 Actor(Component)를 초기화해주는 함수이다. BeginPlay와의 차이점은 BeginPlay는 게임이 실행되고 호출되나, Initialize 함수들은 Editor에서도 호출이 된다. 그렇기 때문에 Initialize 함수를 통해 초기화 작업을 해주어야 한다. 여기서 중요한 점은 Component의 생성자에서 bWantsInitializeComponent를 true로 세팅해주어야 InitializeComponent가 실행된다는 것이다.

 

 이제 Editor Time에 변경된 키 값을 통해 Character와 Weapon을 변경할 수 있게 되었다. 키 값을 통해 실제로 초기화하는 것은 다음 포스팅에 공유할 것이다.