跳到正文
文件
本頁內容

安裝

SDK就是nuget.org上的BulletHero.SDK包,也可以從原始碼構建。在Unity中以git submodule接入,ConsoleSmoke示例用來確認你的關卡能被讀取

SDK的程式碼位於github.com/bullet-hero/sdk。許可證為MIT

.NET

BulletHero.SDK包已釋出到nuget.org:dotnet add package BulletHero.SDK。三個依賴會隨它一起到位。如需從原始碼構建:

git clone https://github.com/bullet-hero/sdk.git
cd sdk
dotnet build -c Release BH.SDK.csproj   # bin~/Release/BH.SDK.dll and BH.SDK.xml
dotnet pack  -c Release BH.SDK.csproj   # bin~/Release/BulletHero.SDK.<version>.nupkg

然後二選一接入:

  • 從本地資料夾引用.nupkg:dotnet add package BulletHero.SDK --source <folder>。三個依賴會隨它一起到位
  • 直接引用BH.SDK.dll。這時下面三個包需要自己新增:對DLL的引用不會帶上它的依賴

依賴全部來自NuGet:

包版本用途
Newtonsoft.Json13.0.3JSON
BouncyCastle.Cryptography2.7.0為帶密碼的關卡提供OpenPGP
SharpZipLib1.4.2tar和zip(gzip來自BCL)

構建細節

  • 程式集名為BH.SDK.dll,旁邊附有XML文件
  • 目標框架是netstandard2.1,語言是C# 9。這與Unity專案的版本相同,所以同一份原始碼既能在Unity中構建,也能脫離Unity構建
  • 輸出資料夾是bin~和obj~。需要波浪號,是因為Unity不匯入名稱以波浪號結尾的資料夾

Unity

遊戲以git submodule的方式接入SDK:

git submodule init
git submodule add -f https://github.com/bullet-hero/sdk.git Assets/Plugins/BH.SDK

移除用git rm -r -f Assets/Plugins/BH.SDK

Unity專案需要自己提供:

  • Newtonsoft.Json,通過com.unity.nuget.newtonsoft-json包
  • 來自NuGet的BouncyCastle.Cryptography和SharpZipLib(遊戲用NuGetForUnity安裝它們)
  • Player Settings中的指令碼宏BHSDK_UNITY。沒有它,UnityIntegration會選擇不依賴引擎的分支
  • 位於SDK根目錄的BH.SDK.Roslyn.dll。Unity只把分析器應用到它所在資料夾的程式集以及引用該程式集的程式集。挪到別處後,它什麼也不分析

倉庫根目錄有一個package.json,名稱為com.vertoker.bullet-hero-sdk,最低Unity版本為6000.0。因此Package Manager也能通過git URL新增SDK。這種方式沒有使用,這裡也不介紹

檢查:ConsoleSmoke示例

Samples~/ConsoleSmoke是一個net8.0控制台應用。它引用構建好的BH.SDK.dll,和第三方工具的做法完全一樣。該應用讀取一個關卡資料夾,輸出名稱、物體數量和代。然後讓關卡經JSON和.blob各往返一次

dotnet build -c Release Samples~/ConsoleSmoke/ConsoleSmoke.csproj
dotnet Samples~/ConsoleSmoke/bin~/Release/net8.0/ConsoleSmoke.dll <level folder>
退出碼含義
0全部一致
1引數錯誤
2找不到level.*或metadata.*
3往返結果不一致
4檔案比當前SDK新

在遊戲內建關卡new-zero-demo上的輸出(用sv 1.0.0錄製):

BH.SDK 1.0.0, model generation 1
name:       New zero demo
objects:    782
generation: 1 (Blob)
round trip Json: equal (1505078 bytes)
round trip Blob: equal (680706 bytes)
exit 0

下一步:關卡格式

SDK的組成

部分是什麼是否需要Unity
BH.SDK核心:模型、序列化、版本、規則、校驗、歸檔包、釋出、生成器否
UnityIntegration一個薄層,其中每個檔案在有無Unity時都能編譯(#if BHSDK_UNITY),例如Cat日誌器否:在Unity之外它直接編譯進核心
UnityExtensions到Unity型別的轉換、2D變換、化身移動是,始終需要
BH.SDK.Roslyn分析器和原始碼生成器。它為每個帶有[GenerateModel]的模型編寫Equals、複製、JSON與.blob編解碼器以及校驗遍歷在編譯期執行

模型檔案只包含它的欄位和建構函式。所有重複的部分都由生成器編寫。所以不會在七個生成的方法體中的某一個裡漏掉欄位

為什麼是獨立的庫

  • 關卡比遊戲活得久。關卡是一個由開放格式檔案組成的資料夾(JSON、tar.gz、zip、OpenPGP)。讀取它們的程式碼也是開源的。即使寫出關卡的遊戲不在了,關卡依然可讀
  • 與其他節奏遊戲互通。格式是公開描述的,所以可以據此編寫與其他遊戲格式之間的轉換器
  • 修復更快。格式的缺陷從外部就能看到。任何讀程式碼的人都能報告它或提交修復
  • 第三方工具。轉換器、校驗器、關卡生成器或模組使用與遊戲相同的模型。不需要從檔案中還原它們
  • 伺服器。核心不依賴Unity,以netstandard2.1構建。所以伺服器能在同樣的模型上執行與客戶端相同的檢查