This document is about: QUANTUM 3
SWITCH TO

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\logGSGame.log是自訂外掛程式日誌的輸出位置。如需從 Photon 企業伺服器獲取日誌,請聯繫我們。

伺服器模擬

為了讓 Quantum 伺服器執行模擬,需要建立DeterministicServer物件並附加一個類型為IDeterministicSessionRunner的參數。與 Quantum 2 不同,啟動和更新模擬現在完全封裝。請查看 Unity 專案中的DotNetSessionRunner類別。

C#

var sessionRunner = new DotNetSessionRunner {
  AssetSerializer = new QuantumJsonSerializer()
};

在執行伺服器模擬時,Quantum 的依賴項、模擬 DLL 和資產 必須 與客戶端建置同步。在 Unity 中執行同步流程(例如選擇QuantumDotnetBuildSettings資產)。

Unity - Sync Server Simulation

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設為啟用或停用此會話的伺服器模擬。該布林值已由儀表板變數ServerSimulationEnabledServerSimulationPercent配置。只有在伺服器物件已使用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