Quantum Server API
外掛程式工廠
外掛程式工廠由 Photon Server 用於為個別房間實例化外掛程式程式碼。基礎 Photon Server 類別IPluginFactory2衍生自 Quantum 外掛程式工廠DeterministicPluginFactory。覆寫並實作CreateDeterministicPlugin()方法以實例化不同的外掛程式和/或伺服器物件。
C#
public override DeterministicPlugin CreateDeterministicPlugin(IPluginHost gameHost, String pluginName, Dictionary<String, String> config, ref String errorMsg)
基本結構
除了工廠之外,Quantum 伺服器外掛程式還包含兩個額外的可擴展的部分。
DeterministicPlugin建立在 Photon Server 的PluginBase類別之上。需要時可覆寫基礎類別的虛擬方法。當第一個客戶端進入時,外掛程式類別會為每個 Photon 房間實例化。
DeterministicServer在 Quantum 模擬啟動時實例化,並控制與 Quantum 伺服器模擬相關的所有線上方面(例如輸入、伺服器模擬等)。
日誌記錄
注意:伺服器日誌記錄容易導致大量無法使用的日誌,並可能迅速導致整個伺服器不穩定。
Quantum.Log會在實例化第一個外掛程式之前,使用名為Quantum的 Photon 外掛程式日誌記錄器靜態初始化。Quantum.Log 的除錯方法使用Conditional("DEBUG")屬性,僅在使用專案(Quantum 自訂伺服器)啟用此定義時才啟用。
自訂伺服器的日誌記錄可以透過調用DeterministicPlugin.LogInfo()、DeterministicPlugin.LogWarning(),或直接使用DeterministicPlugin.Logger來完成。此外,也可以使用IPluginHost.CreateLogger()建立新的 Photon 外掛程式日誌記錄器。
本機伺服器的日誌位於此資料夾:Photon.Server\deploy_win\log。GSGame.log是自訂外掛程式日誌的輸出位置。如需從 Photon 企業伺服器獲取日誌,請聯繫我們。
伺服器模擬
為了讓 Quantum 伺服器執行模擬,需要建立DeterministicServer物件並附加一個類型為IDeterministicSessionRunner的參數。與 Quantum 2 不同,啟動和更新模擬現在完全封裝。請查看 Unity 專案中的DotNetSessionRunner類別。
C#
var sessionRunner = new DotNetSessionRunner {
AssetSerializer = new QuantumJsonSerializer()
};
在執行伺服器模擬時,Quantum 的依賴項、模擬 DLL 和資產 必須 與客戶端建置同步。在 Unity 中執行同步流程(例如選擇QuantumDotnetBuildSettings資產)。
Unity SDK 中模擬建置所使用的依賴項 優先於 外掛程式 SDK 中Lib資料夾的檔案(例如 Quantum.Deterministic.dll、Quantum.Log.dll)。
當伺服器模擬拋出例外時,會在GSGame.log中記錄,模擬終止但 線上遊戲會繼續 執行。
需要Newtonsoft.Json套件的外部依賴項,該套件與Quantum.Json一起支援資產資料庫和 RuntimeConfig、RuntimePlayer 的反序列化。
Quantum資產資料庫
伺服器上必須有 Quantum 資產資料庫才能執行伺服器模擬。預設支援匯出的 Json 檔案。從 Unity 同步伺服器模擬時,會匯出並複製它到Photon.Server\deploy_win\Plugins\QuantumPlugin3.0\bin\assets\db.json。也可以透過 Unity 選單匯出:Tools > Quantum > Export > Asset Database。
可以透過使用自訂實作的IAssetSerializer來替換 Json 資產序列化。
嵌入式 Quantum 資產資料庫
可選地,匯出的資產檔案可以嵌入到Quantum.Simulation.dll中。
XML
<ItemGroup>
<EmbeddedResource Include="db.json" />
</ItemGroup>
EmbeddedDBFile配置屬性指向嵌入資源的名稱。始終在屬性前加上額外的Quantum.前綴。
外掛程式會先嘗試從外部檔案載入資產資料庫。如果找不到,則會嘗試從嵌入資源載入。
本機 Quantum 外掛程式配置
本機 Photon Server 的 Quantum 外掛程式配置值可以在Photon.Server\deploy_win\LoadBalancing\GameServer\bin\plugin.config檔案中找到。
預設的plugin.config包含一個外掛程式 XML 配置。根據需要更改或新增鍵值變數。
這些屬性會替換為 Photon 線上儀表板中特定 AppId 的鍵值設定。
XML
<root>
<PluginSettings Enabled="true">
<Plugins>
<Plugin
Name="QuantumPlugin3.0"
Version=""
AssemblyName="Quantum.Plugin.Custom.dll"
Type="Quantum.QuantumCustomPluginFactory"
PathToLUTFolder="assets/LUT"
PathToDBFile="assets/db.json"
EmbeddedDBFile="Quantum.db.json"
/>
</Plugins>
</PluginSettings>
</root>
資產路徑必須相對於Photon.Server\deploy\Plugins\DeterministicPlugin\bin。
升級外掛程式 SDK 時,不應覆蓋本機更改。
透過在 Plugin XML 節點中新增一行來新增屬性,鍵和值均為字串並按此解析。
XML
<Plugin
NewStringProperty="foo"
NewIntProperty="10"
/>
C#
if (config.TryGetString("NewStringProperty", out var newStringProperty, defaultValue: "default")) {
}
if (config.TryParseInt("NewIntProperty", out var newIntProperty, defaultValue: 0)) {
}
伺服器類別
DeterministicPluginFactory
預設的工廠,用於實例化 Quantum 伺服器外掛程式。
DeterministicPlugin
此類別是 Quantum 伺服器外掛程式的預設實作。
DeterministicServer
DeterministicServer 的實例在 Photon 房間內協調 Quantum 線上遊戲階段。
它提供了多種虛擬回調方法,以便掛接到伺服器流程中。
方法
OnDeterministicServerSetup
C#
void OnDeterministicServerSetup(IHost host, IEventSender eventSender, IWebhookHost webhookHost, Dictionary<string, string> config, ref Boolean runServerSimulation)
當建立 Realtime 房間時調用此方法。
config字典包含測試線上應用程式時在 Photon 儀表板中設定的配置,或測試本機 Photon Server 時在Photon.Server\deploy_win\LoadBalancing\GameServer\bin\plugin.config檔案中的配置。
為了方便使用,可以使用ConfigParsingExtensions來解析其他值。
範例:
C#
config.TryParseBool("WebHookEnableReplay", out var isReplayStreamingEnabled, false);
將runServerSimulation設為啟用或停用此會話的伺服器模擬。該布林值已由儀表板變數ServerSimulationEnabled和ServerSimulationPercent配置。只有在伺服器物件已使用IDeterministicSessionRunner建立時,模擬才會啟動。
OnDeterministicServerClose
C#
void OnDeterministicServerClose()
當 Realtime 房間關閉時調用。
OnDeterministicUpdate
C#
void OnDeterministicUpdate()
對於正在執行的遊戲階段,在每次伺服器更新時,輸入處理和伺服器模擬(如果有)處理完成後調用。
OnDeterministicStartRequest
C#
Boolean OnDeterministicStartRequest(Protocol.StartRequest startRequestData)
當 Quantum 請求啟動模擬時調用此方法。您可以返回 false 以拒絕請求。
OnDeterministicGameConfigs
C#
void OnDeterministicGameConfigs(ref byte[] runtimeConfig, ref DeterministicSessionConfig sessionConfig)
當 Quantum 收到初始遊戲配置時調用此方法。
OnDeterministicPlayerAdd
C#
void OnDeterministicPlayerAdd(int playerSlot, ref byte[] runtimePlayer)
當新玩家加入 Quantum 模擬時調用此方法。
OnDeterministicPlayerRemove
C#
void OnDeterministicPlayerRemove(int playerSlot)
當從 Quantum 模擬中移除玩家時調用此方法。
OnDeterministicSnapshotRequested
C#
Boolean OnDeterministicSnapshotRequested(ref Int32 tick, ref byte[] data)
當 Quantum 請求當前模擬狀態的快照以發送給延遲加入的客戶端時調用此方法。
您可以返回 false 以拒絕請求。
OnDeterministicCommand
C#
Boolean OnDeterministicCommand(DeterministicPluginClient client, Protocol.Command cmd)
當玩家向 Quantum 模擬發送命令時調用此方法。可以覆寫此方法以修改或驗證命令。
您可以返回 false 以拒絕命令。
OnDeterministicLateStart
C#
void OnDeterministicLateStart(DeterministicPluginClient client, Protocol.SimulationStart startData)
當延遲加入或重新連接的客戶端即將收到模擬啟動事件時調用。
OnDeterministicInputReceived
C#
void OnDeterministicInputReceived(DeterministicPluginClient client, DeterministicTickInput input)
當 Quantum 模擬收到玩家輸入時調用此方法。可以覆寫此方法以修改輸入。
OnDeterministicInputConfirmed
C#
void OnDeterministicInputConfirmed(DeterministicPluginClient client, Int32 tick, Int32 playerIndex, DeterministicTickInput input)
當客戶端和刷新的輸入被確認時調用。
OnDeterministicServerInput
C#
Boolean OnDeterministicServerInput(DeterministicTickInput input)
覆寫此方法以設置伺服器控制玩家的輸入資料。輸入物件上已設置刷新和玩家索引。
OnDeterministicStartSession
C#
void OnDeterministicStartSession()
當 Quantum 模擬啟動時調用。
OnDeterministicServerReplacedInput
C#
void OnDeterministicServerReplacedInput(DeterministicTickInput input)
當伺服器替換玩家的輸入時調用。
OnDeltaCompressedInput
C#
void OnDeltaCompressedInput(int tick, byte[] data)
當差量壓縮輸入完成並可用於串流重播時叫用此回調。
SendDeterministicCommand
C#
void SendDeterministicCommand(Protocol.Command cmd)
從伺服器向 Quantum 模擬發送命令。
Back to top