언리얼 엔진5 Advanced - 캐릭터 공격 구현

타입·2025년 4월 4일
0

언리얼 강의

목록 보기
31/47

캐릭터 공격 구현

캐릭터 공격 플로우

액터와 애님 인스턴스간에 수행되는 캐릭터의 공격 플로우 (스탠드얼론)

네트워크 멀티플레이의 구현을 위한 4원칙

  1. 클라이언트의 명령은 Server RPC를 사용한다.
  2. 중요한 게임 플레이 판정은 서버에서 처리한다.
  3. 게임 플레이에 영향을 주는 중요한 정보는 프로퍼티 리플리케이션을 사용한다.
  4. 클라이언트의 시각적인 효과(Cosmetic)는 Client RPC와 Multicast RPC를 사용한다.

네트워크 멀티플레이를 위한 공격 기능 구현 기획

입력 명령을 전달한 이후에는 모두 서버에서 처리하도록 설계

액터 컴포넌트 리플리케이션

언리얼에서 리플리케이션의 주체는 액터

액터가 소유하는 언리얼 오브젝트에 대해 리플리케이션 진행이 가능
이를 통틀어 서브오브젝트(Subobject)라고도 함

스탯을 관리하는 액터 컴포넌트의 리플리케이션 설정

  • 리플리케이션을 지정: SetIsReplicated(true)
  • 리플리케이션이 준비되면 호출되는 이벤트 함수: ReadyForReplication()

  • 클라이언트 접속 로그
    ReadyForReplication() 호출 시점 분석
LogABNetwork: [SERVER][ROLE_Authority/ROLE_None] AABPlayerController::PostInitializeComponents Begin BP_ABPlayerController_C_1
LogABNetwork: [SERVER][ROLE_Authority/ROLE_None] AABPlayerController::PostInitializeComponents End
LogABNetwork: [SERVER][ROLE_Authority/ROLE_None] AABPlayerController::BeginPlay Begin
LogABNetwork: [SERVER][ROLE_Authority/ROLE_None] AABPlayerController::BeginPlay End
LogABNetwork: [SERVER][ROLE_Authority/ROLE_SimulatedProxy] UABCharacterStatComponent::ReadyForReplication Begin
LogABNetwork: [SERVER][ROLE_Authority/ROLE_SimulatedProxy] AABCharacterPlayer::BeginPlay Begin
LogABNetwork: [SERVER][ROLE_Authority/ROLE_SimulatedProxy] UABCharacterStatComponent::BeginPlay Begin
LogABNetwork: [SERVER][ROLE_Authority/ROLE_AutonomousProxy] AABPlayerController::OnPossess Begin BP_ABPlayerController_C_1
LogABNetwork: [SERVER][ROLE_Authority/ROLE_SimulatedProxy] AABCharacterPlayer::PossessedBy Begin ABCharacterPlayer_1
LogABNetwork: [SERVER][ROLE_Authority/ROLE_SimulatedProxy] AABCharacterPlayer::PossessedBy No Owner
LogABNetwork: [SERVER][ROLE_Authority/ROLE_AutonomousProxy] AABCharacterPlayer::PossessedBy Owner : BP_ABPlayerController_C_1
LogABNetwork: [SERVER][ROLE_Authority/ROLE_AutonomousProxy] AABCharacterPlayer::PossessedBy End ABCharacterPlayer_1
LogABNetwork: [SERVER][ROLE_Authority/ROLE_AutonomousProxy] AABPlayerController::OnPossess End
// 클라이언트 로그 시작
LogABNetwork: [CLIENT1][ROLE_None/ROLE_Authority] AABPlayerController::PostInitializeComponents Begin BP_ABPlayerController_C_0
LogABNetwork: [CLIENT1][ROLE_None/ROLE_Authority] AABPlayerController::PostInitializeComponents End
// 네트워크로부터 전달받은 데이터 처리
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABPlayerController::PostNetInit Begin BP_ABPlayerController_C_0
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABPlayerController::PostNetInit Server Connection : IpConnection_0
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABPlayerController::PostNetInit End
// 오너 변경
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABCharacterPlayer::OnRep_Owner Begin ABCharacterPlayer_0
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABCharacterPlayer::OnRep_Owner Owner : BP_ABPlayerController_C_0
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABCharacterPlayer::OnRep_Owner End ABCharacterPlayer_0
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABCharacterPlayer::PostNetInit Begin ABCharacterPlayer_0
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABCharacterPlayer::PostNetInit End
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] AABGameState::OnRep_ReplicatedHasBegunPlay Begin
// 컨트롤러의 BeginPlay() 호출
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABPlayerController::BeginPlay Begin
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABPlayerController::BeginPlay End
// ReadyForReplication() 호출!
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] UABCharacterStatComponent::ReadyForReplication Begin
// 이후 플레이어의 BeginPlay() 호출
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] AABCharacterPlayer::BeginPlay Begin
LogABNetwork: [CLIENT1][ROLE_AutonomousProxy/ROLE_Authority] UABCharacterStatComponent::BeginPlay Begin
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] AABGameState::OnRep_ReplicatedHasBegunPlay End
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] AABCharacterPlayer::PostNetInit Begin ABCharacterPlayer_1
// ReadyForReplication() 호출!
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] UABCharacterStatComponent::ReadyForReplication Begin
// 이후 플레이어의 BeginPlay() 호출
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] AABCharacterPlayer::BeginPlay Begin
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] UABCharacterStatComponent::BeginPlay Begin
LogABNetwork: [CLIENT1][ROLE_SimulatedProxy/ROLE_Authority] AABCharacterPlayer::PostNetInit End

실습코드

https://github.com/dnjfs/ArenaBattle_Network/commit/d5493c3ea5862016bd8363b52589935fb2bff44a

  • 네트워크 기반 캐릭터 공격 구현
    캐릭터 공격 입력 시 Server RPC 호출하여 공격 처리
    이후 Multicast RPC 호출하여 프로퍼티 리플리케이션 및 애니메이션 재생

  • 캐릭터 체력 동기화
    SetIsReplicated() 세팅하여 액터 컴포넌트의 리플리케이션 준비
    동기화 처리는 프로퍼티 리플리케이션 활용

profile
주니어 언리얼 프로그래머

0개의 댓글