Unreal Engine
-
4 principles for network multiplayUnreal Engine 2024. 4. 23. 16:30
1. 클라이언트의 명령은 Server RPC를 사용한다. 2. 중요한 게임 플레이 판정은 서버에서 처리한다. 3. 게임 플레이에 영향을 주는 중요한 정보는 프로퍼티 리플리케이션을 사용한다. - 네트워크 지연 등의 이유로 클라이언트의 연결이 끊어졌다가 다시 연결된 상황에서 Multicast RPC를 사용한다면 복제가 안 됨 4. 클라이언트의 시각적인 효과(Cosmetic)는 Client RPC와 Multicast RPC를 사용한다 - 굳이 서버에서 보여 주고 리플리케이트할 이유가 없음
-
Unreal RPCUnreal Engine 2024. 4. 21. 17:36
청록 - 클라이언트에서 실행 보라 - 서버에서 실행 주황 - 오너십과 무관하게 연관성으로 동작 1. 서버에서 RPC를 호출하는 경우 (1) 언리얼은 서버가 모든 권한을 가지기 때문에 어떤 경우에서도 모두 호출이 되지만, 바람직하지는 않음 (2) 서버가 소유하지 않는 액터에서 서버 RPC를 사용하면 서버는 RPC 구현부의 _Implementation 함수를 호출하지만, 이것은 원하는 플로우가 아님 (3) 서버가 소유하지 않는 액터에서 클라이언트 RPC를 사용하면 서버는 RPC 구현부의 _Implementation 함수를 호출하지만, 전달한 클라이언트는 없기 때문에 의도와 다르게 동작함 (4) 서버에서 서버 RPC나 클라이언트 RPC를 사용할 경우 해당 액터가 오너십을 가지는지 살펴보는 것이 중요함 (5) ..
-
Actor Priority & Dormancy(휴면)Unreal Engine 2024. 4. 20. 22:03
Actor Priority 클라이언트에 보내는 대역폭(NetBandwidth)은 한정되어 있으므로, 클라이언트에 보낼 액터 중 우선권이 높은 액터의 데이터를 우선 전달하도록 설계함 마지막으로 패킷을 보낸 후의 경과 시간과 최초 우선권 값을 곱해 최종 우선권 값을 생성함 네트워크가 포화(Saturation)될 때까지 우선권에 따라 정렬된 순서대로 리플리케이션을 수행하며, 포화 시 해당 액터는 다음 서버 틱로 넘김 AActor의 GetNetPriority()에 로직이 구현되어 있음. 네트워크 부하를 막는 방법 Actor Dormancy 액터가 휴면 상태라면 연관성이 있더라도 액터 리플리케이션을 수행하지 않음 FlushNetDormancy() 함수를 통해 액터를 깨울 수 있음 조건식 프로퍼티 리플리케이션 사용..
-
Actor Replication's RelevancyUnreal Engine 2024. 4. 20. 21:06
연관성이란, 서버의 관점에서 현재 액터가 클라이언트의 커넥션에 관련된 액터인지 확인하는 작업 언리얼 엔진의 액터 연관성 및 우선권 액터 연관성 및 우선권 관련 정보입니다. dev.epicgames.com 뷰어: 클라이언트의 커넥션을 담당하는 플레이어 컨트롤러 뷰 타겟: 플레이어 컨트롤러가 빙의한 폰 가해자: 나에게 대미지를 가한 액터 오너: 액터를 소유하는 액터. 즉, 최상단의 소유 액터 NetUseOwnerRelevancy 부연설명: 시야에 안 보이는 장치가 있고, 이 장치에 부착된 무기의 경우, 무기를 소유하고 있는 장치에 대해 연관성을 판별함 NetCullDistanceSquared: 기본값이 2억 2500만 제곱 미터로 설정되어 있음 IsRelevantFor() 함수로 연관성을 확인할 수 있음 아..
-
Actor Replication Frequency & InterpolationUnreal Engine 2024. 4. 20. 16:52
NetUpdateFrequency: 리플리케이션 빈도의 최대치를 설정함 - 1초당 몇 번 리플리케이션을 시도할지 지정한 값 - 기본 값은 100이며, 이론적으로 서버는 0.01초 간격으로 리플리케이션을 시도함 - 다만, 이는 최대치일 뿐 이를 보장하지 않으며 서버의 성능으로 복제됨 리플리케이션 빈도를 줄이고, 서버에서 데이터를 받지 않는 공백에 움직임을 보간하는 작업을 추가하면 부드러운 움직임을 낼 수 있음. public: float RotationRate = 30.0f; float ClientTimeSinceUpdate = 0.0f; // 서버로부터 패킷을 받은 후 지난 시간 float ClientTimeBetweenLastUpdate = 0.0f; // 서버로부터 패킷을 받은 후 다음 패킷을 받을 때..