90 lines
2.4 KiB
C#
90 lines
2.4 KiB
C#
using System.Collections.Generic;
|
|
using DDD.Interfaces;
|
|
using UnityEngine;
|
|
using Random = UnityEngine.Random;
|
|
|
|
public class DataSo<T> : ScriptableObject, IDataContainer<T>
|
|
{
|
|
[SerializeField]
|
|
protected List<SerializableKeyValuePair<T>> _serializedDataList = new();
|
|
|
|
protected Dictionary<string, T> _datas;
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
InitializeDictionary();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 에디터에서 값이 변경되었을 때 호출되는 함수
|
|
/// </summary>
|
|
private void OnValidate()
|
|
{
|
|
InitializeDictionary();
|
|
}
|
|
|
|
private void InitializeDictionary()
|
|
{
|
|
_datas = new Dictionary<string, T>();
|
|
foreach (var kvp in _serializedDataList)
|
|
{
|
|
if (!_datas.ContainsKey(kvp.Key))
|
|
{
|
|
_datas.Add(kvp.Key, kvp.Value);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 에디터에서 변환할 때 사용하는 함수
|
|
/// </summary>
|
|
public List<SerializableKeyValuePair<T>> GetSerializedDataList()
|
|
{
|
|
return _serializedDataList;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 에디터에서 변환할 때 사용하는 함수
|
|
/// </summary>
|
|
public void SetSerializedDataList(List<SerializableKeyValuePair<T>> datas)
|
|
{
|
|
_serializedDataList = datas;
|
|
}
|
|
|
|
public Dictionary<string, T> GetData()
|
|
{
|
|
return _datas;
|
|
}
|
|
|
|
public void SetData(Dictionary<string, T> datas)
|
|
{
|
|
_datas = datas;
|
|
}
|
|
|
|
public T GetDataByIdx(string idx)
|
|
{
|
|
if (!_datas.TryGetValue(idx, out var data))
|
|
{
|
|
Debug.LogError($"{idx}에 해당하는 값을 찾을 수 없습니다.");
|
|
return default;
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
public int GetDataCount()
|
|
{
|
|
return _datas.Count;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 데이터 전체에서 랜덤한 Key에 접근해 Value를 리턴해주는 함수
|
|
/// </summary>
|
|
public T GetRandomValue()
|
|
{
|
|
var randomIndex = Random.Range(0, GetDataCount());
|
|
var keys = new List<string>(_datas.Keys);
|
|
var randomKey = keys[randomIndex];
|
|
return _datas[randomKey];
|
|
}
|
|
} |