[UE5] Enemy AI 원거리 공격을 위한 서버 데이터 기반 Projectile Manager 구현 - 3
2026. 6. 12. 21:07ㆍ구현
구현 4단계: Client RPC로 시각 투사체 Actor 로컬 생성
- 서버가 ProjectileId 발급
- 각 플레이어 소유의 Proxy Actor 생성
- Proxy를 통한 생성/종료 Reliable RPC
- 클라이언트에서 충돌 없는 단순 Mesh Actor 표시
- 서버 시간으로 현재 위치 계산
- 중도 입장자는 현재 활성 투사체를 전달받음
// 구현 흐름
ProjectileType의 추가/생성된 데이터
- ServerProjectileData: 투사체 식별 번호, 최초 투사체 위치, 서버 기준 투사체 발사 시각
- ProjectileSpawnEvent: 서버가 클라이언트에 전달하는 시각 투사체 생성 정보
- ProjectileEndEvent: 투사체 충돌/수명 종료를 알리는 투사체 식별 정보
ProjectileVisual Actor 생성
- 시각 투사체 오브젝트 및 이동 기능
ProjectileVisualManagerComponent ActorComponent 생성
- 생성 이벤트를 받아 로컬에 시각 투사체 생성
- 서버 시간을 기준으로 매 프레임 예상 위치 갱신
- 종료 이벤트나 최대 수명에 따라 시각 투사체 제거
ProjectileReplicationProxy Actor 생성
1. 서버가 플레이어별 ProjectileReplicationProxy 생성
2. bReplicates = true로 해당 Proxy를 클라이언트에 복제
3. bOnlyRelevantToOwner = true로 소유 클라이언트에만 복제
4. 서버가 Proxy의 Client RPC 호출
5. 해당 Proxy를 소유한 클라이언트에서 RPC 실행
6. VisualManager가 복제되지 않는 시각 투사체를 로컬 생성
ProjectileManagerComponent 수정
- FireProjectile(): AllocateProjectileId()로 식별 ID 만들어 넣고 BroadcastSpawnEvent() 호출 추가
- TickComponent(): 투사체 제거 시 BroadcastEndEvent() 호출 추가
- RegisterReplicationProxy(): 플레이어 입장 시 Proxy 관리 목록에 등록해 현재 날아가고 있는 투사체 정보를 보여줌
- UnregisterReplicationProxy(): 플레이어 퇴장 시 Proxy 목록에서 제거해 불필요한 RPC 보내지 않음
- AllocateProjectileId(): 서버 투사체마다 식별 가능한 양수 ID 발급
- BroadcastSpawnEvent(): 관리 목록에 등록된 각 플레이어 Proxy에 시각 투사체 생성 이벤트 전달
- BroadcastEndEvent(): 관리 목록에 등록된 각 플레이어 Proxy에 시각 투사체 제거 이벤트 전달
RunGameMode 추가
- 플레이어 입장/퇴장 시 Proxy 생성/제거
CreateDefaultSubobject로 생성한 컴포넌트는 명칭이 변경될 때 설정 값이 초기화되므로 재설정이 필요하다.
구현 5단계: 클라이언트 시각 투사체 오브젝트 풀링
// 구현 흐름
ProjectileVisual
- 투사체 보임/숨김 지정
ProjectileVisualManagerComponent
- PrewarmPool(): 풀을 초기 크기만큼 미리 생성
- CreatePooledVisual(): 새로운 풀 전용 Visual Actor를 생성
- AcquireVisual(): 풀에서 Visual Actor 하나를 대여
- ReleaseVisual(): 사용이 끝난 Visual Actor를 풀에 반납

이게 무슨 일이고... 알고보니 투사체가 좀 더 많아지면 모를까 오브젝트 풀링 반영 전 후로 프레임 드랍 차이는 크지 않았다.
그보다 더 한 문제는 몬스터에서 나는 문제였는데, 몬스터가 스폰될 때 여러 몬스터가 같은 위치에 겹쳐 생성되고 서로를 Block하면서 CharacterMovementComponent가 매 프레임 밀어내기와 침투 해소를 하기 위해 프레임 드랍이 발생하는 것이었다.
그로 인해 처음 거점에서 프레임은 130fps였고 몬스터가 생성되자 50fps까지 떨어졌다.
일단 이 문제를 해소하기 위해 SpawnRadius를 1000으로 늘려 몬스터 간 스폰 간격을 넓혔다. 그리고 나서 측정했을 때 전체적으로 수치가 크게 줄었음을 확인할 수 있었다.

시각적으로 차이는 크게 없기에 영상 첨부는 별도로 하지 않는다.
'구현' 카테고리의 다른 글
| 26.06.26(금) (0) | 2026.06.26 |
|---|---|
| [UE5] Enemy AI 원거리 공격을 위한 서버 데이터 기반 Projectile Manager 구현 - 2 (0) | 2026.06.11 |
| [UE5] Enemy AI 원거리 공격을 위한 서버 데이터 기반 Projectile Manager 구현 - 1 (1) | 2026.06.10 |
| [UE5] FABRIK로 무기 소켓 기반 Left Hand IK 구현하기 (0) | 2026.06.09 |