이때까지 캐릭터의 스탯 정보는 액터 컴포넌트로 분리해서 구현을 했었다.
게임 점수와 같은 플레이어의 게임 데이터도 마찬가지로 액터에 보관할 수 있도록 구현하도록 하겠다.
엑터의 부모 클래스는 UE에서 플레이어 정보를 관리하기 위한 용도로 PlayerState라는 클래스를 제공함.
PlayerState클래스에는 FString형의 PlayerName 속성과 float형의 Score속성이 이미 설계되어 있음.
이 ABPlayerState클래스를 게임 모드의 PlayerStateClass속성에 지정하면 엔진에서는 플레이어 컨트롤러가 초기화 될 때 함께 해당 클래스의 인스턴스를 생성하고 그 포인터 값을 플레이어 컨트롤러의 PlayerState속성에 저장한다.
플레이오 컨트롤러의 구성을 완료하는 시점은 게임 모드의 PostLogin함수이므로 이때 함께 ABPlayerState의 초기화도 완료해주는 것이 좋다.
에러도 너무 많이 뜨고 복잡한데 그냥 Bind하는 부분이라도 건지도록 하겠다.
지금 HUD에서
이런식으로 캐릭터 스택이랑 캐릭터 스테이트 부분 TWeakObjectPtr로 즉, weak_ptr로 가지고 있다.
일단 Cycle 일어나는 부분 방지할려고 이렇게한 모양이다.
그리고나서
이 Bind시리즈 함수에서 MULTICAST DELEGATE에다가 다 묶어줌.
그러면 인자로 먼저 CharacterStat이 들어와야하고 이 BindChracterStat함수는 어디서 호출을 하냐?
ABCharacter에서 Loading State일 때 호출을 해준다.
그래서 weak_ptr로 CharacterStat을 가르킬 수 있기 때문에 Delegate호출되면은
UpdateCharacterStat함수가 호출이 되어서
이런식으로 맞을 때마다 CharacterStat의 GetHPRatio값을 바로 구할 수 있는 것이다.
NPC가 죽으면 NPC가 가지고있는 경험치를 Player에게 줄 것이고,
캐릭터가 사망할 때 NPC한테 죽는지 검사도 해야한다.
데미지 프레임워크에서 PlayerController의 정보는 가해자(Insigator) 인자로 전달이 된다.
NPC가 죽을 경우 마지막으로 대미지를 입힌 컨트롤러의 기록이 남는데 이게 LastHitBy 속성에 저장이된다.
이전에 구현한 경험치의 경우 대미지를 입을 때마다 Instigator를 검사를 했는데 이거보다 소멸될 때 LastHitby를 사용하는것이 더 효율적이기는 하지만
학습을 위해 두가지 방식 다 사용할 것이다.