Files
TheVVaS-Assets/RPGCore/Runtime/ObjectModules/DataObjectModule/DataModule.cs
T
2026-04-25 23:37:10 +02:00

54 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using RPGCore.Core;
using RPGCore.Core.Objects;
using UnityEngine;
namespace RPGCore.ObjectModules.EventObjectModule
{
[Serializable]
[RequireComponent(typeof(BaseObject))]
public class DataModule : ObjectModule<BaseObject>
{
// SERIALIZED
[SerializeReference] private List<BaseData> _dataList = new();
// RUNTIME
private Dictionary<Type, BaseData> _dataDict;
private void OnValidate()
{
if (!parent) return;
// Remove invalid
if (_dataList.Any(data => data == null))
_dataList = _dataList.Where(data => data != null).ToList();
// Remove duplicates
if (_dataList.GroupBy(data => data.GetType()).Any(g => g.Count() > 1))
_dataList = _dataList.GroupBy(data => data.GetType()).Select(g => g.First()).ToList();
// Create missing datas
UnityEditor.TypeCache.GetTypesDerivedFrom<BaseObject>()
.Append(typeof(BaseObject))
.Where(t => t.IsAssignableFrom(parent.GetType()))
.Select(t => typeof(BaseData<>).MakeGenericType(t))
.SelectMany(t => UnityEditor.TypeCache.GetTypesDerivedFrom(t))
.Where(t => !_dataList.Select(data => data.GetType()).Contains(t))
.ToList().ForEach(t => _dataList.Add(Activator.CreateInstance(t) as BaseData));
_dataList.ForEach(data => data.parent = parent);
}
private void Awake()
{
_dataDict = _dataList.ToDictionary(data => data.GetType(), data => data);
}
public T Get<T>() where T : BaseData
{
return (T)_dataDict[typeof(T)];
}
}
}