MOBA 장르 게임의 스킬 시스템을 구현하기 앞서 구글링을 하던 중 아래 링크를 쭉 읽어보았다. https://forums.unrealengine.com/t/moba-like-ability-skill-system/40787/4
이 링크에서 추천해준 링크가 아래 Reddit 링크인데,
https://www.reddit.com/r/gamedev/comments/1bm5xs/programmers_how_dowould_you_implement_a/
이 Reddit에서 MattRix의 답변을 참고해서 만들고 있다.
캐릭터가 사용하는 모든 스킬은 ActorComponent를 상속받는 SkillCastComponent에 장전되고 이 컴포넌트가 스킬을 장전하고 발사하는 역할을 한다.
컴포넌트이므로 누구에게나 장착시켜줄 수 있다는 면에서 재활용성이 높다.
비유하자면 캐릭터, 총, 총알을 모두 따로 만드는 설계인 것이다. 기획의 변경에도 용이한 설계가 될 수 있다.
- 캐릭터한테 총을 붙여주고
- 캐릭터에게 총알을 장전시켜서
- 총을 쏘게 만들면 된다
Attack 이라는 건 weapon이 잇는지를 검사. weapon이 있으면 fire 실행만 하면된다. weapon이 뭔진 몰?루
몽둥이의 fire, 총의 fire ... 캐릭터는 fire만 하면 된다
발단
UObject
에 대한 포인터를 사용했는데, 이렇게 했을 때 파라미터 CurrentSkill 값이 nullptr
이다.void *ClientRPCPlaySkillAnim*(AGOPlayerCharacter* CharacterToPlay, **UGOSkillBase* CurrentSkill**);
OtherPlayer->*ClientRPCPlaySkillAnim*(this, **CurrentSkill**);
AActor
부터 지원되기 때문이다.UGOSkillBase
객체는 UObject
를 상속받는 객체이다. 그래서 UGOSkillBase
를 네트워크를 통해 전달한다면 InSkill
에는 nullptr
가 들어있을 것이다.void AGOCharacter::ServerRPCSetCharacterSkill
(
AGOCharacter* InCharacter,
UGOSkillBase* InSkill // UObject 파라미터
)
{
InCharacter->SetMySkill(InSkill);
}
UObject
가 아닌 식별자(데이터)를 전달하기?TArray<UGOSkillBase*> SkillSlot
이라는 배열을 가지게 할까? 라고도 생각 중인데, 이를 활용할 수 있을지? 좋은 방법일지?SkillSlot
배열을 순회해서 촤라ㅏ락 세팅되도록 하기) 그리고 스킬 인스턴스 초기화를 할 때에도 배열을 순회하여 촤라락 세팅하기 등등 ..