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