Make Unreal REAL.
article thumbnail
ARAG (A Really Awesome Game) Commit 76686

 

이번 작업 결과는 다음과 같다.

[무기]

  • 상속을 통해 기본 무기 시스템 구현
  • 무기의 장착, 해제, 공격 구현
  • 활, 검 무기 추가

 

 

이번 작업에서 느낀 점 👨‍💻👨‍💻👨‍💻
  • 상속을 통해 베이스 클래스만 잘 만들어두면, 나중에 활용하기가 매우 편리하다.
  • 어떤 클래스를 설계할 때 각 함수나 멤버 변수의 역할을 명확하게 하여 추상화하는 것이 중요한 것 같다.
  • 델리게이트를 사용하면 다른 클래스 간 디커플링을 할 수 있지만, 사소한 부분에까지 남발할 필요는 없는 것 같다.
  • Enhanced Input은 런타임 도중 Input Mapping Context를 교체하는 것만으로도 쉽게 입력을 변경할 수 있어 정말 유용한 것 같다.

 

이번 작업과 관련된 주요 구현 내용 다음과 같다.

 

 

현재 무기 시스템 구성은 다음과 같다.

 

 

무기를 포함한 전투에 관련된 것들은 전투 컴포넌트(Combat Component)를 캐릭터에 붙여 관리한다.

 

 

전투 컴포넌트(Combat Component)는 현재 장착한 무기 정보를 저장한다.

 

 

무기 베이스(WeaponBase) 클래스는 다음과 같은 멤버들을 갖는다.

  • 무기별 애니메이션 몽타주
  • Input Mapping Context
  • 장착 위치
  • 공격력
  • 애님 노티파이 시에 호출될 함수
  • 사용자 입력에 반응할 함수

 

 

무기(WeaponBase) 장착 시에는 다음과 같은 동작들을 한다.

  • 소유자 설정
  • 애니메이션 몽타주의 각 애님 노티파이에 호출할 함수 바인딩
  • Input Mapping Context 추가
  • 무기 장착 델리게이트 발동

 

 

무기(WeaponBase)에 애니메이션이 존재하는 경우도 있어, WeaponBase 클래스를 상속 받은 WeaponSkeletalBase, WeaponStaticBase 클래스로 나누었다.

  • 구현부에 매번 Skeletal인지 Static인지 검사하여 별도의 로직을 실행하는 것보다는, 그냥 나누는 게 낫겠다고 판단했다.

 

 

활(Bow) 클래스는 WeaponBase - WeaponSkeletalBase 클래스를 상속 받은 클래스다.

 

활 클래스는 다음과 같은 멤버들을 갖는다.

  • 무기 장착 시 캐릭터에 붙일 화살집 컴포넌트(Static Mesh Component 상속)의 종류와 위치
  • 공격 시에 캐릭터에 화살을 붙일 위치
  • 잡고 있는 화살의 정보

 

 

활(Bow) 무기 장착 시에 캐릭터의 등 부분에 붙는 화살집(Static Mesh Compoenent 상속) 컴포넌트이다.

 

화살집(Quiver Component) 컴포넌트는 다음과 같은 정보들을 갖는다.

  • 현재 화살 개수
  • 현재 화살 액터 배열(오브젝트 풀과 유사하게 동작)
  • 화살집에서 화살을 빼고, 넣는 함수

 

 

활(Bow) 무기로 공격 시 화살집(Quvier Component)에서 빼어 쏘는 화살(Arrow) 클래스다.

 

Projectile Movement Component는 통해 날리며, Auto Activate를 꺼두었다가 공격 시에 방향을 정하고 컴포넌트를 활성화시켜 날리게 된다.

 

 

활(Bow) 무기 장착 시 캐릭터에 화살집(Quiver Component)를 붙여 화살을 관리하고, 장착 해제 시에 컴포넌트를 제거한다.

 

 

활(Bow) 장착 시 좌클릭을 누르게 되면, 애니메이션 몽타주에서 해당 애니메이션이 재생되면서 조준 자세가 된다.

  • 몽타주 상의 애님 노티파이에 의해 AttackStart() 함수가 호출되어 화살집(Quiver Component)에서 화살을 1개 꺼낸다.

 

좌클릭을 떼면, 애니메이션 몽타주에서 해당 발사 애니메이션이 재생된다.

  • 몽타주 상의 애님 노티파이에 의해 Attack() 함수가 호출되어 손에 있는 화살을 날린다.

 

 

무기의 Input Mapping Context에 등록된 입력에 반응하여 위처럼 애니메이션이 재생되면, 애님 노티파이를 통해 아래 함수들이 호출된다.

 

 

활(Bow) 무기와 같은 방식으로 검(Sword) 무기도 상속을 통해 구현되어 있다.

 

 

애님 인스턴스는 다음과 같은 멤버들을 갖는다.

  • 애니메이션 몽타주 관련 래퍼 함수
  • 현재 섹션 관리
  • 각 입력에 대응하는 재생 섹션 이름 가져오기
  • 애님 노티파이 함수 선언

 

 

개발 도중 마주했던 문제들 👇👇👇

 

GAS를 공부하는 데 시간이 좀 걸릴 것 같아서, 우선은 GAS의 Gameplay Ability를 사용하지 않고 구현했다.

개발하는 동안 틈틈이 공부하고 나중에 변경하는 게 좋겠다는 생각이 들었다.

 

활(Bow)로 화살을 쏘는데 제대로 직선으로 날아가지 않고, 자꾸 빙글빙글 돌면서 이상한 방향으로 날아가는 문제가 있었다.

Projectile Movement Component는 활성화된 시점부터 Tick이 작동해, 이미 화살집에 생성되어 있는 화살은 Velocity만 설정해 준다고 해서 정상적으로 날아가지 않았다.

Auto Activate를 끄고 날리는 시점에 Activate() 함수를 실행해주니 정상적으로 직선으로 날아가게 됐다.
- 또, 캐릭터의 손에서 화살을 Detach해주는 걸 깜빡하기도 했다..

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그