CapersProject/Assets/02.Scripts/Item/DataSo.cs
2024-10-29 15:46:50 +09:00

93 lines
2.5 KiB
C#

using System.Collections.Generic;
using BlueWater.Interfaces;
using UnityEngine;
using Random = UnityEngine.Random;
namespace BlueWater.Items
{
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];
}
}
}