UE5 C++教程(三、多人游戏网络基础)
目錄
1.客戶端-服務器模型
2.網絡模式
3.Replicate
4.遠程過程調用(RPC)
多人聯機需要在大量客戶端同步大量數據,怎樣傳輸用戶之間的數據十分重要,虛幻引擎中,在客戶端與服務器間同步數據和調用程序的過程被稱為?復制(Replication)?
參考了虛幻官方文檔-網絡概述:https://docs.unrealengine.com/5.0/zh-CN/networking-overview-for-unreal-engine/
1.客戶端-服務器模型
在網絡多人游戲中,虛幻引擎使用?客戶端-服務器?模型。網絡中的一臺計算機作為?服務器?主持多人游戲會話,而所有其他玩家的計算機作為?客戶端?連接到該服務器。然后,服務器與連接的客戶端分享游戲狀態信息,并提供一種客戶端之間通信的方法。
服務器作為游戲主機,保留一個真實?授權?的游戲狀態。換句話說,服務器是多人游戲實際發生的地方。客戶端會遠程控制其在服務器上各自擁有的?Pawn,發送過程調用以使其執行游戲操作。但服務器不會將視覺效果直接流送至客戶端顯示器。服務器會將游戲狀態信息?復制?到各客戶端,告知應存在的Actor、此類Actor的行為,以及不同變量應擁有的值。然后各客戶端使用此信息,對服務器上正在發生的情況進行高度模擬。
作為服務器的計算機處理所有游戲信息與邏輯,然后分發給所有客戶端進行渲染,例如:A,B,C通過網絡聯機,A想要操控屏幕上的角色撿起一把大寶劍,于是A操作了相應鍵盤和鼠標,這時,按鍵信息將傳遞給服務器,服務器再將信息傳遞給A,B,C,這樣A,B,C都能看見A控制的角色拿起一把大寶劍。
2.網絡模式
獨立(standalone):游戲作為服務器運行,不接受遠程客戶端連接
客戶端(client):游戲作為客戶端運行,不運行服務器邏輯
監聽服務器(listener-server):游戲玩家之一的計算機充當主持多人會話的服務器
專屬服務器(dedicated-server):一臺專用計算機充當服務器
擁有游戲副本的用戶均可啟動聆聽服務器并在同一計算機上運行,因此聆聽服務器對于用戶而言較易自發設置。支持聆聽服務器的游戲通常擁有游戲UI,用于啟動服務器或搜索要加入的服務器。但由于主持聆聽服務器的玩家會直接在服務器上游戲,因此比其他必須使用網絡連接方可游戲的玩家更具優勢,于是便導致了公平和作弊問題。
同時,要作為服務器運行,還需支持如圖形和音效等玩家相關系統,從而引發額外處理負載。此類因素導致聆聽服務器不適用于激烈的競技或網絡負載極高的游戲,但對于小型玩家群體間進行臨時合作和競技多人游戲而言,卻十分好用。
3.Replicate
?創建、銷毀和移動等常見功能會自動復制,但其他部分不會默認自動復制,需要手動定義
通過UPROPERTY宏可以定義變量為復制變量,將自動復制此變量
// 在類聲明中定義變量UPROPERTY( replicated )AActor * MyActor;接著還需定義GetLifetimeReplicatedProps函數
// 重寫父類虛函數 virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps)const override void MyClass::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const {DOREPLIFETIME(AActor, MyActor ); }別忘了將bReplicate設置為true(在構造函數和藍圖中設置)
bReplicates = true;4.遠程過程調用(RPC)
使用示例:?
ExampleClass.h
// 服務器RPC MyFunction的聲明。 UFUNCTION(Server, Reliable) void MyFunction(int myInt);ExampleClass.cpp
// 服務器RPC MyFunction的實現。 // 注意函數實現要在名字后面加_Implementation void AExampleClass::MyFunction_Implementation(int myInt) {// 此函數在RPC傳播后被調用// 游戲代碼在此。 }?RPC在服務器和客戶端的調用效果不同,具體如下
至于UFUNCTION()中還要加一個Reliable,我也不知道為啥qwq,虛幻官方這樣說
可靠性
必須將RPC指定為?可靠?或?不可靠。在藍圖中,函數和事件默認為不可靠。要將函數指定為可靠,將細節面板(Details Panel)中的?可靠(Reliable)?設置設為?true。在C++中,必須將?Reliable?或?Unreliable?說明符作為?Server、Client?或?NetMulticast?函數,添加到RPC的?UFUNCTION?宏及其狀態。
不可靠RPC無法保證必會到達預定目的地,但其發送速度和頻率高于可靠的RPC。其最適用于對gameplay而言不重要或經常調用的函數。例如,由于Actor移動每幀都可能變換,因此使用不可靠RPC復制該Actor移動。
可靠的RPC保證到達預定目的地,并在成功接收之前一直保留在隊列中。其最適合用于對gameplay很關鍵或者不經常調用的函數。相關例子包括碰撞事件、武器發射的開始或結束,或生成Actor。
UE5 C++原創教系列程隨緣更新中 ---
總結
以上是生活随笔為你收集整理的UE5 C++教程(三、多人游戏网络基础)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用WPS的Excel制作项目进度表
- 下一篇: mac 中的 zip 和 unzip 命