跳到正文
文件
本頁內容

校驗

校驗由你自己通過ValidationFacade呼叫,它沒有內建在儲存和載入中。問題分為Error、Warning和Advice,ValidateAndFix會修復能修復的部分

在哪裡執行校驗由遊戲決定。在編輯器中開啟關卡會報告問題,而遊玩時跳過檢查。所以等待校驗的是作者,玩家從不需要等待

關卡作者在把關卡提交給某個服務時會遇到校驗。更多:釋出配置

如何呼叫

ValidationFacade是唯一的入口。呼叫方無需知道一共有幾遍檢查:

var facade = new ValidationFacade();
var report = facade.Validate(level);

if (report.HasErrors)
    Console.WriteLine(report);
方法作用
Validate(root, settings)檢查任何根:Level、LevelMeta、UserSettings、單獨的Prefab或EffectData。只有對Level才執行圖檢查
ValidateAndFix(root, analyzerSettings, fixerSettings)修復能修復的部分,並報告剩下的問題
ValidateForPublish(meta, profile, level, now, payload, settings)同時執行全部三遍檢查,不修復任何東西。level可以是null,此時只評估後設資料

ValidationReport包含RuleIssues和GraphIssues:

  • IsValid:完全沒有問題
  • HasErrors:至少有一個Error組的問題

嚴重程度

每條規則都屬於一個RuleGroup:

  • Error:檔案按寫入的樣子無法遊玩
  • Warning:可以遊玩,但與預期不符(永遠不會出現的內容、有備用方案的失效引用)。或者唯一的修復是破壞性的
  • Advice:遊玩效果不變

三遍檢查

檢查問什麼作用於
RuleAnalyzer每個值是否在其範圍內、不為null、是已知的列舉成員任何根
LevelGraphAnalyzer物體之間是否相互一致僅Level
PublishReadinessAnalyzer能否按給定的配置把關卡交給陌生人LevelMeta,可選Level

規則

型別通過[RuleContainer]標記納入檢查。它的屬性帶有規則特性:

  • [RuleNotNull]、[RuleInRange]、[RuleMinValue]、[RuleEnumValid]、[RuleCollectionMaxCount]等
  • [RuleEnumFlagsValid]:用於標誌列舉
  • [RuleOptional]:用於可以缺失的欄位

限制本身是Rules/表中的常量:FrameRules、ValueRules、LevelRules等。例如,LevelRules.MaxObjects等於262144

對所有規則容器的遍歷由BH.SDK.Roslyn生成,不使用反射。在大型關卡上,這讓遍歷時間大約減半

修復

每個規則特性都能修復自己的值(Fix)。RuleFixer按跟蹤路徑的逆序應用修復:一次修復可能移動更深層的問題。ValidateAndFix會重複檢查,直到結果不再變化

圖檢查在修復之後進行。修復本身可能在圖中製造問題,例如新ID與已有ID重複

圖問題從不修復:DuplicateObjectId、MissingParent、ParentCycle、PrefabRemapBroken、IdCounterNearExhaustion等。每一次這樣的修復都是關於內容的決定(兩個物體中哪個保留自己的ID)。靠猜測會改寫關卡

注意

ValidateAndFix會修改你傳入的物件。如果需要保留原件,請在副本上執行,例如為了向作者展示具體改了什麼