Make Unreal REAL.
article thumbnail
Advanced Unreal Engine 5 Multiplayer Gameplay Programming

 

이번에는 월드에 실체화시킬 아이템 액터를 만들어 본다.

  • ActionGameTypes.h 헤더에 아이템의 상태를 저장하는 열거형을 선언한다.

 

 

월드에서 아이템의 실물을 담당할 ItemActor C++ 클래스를 생성한다.

 

 

필요한 헤더 포함과 클래스 전방 선언을 해준 후, 함수들을 선언해준다.

 

월드에 실체화 될 아이템 액터가 구현해야 하는 콜백 함수들과 초기화 함수, 리플리케이션에 필요한 함수들을 선언한다.

  • Equip / Unequip: 인벤토리에 존재하는 상태에서 장착과 해제만 한다.
  • Drop: 인벤토리에서 제거한 후 월드에 실체화시켜 버려버린다.

 

 

아이템 실물에 필요한 변수들을 선언한다.

  • 아이템 정적 데이터
  • 메모리 상의 아이템 객체
    (총알 개수 등을 유지하기 위함이다.)
  • 실물 아이템의 상태
  • 겹침 판정을 위한 구 컴포넌트

 

 

필요한 헤더를 포함하고 생성자에서 리플리케이션과 구 컴포넌트를 설정한다.

 


우선 리플리케이션 관련 함수들부터 구현해준다.

  • ItemActor는 이미 복제되고 있으므로, ReplicateSubobjects() 함수에서는 ItemActor가 아닌 ItemInstance 서브오브젝트를 복제해준다.

 

 

실물 아이템의 상태가 변해 복제될 때, 상태에 따라 구 컴포넌트의 충돌 설정을 변경해준다.

 


초기화 시, 총알 개수 등이 저장되어 있는 메모리 상의 아이템 객체를 저장하도록 한다.

 

Equip / Unequip은 인벤토리에 존재하는 상태에서 장착과 해제만 하는 동작이다.

 


Drop은 인벤토리에서 아예 제거한 후 월드에 실체화시켜 버려버리는 작업이다.

 

여기서는 액터에서 아이템을 떼어내어 앞에 놓는 작업만 수행하도록 한다.

 

 

이미 월드에 배치된 상태로 게임을 시작하는 실물 아이템은, 메모리 상 아이템 객체가 존재하지 않으므로 생성해줘야 한다.

 

 

아이템의 정적 정보를 저장하는 ActionGameTypes.h 헤더의 Item Static Data 클래스에 아이템의 상태를 저장하는 열거형을 선언한다.

ItemInstance가 상황에 따라 월드에 아이템을 실체화할 수 있도록 UItemStaticData에 다음 정보를 추가한다.

  • 월드에 실체화 할 아이템 액터
  • 캐릭터에 붙일 소켓 이름
  • 장착 가능한지 여부

 

 

메모리 상의 아이템 객체를 의미하는 Inventory Item Instance 클래스에도 장착, 해제, 버리기 시 동작을 추가한다.

  • OnEquipped()는 멀티 플레이어를 고려해 소유자를 인자로 받도록 한다.
  • 일단은 아이템을 월드에 실체화시킨 후 캐릭터에 붙이고 떼는 작업만 하도록 한다.

 

실물 아이템이 아이템 객체를 저장하듯, 편의를 위해 아이템 객체도 실물 아이템을 저장하도록 한다.

 


필요한 헤더를 포함하고, bEquipped의 복제 시 동작은 우선 비워둔다.

 

OnRep_Equipped() 함수에 아이템 액터 스폰 로직을 작성하면 안 된다.

  • 서버만 액터를 스폰하도록 해야 하기 때문이다.
  • 여기서는 리플리케이션이 되지 않는 작업들에 대한 검증 같은 것들을 수행할 수 있다.

 


GetLifetimeReplicatedProps() 함수에 bEquipped, ItemActor 변수를 추가해준다.

 


메모리 상의 아이템 객체는 장착 시에, 정적 데이터로부터 실체화 시킬 아이템 객체 클래스 정보를 가져온다.

 

그리고 월드에 실체화시킨 후 초기화를 거쳐 캐릭터의 소켓에 아이템을 부착한다.

 

해제 시에는 단순히 실물 아이템을 파괴한다.

 

버리기 시에는 실물 아이템 Item Actor의 OnDropped() 함수를 통해, 캐릭터의 앞에 아이템을 떨어트린다.

 

 

인벤토리 컴포넌트에서는 실질적으로 장착, 해제, 버리기, 그리고 추가적으로 다음 아이템 장착 기능을 제공한다.

  • 장착의 경우, 전달 받은 아이템 객체를 바로 장착하는 기능도 제공한다.
  • BP에서도 함께 사용할 함수는 오버로딩을 사용할 수 없기 때문에 다른 이름으로 선언해야 한다.

 

인벤토리 컴포넌트에 현재 장착 중인 아이템 객체를 저장한다.

 

 

현재 장착 중인 무기를 의미하는 CurrentItem의 Getter를 구현한다.

 

 

GetLifetimeReplicatedProps() 함수에 CurrentItem 변수를 추가해준다.

 

 

장착 함수에서는 전달 받은 아이템 정적 정보 클래스나 아이템 객체를 이용해, 인벤토리에서 매칭되는 첫 번째 아이템을 장착한다.

  • 아이템 객체를 전달 받은 경우에는 굳이 검사를 안 해도 된다.

 

 

다음 아이템 장착 함수에서는 현재 아이템을 해재하고, 인벤토리에서 현재 아이템이 아닌 첫 번째 아이템을 장착하도록 구현한다.

 

 

해제 함수에서는 현재 장착 중인 아이템을 해제한다.

 

버리기 함수에서는 현재 장착 중인 아이템을 버린 후, 인벤토리(InventoryList)에서 제거한다.

 

 

이제 실물 아이템 액터 BP 클래스를 생성하고, 인벤토리에 기본 아이템을 추가해 정상적으로 장착 및 해제되는지 확인한다.

 


실물 아이템의 아이템 정적 데이터 클래스를 설정해준다.

 

 

Static Mesh 컴포넌트를 추가하고 크기와 임시 메시를 설정한 후 Collision Presets을 NoCollision으로 설정해준다.

 


실물 아이템 BP_TestItem의 아이템 정적 데이터 클래스인 TestItem에 방금 생성한 임시 실물 아이템 BP 클래스와 캐릭터에 붙일 소켓, 장착 가능 여부를 설정해준다.

 

 

현재 캐릭터의 인벤토리 컴포넌트에는 TestItem이 기본 아이템으로 들어 있다.

 

 

인벤토리 컴포넌트가 초기화될 때, 테스트를 위해 임시로 인벤토리의 첫 번째 아이템이 장착되도록 한다.

 

 

잘 장착됐다.

 

 

이번에는 버리는 기능도 테스트 해본다.

 

 

버리기도 잘 된다.

 


인벤토리 컴포넌트의 초기화 부분에 테스트용으로 임시로 추가했던 부분은 다시 지워준다.

 

profile

Make Unreal REAL.

@diesuki4

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

검색 태그