Unity 是個跨平台遊戲引擎,也是一個高度自由的設計工具。我們能用 Unity 來自行設計能顯示伺服器資訊 UI,並把它安裝到閒置的平板或手機中,當作一個精美的 Minecraft 伺服器 監控介面。
我使用 mcstatus.io 提供的 Minecraft 伺服器狀態查詢 API,並配合 RestClient 來取得任意的 Minecraft 伺服器狀態,最後打包並開源為「MCStatusForUnity」套件。
本文主要聚焦在我開發的「MCStatusForUnity」的使用上,我們後續再其它文章中分別說明如何使用 RestClient 來和 mcstatus.io 的 API 溝通。
安裝依賴套件
「MCStatusForUnity」依賴 RestClient 與 C-Sharp-Promise-UPM 兩個套件,RestClient 是一個用 Promise 模式開發的套件,大幅簡化在 C# 中與 RESTful API 溝通的複雜度;C-Sharp-Promise-UPM 則是 C# 的 Promise 模式的實現,RestClient 就是使用它來開發。我們使用 Unity 的 Package Manager (UPM) 來安裝這三個套件,請先確保電腦中已安裝 Git。
首先,請開啟 Unity 專案,從左上角的選單進入「Window > Package Manager」。
接著,在 Package Manager 視窗中,點擊左上角的「+」按鈕,然後選擇「Add package from git URL…」。
在彈出的輸入框中,依序輸入以下三個套件的 Git URL,每輸入一個就點擊 Install:
1. C-Sharp-Promise-UPM
1https://github.com/RoryDungan/C-Sharp-Promise-UPM.git
2. RestClient
1https://github.com/proyecto26/RestClient.git#upm
3. MCStatusForUnity
1https://github.com/tedliou/MCStatusForUnity.git
每次點擊 Install,Unity 都會自動下載並安裝對應的套件。完成這三個步驟後,你就已成功安裝了 MCStatusForUnity 及其所有依賴套件。
建立 C# 腳本
進入重頭戲,我們要在遊戲啟動時自動去取得 Minecraft 伺服器的即時狀態。請新增一個「MonoBehaviour C#」腳本,命名為「MCServerChecker」,並引入 VerveCode
命名空間 (第 2 行反白處),類別內保留 Start
方法。
1using UnityEngine;
2using VerveCode;
3
4public class MCServerChecker : MonoBehaviour
5{
6 private void Start()
7 {
8 // 遊戲啟動時會執行這一區塊
9 }
10}
查詢 Java 版 Minecraft 伺服器狀態
假設我們現在要取得 暮色契約 Java 版 Minecraft 伺服器的狀態,請呼叫 MCStatus.GetServerStatus<T>
方法,並設定泛型 T 為 MCStatusJava
。
MCStatus.GetServerStatus<T>
方法需要輸入三個參數,分別為 address
(伺服器位址)、port
(伺服器端口) 與 callback
,callback
使用 UnityAction
實作,可透過 Lambda 語法來在成功獲得伺服器狀態時,自動執行區塊內的程式碼。
取得「暮色契約」Minecraft 伺服器的 MOTD、線上人數、最大人數的程式碼如下:
1MCStatus.GetServerStatus<MCStatusJava>(
2 address: "twilightrpg.net", // Java 伺服器位址
3 port: 25565, // Java 伺服器端口
4 callback: status =>
5{
6 // 印出伺服器的 MOTD 和 線上人數 / 最大人數
7 Debug.Log($"Java Server MOTD (Clean): {status.Motd.Clean}");
8 Debug.Log($"Java Server Online Players: {status.Players.Online}/{status.Players.Max}");
9});
查詢 Bedrock 版 Minecraft 伺服器狀態
Bedrock 版的 Minecraft 伺服器狀態查詢用法幾乎一樣,差異在於泛型 T 要改用 MCStatusBedrock
,MCStatus.GetServerStatus<T>
所需參數與 Java 版相同。
取得「廢土基岩村」Minecraft 伺服器的 MOTD、線上人數、最大人數的程式碼如下:
1MCStatus.GetServerStatus<MCStatusBedrock>(
2 address: "bedrock.mcfallout.net", // Bedrock 伺服器位址
3 port: 19132, // Bedrock 伺服器端口
4 callback: status =>
5{
6 // 印出伺服器的 MOTD 和 線上人數 / 最大人數
7 Debug.Log($"Bedrock Server MOTD (Clean): {status.Motd.Clean}");
8 Debug.Log($"Bedrock Server Online Players: {status.Players.Online}/{status.Players.Max}");
9});
範例程式碼
如果我們將 Java 版 (暮色契約) 與 Bedrock 版 (廢土基岩村) Minecraft 伺服器的即時狀態取得程式碼同時寫在 Start
中,整體程式碼如下:
1using UnityEngine;
2using VerveCode;
3
4public class MCServerChecker : MonoBehaviour
5{
6 private void Start()
7 {
8 // 查詢 Java 版「暮色契約」Minecraft 伺服器狀態
9 MCStatus.GetServerStatus<MCStatusJava>(
10 address: "twilightrpg.net",
11 port: 25565,
12 callback: status =>
13 {
14 Debug.Log($"Java Server MOTD (Clean): {status.Motd.Clean}");
15 Debug.Log($"Java Server Online Players: {status.Players.Online}/{status.Players.Max}");
16 });
17
18 // 查詢 Bedrock 版「廢土基岩村」Minecraft 伺服器狀態
19 MCStatus.GetServerStatus<MCStatusBedrock>(
20 address: "bedrock.mcfallout.net",
21 port: 19132,
22 callback: status =>
23 {
24 Debug.Log($"Bedrock Server MOTD (Clean): {status.Motd.Clean}");
25 Debug.Log($"Bedrock Server Online Players: {status.Players.Online}/{status.Players.Max}");
26 });
27 }
28}
執行結果
快結束了!我們將 C# 腳本存檔,回到 Unity 編輯器。請新增一個 GameObject 空物件,並將 MCServerChecker 腳本拖曳到物件上。
接著,執行遊戲,等待 1 ~ 2 秒,即可從 Console 面板中分別看到 Java 與 Bedrock 的 Minecraft 伺服器 MOTD、線上玩家、最大玩家資訊已被取得並顯示出來。
我們也能將結果和 McList 網站比對一下,伺服器狀態通常不會差太多。我開發的「MCStatusForUnity」使用 mcstatus.io 的 Minecraft 伺服器查詢 API 來取得即時狀態。其中,因為 mcstatus.io 會有固定 1 分鐘的狀態暫存,所以伺服器的狀態更新最多可能會延遲 1 分鐘才會生效。