본문 바로가기

게임 개발 공부/언리얼엔진

UE5 | C++ 개발 - TMap을 활용한 무기 스왑

무기 스왑을 구현해야했다.

처음엔 팀원분이 TSubclassOf 를 이용해 무기클래스별 컴포넌트를 구현해주셔서 스왑자체는 간편하게 구현이 가능했다.

그러나 문제가 발생했다. 스왑할때마다 탄알 정보가 초기화됐다. 그래서 게임인스턴스에 정보를 저장하는 방법을 구현해보고자 했지만, TSubclassOf는 클래스유형을 저장할 뿐 인스턴스를 생성하는 것이 아니기 때문에 멤버변수값을 가져올 수가 없었다.

그래서 액터는 따로 생성해놓고 변수 변화를 해당 액터에 저장하면서 값을 불러올까 했지만, 그것도 뭔가 한다리를 더 거치는 느낌이라 내키지 않았다. 결국 TSubclassOf 를 포기하고 새로 작성하기로 했다.

 

어떤 방법이 좋을까 구상해보다 처음엔 액터를 매번 가져다 붙이는 방법을 생각했다.

무기 소켓과 무기별 주머니소켓을 따로 만들어서 매번 어태치와 디태치를 반복하는 방법이다.

그러기 위해선 무기를 수납할때마다 디태치 후 무기의 클래스를 읽어서 전용 소켓에 다시 어태치를 해야한다.

작성하진 않았지만 꽤 비효율적으로 느껴졌다.

 

그러다 그냥 단순하게 생각해서 모든 무기를 손에 붙여놓고 Visibility를 조정하면 어떨까하는 생각을 했다.

왠지 가능할 것같았다.

 

컴포넌트 선언
컴포넌트 정의
장착 함수 구현. 무기마다 반복해줘야한다.
캐릭터 블루프린트에서 할당해준다.

무기교체는 구현이 됐지만, 아직 뭔가 부족하게 느껴졌다.

함수반복이 생기고, 확장성도 부족해 보였다. 보완책으로 열거형을 사용하는게 좋을 것 같았다.

TMap선언
초기 슬롯 등록
코드 정리

이제 무기 스왑도 구현되고 무기가 추가되면 Map에 추가해주면 되기에 확장성도 확보되었다.