/* * @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 Skills = new List(); private Dictionary _skillDict; // 辅助序列化字段 [SerializeField] private List _typeNames = new List(); [SerializeField] private List _jsonData = new List(); // 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(); 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(); 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(); _skillDict.Clear(); foreach (var skill in Skills) _skillDict[skill.GetSkillType()] = skill; } } }