TH1/My project/Assets/Scripts/Data/RuntimeData.cs

106 lines
3.0 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年04月03日 星期四 11:04:31
* @Modify:
*/
using System;
using System.Collections.Generic;
using Logic.Skill;
using UnityEngine;
namespace RuntimeData
{
[Serializable]
public abstract class IdentifierBase : ISerializationCallbackReceiver
{
// 唯一 ID
public uint Id;
// 技能信息
public List<SkillBase> Skills = new List<SkillBase>();
private Dictionary<SkillType, SkillBase> _skillDict;
// 辅助序列化字段
[SerializeField]
private List<string> _typeNames = new List<string>();
[SerializeField]
private List<string> _jsonData = new List<string>();
// Mark 信息
[SerializeField] protected bool _renderMark;
public bool RenderMark
{
get => _renderMark;
set => _renderMark = value;
}
public bool GetSkill(SkillType skillType, out SkillBase skill)
{
RefreshSkillDict();
return _skillDict.TryGetValue(skillType, out skill);
}
public void AddSkill(SkillType skillType)
{
RefreshSkillDict();
if (_skillDict.ContainsKey(skillType)) return;
var skill = SkillFactory.GetSkillBySkillType(skillType);
if (skill != null)
{
Skills.Add(skill);
_skillDict[skillType] = skill;
}
}
public void RemoveSkill(SkillType skillType)
{
RefreshSkillDict();
if (!_skillDict.TryGetValue(skillType, out var value)) return;
Skills.Remove(value);
_skillDict.Remove(skillType);
}
private void RefreshSkillDict()
{
if (_skillDict == null) _skillDict = new Dictionary<SkillType, SkillBase>();
if (_skillDict.Count != Skills.Count)
{
_skillDict.Clear();
foreach (var skill in Skills) _skillDict[skill.GetSkillType()] = skill;
}
}
public void OnBeforeSerialize()
{
_typeNames.Clear();
_jsonData.Clear();
foreach (var skill in Skills)
{
_typeNames.Add(skill.GetType().AssemblyQualifiedName);
_jsonData.Add(JsonUtility.ToJson(skill));
}
}
public void OnAfterDeserialize()
{
Skills ??= new List<SkillBase>();
Skills.Clear();
for (int i = 0; i < _typeNames.Count; i++)
{
var type = Type.GetType(_typeNames[i]);
var skill = (SkillBase) JsonUtility.FromJson(_jsonData[i], type);
Skills.Add(skill);
}
_skillDict ??= new Dictionary<SkillType, SkillBase>();
_skillDict.Clear();
foreach (var skill in Skills) _skillDict[skill.GetSkillType()] = skill;
}
}
}