스킬 시스템 설계하기

seunghyun·2024년 4월 25일
0

ProjectGO

목록 보기
1/7

아이디어


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만 하면 된다


Skills, SkillSlot 의 필요성

  • 발단

    • RPC 함수의 파라미터로 UObject에 대한 포인터를 사용했는데, 이렇게 했을 때 파라미터 CurrentSkill 값이 nullptr 이다.
      void *ClientRPCPlaySkillAnim*(AGOPlayerCharacter* CharacterToPlay, **UGOSkillBase* CurrentSkill**);
      
      OtherPlayer->*ClientRPCPlaySkillAnim*(this, **CurrentSkill**);
  • 원인
    • 리플리케이션은 AActor 부터 지원되기 때문이다.
    • 액터 아이디..! 는 엔진이 해준다
    • 참고 자료 GameDevStory 3. Don’t Send UObject as Data Container via RPC!
    • 그래서 원래는 캐릭터가 시전하는 스킬이 어떤 스킬인지를 네트워크로 동기화하는 것을 아래 코드처럼 구현하려고 했었는데, 이런 코드는 못 쓸 것이다. 아래 코드에서 UGOSkillBase 객체는 UObject 를 상속받는 객체이다. 그래서 UGOSkillBase를 네트워크를 통해 전달한다면 InSkill 에는 nullptr 가 들어있을 것이다.
      void AGOCharacter::ServerRPCSetCharacterSkill
      			(
      				AGOCharacter* InCharacter, 
      				UGOSkillBase* InSkill // UObject 파라미터
      			)
      {
      	InCharacter->SetMySkill(InSkill);
      }
    • 그래서 ‘어떤 스킬을 시전했다’ 라는 것을 리플리케이트해야 할 것 같다.
      • ‘몇 번 스킬을 시전했다’ 라는 느낌으로 만들어야할까?
      • UObject가 아닌 식별자(데이터)를 전달하기?
      • +) 캐릭터가 TArray<UGOSkillBase*> SkillSlot 이라는 배열을 가지게 할까? 라고도 생각 중인데, 이를 활용할 수 있을지? 좋은 방법일지?
        • 이 배열을 만들면 앞으로 유용할 때가 많을 것 같다. 예를 들어 스킬 UI와 바인딩할 때 (예: HUD 속 스킬 슬롯에 뿌려줄 스킬 썸네일 이미지를 초기화해줄 때 SkillSlot 배열을 순회해서 촤라ㅏ락 세팅되도록 하기) 그리고 스킬 인스턴스 초기화를 할 때에도 배열을 순회하여 촤라락 세팅하기 등등 ..
  • +) 추가: 배열 대신 '스킬을 관리하는 것'을 만들어서 구현하였다.

0개의 댓글

관련 채용 정보