Make Unreal REAL.
article thumbnail
Unreal Engine 5 C++ Multiplayer Shooter

 

캐릭터에서 전투 관련 기능을 관리하기 위해 새로운 액터 컴포넌트를 생성한다.

 

당장은 Tick 기능을 사용하지 않을 것이므로 꺼준다.

 


캐릭터에 액터 컴포넌트를 추가한다.

 


액터 컴포넌트의 리플리케이션은 변수와는 다른 방식으로 지정한다.

  • 컴포넌트를 소유한 Actor는 복제된 상태여야 한다.
  • UActorComponent::SetIsReplicated() 함수에 true를 전달한다.
    액터의 생성자에서 호출하면 그 액터에서만 복제하겠다는 뜻이고, 컴포넌트 자체의 생성자에서 호출하면 항상 복제된 컴포넌트로 사용하겠다는 뜻이다.
  • UPROPERTY(Replicated) 매크로, GetLifetimeReplicatedProps() 함수에 등록 등은 하지 않는다.

 


Equip 액션에 E 키를 매핑하고 함수를 바인딩했다.

 


서버, 클라이언트 어디서든 E 키를 누르면 무기를 장착할 수 있어야 한다.

  • 단, 처리는 권한이 있는 서버에서만 수행해야 한다.


버튼 함수에서 무기를 장착할 수 있도록 Combat 컴포넌트에서 함수를 제공해야 한다.

 

클래스 전방 선언은 가장 첫 번째 사용될 때만 해주면 된다.

  • 따라서, 헤더 아래 부분에 먼저 선언해줘도 된다.

 


Combat 컴포넌트를 캡슐화하고 싶지만, 캐릭터 클래스와 Combat 컴포넌트는 의존성을 떼어내기 어렵고 밀접하게 연결될 수 밖에 없다.

서로의 변수와 함수에 접근해야하기 때문에 캐릭터 클래스를 Combat 컴포넌트의 friend 클래스로 만들어, 캐릭터 클래스가 Combat 컴포넌트의 내부에 접근할 수 있도록 한다.

  • Combat 컴포넌트는 캐릭터 클래스를 위해 특별히 제작된 클래스이기에 괜찮다.

 


액터의 컴포넌트 초기화가 완료되었을 때 호출되는 AActor::PostInitializeComponents() 함수를 오버라이드한다.


캐릭터 클래스를 Combat 컴포넌트의 friend 클래스로 선언했기 때문에 직접 접근할 수 있다.

 


무기 장착 함수 EquipWeapon()을 구현하기 전에 캐릭터의 Skeleton에 소켓을 추가해야 한다.

  • hand_r Bone의 하위에 무기를 붙일 RightHandSocket 소켓을 추가한다.

 

 

소켓에 프리뷰 에셋으로 총을 추가해 위치와 회전을 조정하여 확인한다.

  • 소켓에 추가한 프리뷰 에셋은 애니메이션에서도 보인다.

 

 

무기에는 상태가 존재하는데 현재 변경할 방법이 없으므로 Setter를 제공한다.

 

 

헤더를 추가한다.

 

 

EquipWeapon() 함수를 구현한다.

 

USkeletalMeshSocket::AttachActor() 함수로 액터를 Skeletal Mesh 소켓에 붙일 수 있다.


현재 캐릭터에는 제어 중인 소유자가 존재하지만, 무기에는 소유자가 존재하지 않는다.

  • 멀티 플레이어에서는 소유자가 중요하므로, AActor::SetOwner() 함수를 통해 무기의 소유자를 캐릭터로 지정해준다.

 

 

캐릭터의 E 버튼에 바인딩된 함수에서 무기 장착 함수를 실행한다.

  • 서버, 클라이언트 어디서든 E 키를 누르면 무기를 장착할 수 있어야 한다.
  • 단, 처리는 권한이 있는 서버에서만 수행해야 한다.

 

 

Listen 서버에서 무기에 다가가 E 키를 누르면 무기가 장착되고, 다른 클라이언트에서도 보인다.

 

 

그런데, 클라이언트에서는 E 키를 눌러도 무기가 장착되지 않는다.

 

 

EquipButtonPressed() 함수에서 HasAuthority()가 true인(서버에 있는 캐릭터인) 경우에만 무기 장착 함수를 실행하기 때문이다.

 

사용자 입력은 네트워크를 통해 복제되지 않기 때문에, 클라이언트에서 E 키를 눌러도 서버에서도 아무 일도 일어나지 않는다.

 

'Unreal Engine > UE5 C++ Multiplayer Shooter' 카테고리의 다른 글

무기 장착 애니메이션 동기화  (0) 2023.04.05
RPC (Remote Procedure Call)  (0) 2023.04.04
RepNotify  (0) 2023.04.03
변수 리플리케이션  (0) 2023.04.03
무기 획득 위젯 띄우기  (0) 2023.04.02
profile

Make Unreal REAL.

@diesuki4

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

검색 태그