feat(save): 重构快照结构并添加 Fix 场景支持
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream.SaveSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// sections["fix"]:Fix 场景宏观状态(FixStateMachine)。
|
||||
/// RestoreOrder=65,在 timeline(60) 之后、screen(70) 之前。
|
||||
/// </summary>
|
||||
public class FixSnapshotProvider : ISnapshotProvider
|
||||
{
|
||||
public string SaveId => SnapshotProviderIds.Fix;
|
||||
public int RestoreOrder => 65;
|
||||
|
||||
public object Capture()
|
||||
{
|
||||
if (FixSystem.FixSystemCenter.Instance == null)
|
||||
{
|
||||
Debug.LogWarning("[FixSnapshotProvider] FixSystemCenter 未初始化,跳过捕获。");
|
||||
return null;
|
||||
}
|
||||
|
||||
return FixSystem.FixSystemCenter.Instance.CaptureSnapshot();
|
||||
}
|
||||
|
||||
public IEnumerator Restore(object dto)
|
||||
{
|
||||
if (dto is not FixSnapshotDto fix)
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (FixSystem.FixSystemCenter.Instance == null)
|
||||
{
|
||||
Debug.LogWarning("[FixSnapshotProvider] FixSystemCenter 未初始化,跳过还原。");
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return FixSystem.FixSystemCenter.Instance.RestoreSnapshot(fix);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: af663fafb5b2a9748902e2e34e1f6be3
|
||||
guid: bda963cd11c77cf4bb8d669b0ef6d5f9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -1,56 +0,0 @@
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream.SaveSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// sections["macro"]:章节 TalkSceneSO 与 YarnProject 绑定。
|
||||
/// RestoreOrder=30,在场景与环境就绪后设置 GameManager 并 LoadDialog(不 Start 节点,锚点由 RestoreAnchor 负责)。
|
||||
/// </summary>
|
||||
public class MacroSnapshotProvider : ISnapshotProvider
|
||||
{
|
||||
public string SaveId => SnapshotProviderIds.Macro;
|
||||
public int RestoreOrder => 30;
|
||||
|
||||
public object Capture()
|
||||
{
|
||||
var gameManager = GameManager.Instance;
|
||||
var dialog = DialogController.Instance;
|
||||
var yarnProject = dialog?.DialogueRunner?.YarnProject;
|
||||
|
||||
return new MacroSnapshotDto
|
||||
{
|
||||
sceneSoName = gameManager != null ? gameManager.GetSceneSoName() : null,
|
||||
yarnProjectId = yarnProject != null ? yarnProject.name : null
|
||||
};
|
||||
}
|
||||
|
||||
public IEnumerator Restore(object dto)
|
||||
{
|
||||
if (dto is not MacroSnapshotDto macro)
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(macro.sceneSoName))
|
||||
{
|
||||
GameManager.Instance.SetSceneSoByName(macro.sceneSoName);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(macro.yarnProjectId))
|
||||
{
|
||||
var sceneSo = GameManager.Instance.GetCurrentTalkSceneSo();
|
||||
if (sceneSo?.yarnProject != null && sceneSo.yarnProject.name == macro.yarnProjectId)
|
||||
{
|
||||
DialogController.Instance.LoadDialog(sceneSo.yarnProject);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"[MacroSnapshotProvider] 无法匹配 YarnProject: {macro.yarnProjectId}");
|
||||
}
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
using System.Collections;
|
||||
|
||||
namespace AibisDream.SaveSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// sections["scene"]:当前 Addressable 场景。
|
||||
/// RestoreOrder=10,读档时最先加载场景,供后续 env/actor 等依赖。
|
||||
/// </summary>
|
||||
public class SceneSnapshotProvider : ISnapshotProvider
|
||||
{
|
||||
public string SaveId => SnapshotProviderIds.Scene;
|
||||
public int RestoreOrder => 10;
|
||||
|
||||
public object Capture()
|
||||
{
|
||||
var sceneLoader = SceneLoader.Instance;
|
||||
return new SceneSnapshotDto
|
||||
{
|
||||
sceneName = sceneLoader != null ? sceneLoader.CurrentSceneName : null
|
||||
};
|
||||
}
|
||||
|
||||
public IEnumerator Restore(object dto)
|
||||
{
|
||||
if (dto is not SceneSnapshotDto scene || string.IsNullOrEmpty(scene.sceneName))
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return SceneLoader.Instance.LoadSceneAsync(scene.sceneName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d814b6c56374b4446baa86e09f510098
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -34,7 +34,10 @@ namespace AibisDream.SaveSystem
|
||||
/// <summary>保存时间(本地),格式 <c>yyyy-MM-dd HH:mm:ss</c>。</summary>
|
||||
public string savedAt;
|
||||
|
||||
/// <summary>恢复锚点:读档后从此 Yarn 节点重新进入(所见即所存)。</summary>
|
||||
/// <summary>当前场景(恢复的第一步)。</summary>
|
||||
public SceneSnapshotDto scene = new();
|
||||
|
||||
/// <summary>恢复锚点:章节、YarnProject 与节点,读档最后阶段重新进入。</summary>
|
||||
public AnchorSnapshot anchor = new();
|
||||
|
||||
/// <summary>全部 Yarn 运行时变量(来自 <see cref="YarnVariableStorage"/>)。</summary>
|
||||
@@ -52,11 +55,13 @@ namespace AibisDream.SaveSystem
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 恢复锚点。读档时在场景与状态还原完成后,从 <see cref="nodeName"/> 重新 <c>StartDialogue</c>。
|
||||
/// 恢复锚点:包含宏观章节信息,读档最后阶段加载对话工程并重新 <c>StartDialogue</c>。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class AnchorSnapshot
|
||||
{
|
||||
/// <summary>当前章节 TalkSceneSO 名称,用于 <see cref="GameManager.SetSceneSoByName"/>。</summary>
|
||||
public string sceneSoName;
|
||||
public string yarnProjectId;
|
||||
public string nodeName;
|
||||
}
|
||||
@@ -79,14 +84,6 @@ namespace AibisDream.SaveSystem
|
||||
public string sceneName;
|
||||
}
|
||||
|
||||
/// <summary>sections["macro"]:章节与 Yarn 工程绑定。</summary>
|
||||
[Serializable]
|
||||
public class MacroSnapshotDto
|
||||
{
|
||||
public string sceneSoName;
|
||||
public string yarnProjectId;
|
||||
}
|
||||
|
||||
/// <summary>sections["env"]:环境时间/天气。</summary>
|
||||
[Serializable]
|
||||
public class EnvironmentSnapshotDto
|
||||
@@ -177,5 +174,28 @@ namespace AibisDream.SaveSystem
|
||||
public bool isFadeScreenCovered;
|
||||
}
|
||||
|
||||
/// <summary>sections["fix"]:Fix 场景宏观状态(FixStateMachine)。</summary>
|
||||
[Serializable]
|
||||
public class FixSnapshotDto
|
||||
{
|
||||
/// <summary><see cref="FixState"/> 枚举名。</summary>
|
||||
public string state;
|
||||
|
||||
/// <summary>状态参数(如 BodyModule 的 ModuleState 字符串)。</summary>
|
||||
public string args;
|
||||
|
||||
/// <summary>BodyModule 当前分组(Body/Head)。</summary>
|
||||
public string moduleState;
|
||||
|
||||
/// <summary>EyeSystem 当前颜色阶段。</summary>
|
||||
public string eyeColorState;
|
||||
|
||||
/// <summary>FixPanelSystem 是否已启动。</summary>
|
||||
public bool isSystemOn;
|
||||
|
||||
/// <summary>RepairSystemManager 当前激活的系统类型名。</summary>
|
||||
public string currentRepairSystemType;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
namespace AibisDream.SaveSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// 从 <see cref="SaveSnapshot.sections"/> 现算的宏观摘要(场景 / 章节 SO / YarnProject)。
|
||||
/// 从 <see cref="SaveSnapshot"/> 根对象直接读取的宏观摘要(场景 / 章节 SO / YarnProject)。
|
||||
/// <para>
|
||||
/// 替代已移除的顶层 <c>macroStage</c> 冗余字段:sections["scene"] / sections["macro"] 为唯一来源,
|
||||
/// 槽位 / 「继续游戏」等 UI 在需要展示时调用 <see cref="From"/> 派生,避免重复字段与读写漂移。
|
||||
/// scene 与 anchor 已提升到根对象,无需再从 sections 字典派生。
|
||||
/// 槽位 / 「继续游戏」等 UI 在需要展示时调用 <see cref="From"/> 即可。
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public readonly struct SaveSnapshotSummary
|
||||
{
|
||||
/// <summary>Addressable 场景 key,如 <c>Scene/ClinicOut</c>(来自 sections["scene"])。</summary>
|
||||
/// <summary>Addressable 场景 key(来自 <see cref="SaveSnapshot.scene"/>)。</summary>
|
||||
public readonly string SceneName;
|
||||
|
||||
/// <summary>当前 <c>TalkSceneSO</c> 的 asset 名称(来自 sections["macro"])。</summary>
|
||||
/// <summary>当前 <c>TalkSceneSO</c> 的 asset 名称(来自 <see cref="AnchorSnapshot.sceneSoName"/>)。</summary>
|
||||
public readonly string SceneSoName;
|
||||
|
||||
/// <summary>当前 <c>YarnProject</c> 的 name(来自 sections["macro"],缺省回退到 anchor)。</summary>
|
||||
/// <summary>当前 <c>YarnProject</c> 的 name(来自 <see cref="AnchorSnapshot.yarnProjectId"/>)。</summary>
|
||||
public readonly string YarnProjectId;
|
||||
|
||||
public SaveSnapshotSummary(string sceneName, string sceneSoName, string yarnProjectId)
|
||||
@@ -25,34 +25,17 @@ namespace AibisDream.SaveSystem
|
||||
YarnProjectId = yarnProjectId;
|
||||
}
|
||||
|
||||
/// <summary>从快照派生宏观摘要;兼容 sections 为强类型 DTO 或读盘后的 JObject。</summary>
|
||||
/// <summary>从快照根对象直接读取宏观摘要。</summary>
|
||||
public static SaveSnapshotSummary From(SaveSnapshot snapshot)
|
||||
{
|
||||
if (snapshot?.sections == null)
|
||||
if (snapshot == null)
|
||||
{
|
||||
return new SaveSnapshotSummary(null, null, snapshot?.anchor?.yarnProjectId);
|
||||
return new SaveSnapshotSummary(null, null, null);
|
||||
}
|
||||
|
||||
string sceneName = null;
|
||||
if (snapshot.sections.TryGetValue(SnapshotProviderIds.Scene, out var sceneRaw)
|
||||
&& SnapshotSectionDeserializer.Coerce(SnapshotProviderIds.Scene, sceneRaw) is SceneSnapshotDto scene)
|
||||
{
|
||||
sceneName = scene.sceneName;
|
||||
}
|
||||
|
||||
string sceneSoName = null;
|
||||
string yarnProjectId = null;
|
||||
if (snapshot.sections.TryGetValue(SnapshotProviderIds.Macro, out var macroRaw)
|
||||
&& SnapshotSectionDeserializer.Coerce(SnapshotProviderIds.Macro, macroRaw) is MacroSnapshotDto macro)
|
||||
{
|
||||
sceneSoName = macro.sceneSoName;
|
||||
yarnProjectId = macro.yarnProjectId;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(yarnProjectId))
|
||||
{
|
||||
yarnProjectId = snapshot.anchor?.yarnProjectId;
|
||||
}
|
||||
var sceneName = snapshot.scene?.sceneName;
|
||||
var sceneSoName = snapshot.anchor?.sceneSoName;
|
||||
var yarnProjectId = snapshot.anchor?.yarnProjectId;
|
||||
|
||||
return new SaveSnapshotSummary(sceneName, sceneSoName, yarnProjectId);
|
||||
}
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
if (_initialized) return;
|
||||
_initialized = true;
|
||||
|
||||
SnapshotRegistry.Register(new SceneSnapshotProvider());
|
||||
SnapshotRegistry.Register(new MacroSnapshotProvider());
|
||||
SnapshotRegistry.Register(new EnvironmentSnapshotProvider());
|
||||
SnapshotRegistry.Register(new ActorSnapshotProvider());
|
||||
SnapshotRegistry.Register(new AudioSnapshotProvider());
|
||||
SnapshotRegistry.Register(new TimelineSnapshotProvider());
|
||||
SnapshotRegistry.Register(new FixSnapshotProvider());
|
||||
SnapshotRegistry.Register(new ScreenSnapshotProvider());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ namespace AibisDream.SaveSystem
|
||||
/// <summary>
|
||||
/// 从运行时组装 <see cref="SaveSnapshot"/>(纯内存,不写盘)。
|
||||
/// <para>
|
||||
/// 流程:元数据 → 锚点 → Yarn 变量 → 各 Provider.Capture。
|
||||
/// 宏观信息(scene/macro)由对应 Provider 写入 sections,不再额外汇总到顶层。
|
||||
/// 流程:元数据 → 场景 → 锚点(含宏观章节)→ Yarn 变量 → 各 Provider.Capture。
|
||||
/// scene / anchor 由框架直管;其余子系统通过 Provider 写入 sections。
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public static class SnapshotCapture
|
||||
@@ -24,6 +24,7 @@ namespace AibisDream.SaveSystem
|
||||
savedAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
|
||||
};
|
||||
|
||||
CaptureScene(snapshot);
|
||||
CaptureAnchor(snapshot);
|
||||
CaptureYarnVariables(storage, snapshot);
|
||||
|
||||
@@ -37,6 +38,15 @@ namespace AibisDream.SaveSystem
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
private static void CaptureScene(SaveSnapshot snapshot)
|
||||
{
|
||||
var sceneLoader = SceneLoader.Instance;
|
||||
snapshot.scene = new SceneSnapshotDto
|
||||
{
|
||||
sceneName = sceneLoader != null ? sceneLoader.CurrentSceneName : null
|
||||
};
|
||||
}
|
||||
|
||||
private static void CaptureAnchor(SaveSnapshot snapshot)
|
||||
{
|
||||
var dialog = DialogController.Instance;
|
||||
@@ -46,8 +56,12 @@ namespace AibisDream.SaveSystem
|
||||
var yarnProject = dialog.DialogueRunner?.YarnProject;
|
||||
var projectId = yarnProject != null ? yarnProject.name : string.Empty;
|
||||
|
||||
var gameManager = GameManager.Instance;
|
||||
var sceneSoName = gameManager != null ? gameManager.GetSceneSoName() : null;
|
||||
|
||||
snapshot.anchor = new AnchorSnapshot
|
||||
{
|
||||
sceneSoName = sceneSoName,
|
||||
yarnProjectId = projectId,
|
||||
nodeName = nodeName ?? string.Empty
|
||||
};
|
||||
|
||||
@@ -6,21 +6,21 @@ namespace AibisDream.SaveSystem
|
||||
/// </summary>
|
||||
public static class SnapshotProviderIds
|
||||
{
|
||||
public const string Scene = "scene";
|
||||
public const string Macro = "macro";
|
||||
public const string Environment = "env";
|
||||
public const string Actor = "actor";
|
||||
public const string Audio = "audio";
|
||||
public const string Timeline = "timeline";
|
||||
public const string Screen = "screen";
|
||||
public const string Fix = "fix";
|
||||
|
||||
/// <summary>
|
||||
/// P1 应参与 Capture 的 provider 清单。
|
||||
/// <see cref="SnapshotRegistry.ValidateRequiredProviders"/> 据此告警缺失项;不含深度维修。
|
||||
/// scene 与 macro 已提升到 <see cref="SaveSnapshot"/> 根对象,由框架直管。
|
||||
/// </summary>
|
||||
public static readonly string[] RequiredForCapture =
|
||||
{
|
||||
Scene, Macro, Environment, Actor, Audio, Timeline, Screen
|
||||
Environment, Actor, Audio, Timeline, Fix, Screen
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,13 +6,15 @@ namespace AibisDream.SaveSystem
|
||||
/// <summary>
|
||||
/// 将 <see cref="SaveSnapshot"/> 逐项写回运行时(纯内存,不读盘)。
|
||||
/// <para>
|
||||
/// 顺序:Yarn 变量 → 各 Provider(按 RestoreOrder)→(可选)锚点重进节点。
|
||||
/// 顺序:Yarn 变量 → 场景加载 → 设置章节 → 各 Provider(按 RestoreOrder)→ 锚点加载对话并重进节点。
|
||||
/// 完整淡入淡出时序由 P4 在 <see cref="SaveRestoreOrchestrator"/> 扩展。
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public static class SnapshotRestore
|
||||
{
|
||||
/// <summary>还原 Yarn 变量与各 section;不包含锚点重进(由 <see cref="RestoreAnchor"/> 或上层编排)。</summary>
|
||||
/// <summary>
|
||||
/// 还原 Yarn 变量、场景、章节与各 section;不包含锚点重进(由 <see cref="RestoreAnchor"/> 或上层编排)。
|
||||
/// </summary>
|
||||
public static IEnumerator Restore(YarnVariableStorage storage, SaveSnapshot snapshot)
|
||||
{
|
||||
if (snapshot == null)
|
||||
@@ -22,6 +24,8 @@ namespace AibisDream.SaveSystem
|
||||
}
|
||||
|
||||
RestoreYarnVariables(storage, snapshot);
|
||||
yield return RestoreScene(snapshot);
|
||||
RestoreSceneSo(snapshot);
|
||||
|
||||
foreach (var provider in SnapshotRegistry.GetOrderedProviders())
|
||||
{
|
||||
@@ -42,7 +46,7 @@ namespace AibisDream.SaveSystem
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按 <see cref="AnchorSnapshot"/> 重新进入 Yarn 节点,实现「所见即所存」。
|
||||
/// 按 <see cref="AnchorSnapshot"/> 加载对话工程并重新进入 Yarn 节点,实现「所见即所存」。
|
||||
/// 调用前应已完成场景加载与各 provider 还原。
|
||||
/// </summary>
|
||||
public static IEnumerator RestoreAnchor(SaveSnapshot snapshot)
|
||||
@@ -58,12 +62,22 @@ namespace AibisDream.SaveSystem
|
||||
var runner = dialog.DialogueRunner;
|
||||
if (runner == null) yield break;
|
||||
|
||||
if (!string.IsNullOrEmpty(snapshot.anchor.yarnProjectId)
|
||||
&& runner.YarnProject != null
|
||||
&& runner.YarnProject.name != snapshot.anchor.yarnProjectId)
|
||||
// 若当前 Runner 未加载对应 YarnProject,则先加载
|
||||
if (!string.IsNullOrEmpty(snapshot.anchor.yarnProjectId))
|
||||
{
|
||||
Debug.LogWarning(
|
||||
$"[SnapshotRestore] YarnProject 不匹配:当前 {runner.YarnProject.name},存档 {snapshot.anchor.yarnProjectId}");
|
||||
var sceneSo = GameManager.Instance?.GetCurrentTalkSceneSo();
|
||||
if (sceneSo?.yarnProject != null && sceneSo.yarnProject.name == snapshot.anchor.yarnProjectId)
|
||||
{
|
||||
if (runner.YarnProject == null || runner.YarnProject.name != snapshot.anchor.yarnProjectId)
|
||||
{
|
||||
dialog.LoadDialog(sceneSo.yarnProject);
|
||||
}
|
||||
}
|
||||
else if (runner.YarnProject != null && runner.YarnProject.name != snapshot.anchor.yarnProjectId)
|
||||
{
|
||||
Debug.LogWarning(
|
||||
$"[SnapshotRestore] YarnProject 不匹配:当前 {runner.YarnProject.name},存档 {snapshot.anchor.yarnProjectId}");
|
||||
}
|
||||
}
|
||||
|
||||
if (runner.IsDialogueRunning)
|
||||
@@ -81,5 +95,39 @@ namespace AibisDream.SaveSystem
|
||||
|
||||
storage.SetAllVariables(vars.floats, vars.strings, vars.bools);
|
||||
}
|
||||
|
||||
private static IEnumerator RestoreScene(SaveSnapshot snapshot)
|
||||
{
|
||||
if (snapshot.scene == null || string.IsNullOrEmpty(snapshot.scene.sceneName))
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
var sceneLoader = SceneLoader.Instance;
|
||||
if (sceneLoader == null)
|
||||
{
|
||||
Debug.LogError("[SnapshotRestore] SceneLoader 未初始化,无法加载场景");
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return sceneLoader.LoadSceneAsync(snapshot.scene.sceneName);
|
||||
}
|
||||
|
||||
private static void RestoreSceneSo(SaveSnapshot snapshot)
|
||||
{
|
||||
if (snapshot.anchor == null || string.IsNullOrEmpty(snapshot.anchor.sceneSoName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var gameManager = GameManager.Instance;
|
||||
if (gameManager == null)
|
||||
{
|
||||
Debug.LogWarning("[SnapshotRestore] GameManager 未初始化,无法设置章节 SO");
|
||||
return;
|
||||
}
|
||||
|
||||
gameManager.SetSceneSoByName(snapshot.anchor.sceneSoName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,12 +18,11 @@ namespace AibisDream.SaveSystem
|
||||
|
||||
return saveId switch
|
||||
{
|
||||
SnapshotProviderIds.Scene => jobj.ToObject<SceneSnapshotDto>(),
|
||||
SnapshotProviderIds.Macro => jobj.ToObject<MacroSnapshotDto>(),
|
||||
SnapshotProviderIds.Environment => jobj.ToObject<EnvironmentSnapshotDto>(),
|
||||
SnapshotProviderIds.Actor => jobj.ToObject<ActorSnapshotDto>(),
|
||||
SnapshotProviderIds.Audio => jobj.ToObject<AudioSnapshotDto>(),
|
||||
SnapshotProviderIds.Timeline => jobj.ToObject<TimelineSnapshotDto>(),
|
||||
SnapshotProviderIds.Fix => jobj.ToObject<FixSnapshotDto>(),
|
||||
SnapshotProviderIds.Screen => jobj.ToObject<ScreenSnapshotDto>(),
|
||||
_ => jobj
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user