UE5 부트캠프(TIL)

[TIL]Intelligence팀 프로젝트 무기 구현

Yellow Kirin 2025. 7. 28. 21:21

오늘 팀 프로젝트를 하며, ‘총 만들기’가 의외로 쉽지 않다는 걸 깨달았다.
샷건, 라이플, 피스톨… 각 무기는 전혀 다른 성격과 메커니즘을 가진다.
이걸 “계층 구조”와 “추상화”로 어떻게 풀어낼 수 있을까? 경험담을 기록한다.


1. AItemBase – 모든 아이템의 뿌리

게임에는 무기만 있는 게 아니다.
치유 아이템, 퀘스트 아이템, 소모품 등도 전부 아이템의 일종이다.
“공통점”을 추상화해서 뿌리 클래스로 만든다.

  • 이름, 설명, 아이콘 등 모든 아이템의 공통 속성
  • 줍기, 사용 등의 함수 시그니처만 선언
반복되는 코드는 결국 공통 조상에게 준다.
이게 객체지향의 시작이다!

2. ATWeaponBase – 무기들의 공통 규약

ATWeaponBase는 모든 총기가 반드시 가져야 하는 것만 선언한다.

  • virtual void Fire(), virtual void Reload()
  • int32 MaxAmmo, Damage
  • EWeaponType WeaponType
모든 무기가 반드시 제공할 “인터페이스”를 설계한다.
“샷건이든, 라이플이든, 발사와 재장전은 해야 한다.”

3. 파생 클래스(ATShotgun, ATRifle) – 각 무기의 개성

여기서 상속의 마법이 시작된다.
각 무기마다 Fire, Reload를 오버라이드해서 자기만의 방식으로 동작시킨다.

  • 샷건 – 산탄 퍼짐, 강한 반동, 여러 발 동시에
  • 라이플 – 빠른 연사, 낮은 반동, 정확도
상속과 다형성 덕분에
CurrentWeapon->Fire() 한 줄로 무기 종류에 맞게 알아서 동작한다!

4. enum과 Cast – 무기의 정체성 코드화

현실에서 ‘샷건인지, 라이플인지’ 구별하는 것처럼,
코드에서도 EWeaponType enum이나 Cast<ATShotgun>(CurrentWeapon)으로 명확하게 타입을 구분한다.

  • enum은 확장/디버깅에 강하다
  • 캐스팅은 타입별 특별기능에 강하다

5. 오버랩, 컴포넌트, 그리고 설계의 디테일

메쉬와 콜라이더가 따로 움직이는 현상 때문에
SceneRoot를 루트로 잡고,
모든 컴포넌트를 그 밑에 두면 한 덩어리처럼 움직인다.
무기를 먹을 때 PickupCollider를 비활성화하는 이유도 직접 겪으며 배웠다.


6. 최종 구조와 느낌

아이템 → 무기 → (샷건, 라이플 등 파생)
이 계층 구조 덕분에
- 어떤 무기도 한 줄 코드로 관리 가능하고
- 신 무기도 단 1~2줄 추가만으로 끝!

반복을 줄이고, 확장을 쉽게 하며, 유지보수가 즐거운 코드를 짜자.
좋은 객체지향 설계란 이런 것이 아닐까?
오늘 무기 클래스를 만들며 진짜로 느꼈다.

마무리: 앞으로

게임의 모든 시스템에는 ‘공통점과 차이점’이 있다.
이걸 계층 구조로 정리하면
코드가 훨씬 견고해지고, 팀 전체가 더 빠르고 즐겁게 개발할 수 있다.

 

코드는 다음 TIL에 올리도록 하겠다.