Files
ShrinkTutorial/Runtime/Core/ShrinkTutorialDatabase.cs
T
cneicy 1180be88a6
Publish UPM package / publish (push) Failing after 1s
chore: initialize standalone UPM package
2026-08-26 02:50:43 +08:00

94 lines
3.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace ShrinkTutorial
{
[CreateAssetMenu(fileName = "ShrinkTutorialDatabase", menuName = "ShrinkTutorial/Tutorial Database")]
public class ShrinkTutorialDatabase : ScriptableObject
{
[SerializeField] private List<ShrinkTutorialData> tutorials = new();
private Dictionary<string, ShrinkTutorialData> _cache;
public IReadOnlyList<ShrinkTutorialData> Tutorials => tutorials;
public bool TryGetTutorial(string tutorialId, out ShrinkTutorialData tutorial)
{
EnsureCache();
return _cache.TryGetValue(tutorialId, out tutorial);
}
public List<string> Validate()
{
var issues = new List<string>();
var ids = new HashSet<string>();
foreach (var tutorial in tutorials)
{
if (!tutorial)
{
issues.Add("存在空的教程资源引用。");
continue;
}
if (string.IsNullOrWhiteSpace(tutorial.tutorialId))
{
issues.Add($"教程资源 {tutorial.name} 缺少 tutorialId。");
}
else if (!ids.Add(tutorial.tutorialId))
{
issues.Add($"tutorialId 重复: {tutorial.tutorialId}");
}
if (tutorial.steps == null || tutorial.steps.Count == 0)
{
issues.Add($"教程 {tutorial.tutorialId} 没有任何步骤。");
continue;
}
for (var i = 0; i < tutorial.steps.Count; i++)
{
var step = tutorial.steps[i];
if (step == null)
{
issues.Add($"教程 {tutorial.tutorialId} 第 {i + 1} 步为空。");
continue;
}
if (step.targetMode == ShrinkTutorialTargetMode.Path && string.IsNullOrWhiteSpace(step.targetPath))
issues.Add($"教程 {tutorial.tutorialId} 第 {i + 1} 步缺少 targetPath。");
if (step.targetMode == ShrinkTutorialTargetMode.AnchorId && string.IsNullOrWhiteSpace(step.anchorId))
issues.Add($"教程 {tutorial.tutorialId} 第 {i + 1} 步缺少 anchorId。");
if (step.completeCondition == ShrinkTutorialCompleteCondition.CustomEvent &&
string.IsNullOrWhiteSpace(step.customEventName))
issues.Add($"教程 {tutorial.tutorialId} 第 {i + 1} 步使用 CustomEvent 但未填写 customEventName。");
}
}
return issues;
}
private void OnValidate()
{
_cache = null;
}
private void EnsureCache()
{
if (_cache != null)
return;
_cache = new Dictionary<string, ShrinkTutorialData>();
foreach (var tutorial in tutorials)
{
if (!tutorial || string.IsNullOrWhiteSpace(tutorial.tutorialId))
continue;
_cache[tutorial.tutorialId] = tutorial;
}
}
}
}