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에 올리도록 하겠다.