106 lines
3.0 KiB
C#
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;
|
|
}
|
|
}
|
|
} |