//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 loyalsoft. All rights reserved.
// Homepage: http://www.game7000.com/
// Feedback: http://www.game7000.com/
//------------------------------------------------------------
using GameFramework;
using GameFramework.DataTable;
using GameFramework.Resource;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace UnityGameFramework.Runtime
{
///
/// 数据表组件。
///
[DisallowMultipleComponent]
[AddComponentMenu("Game Framework/Data Table")]
public sealed class DataTableComponent : GameFrameworkComponent
{
private const int DefaultPriority = 0;
private IDataTableManager m_DataTableManager = null;
private EventComponent m_EventComponent = null;
[SerializeField]
private bool m_EnableLoadDataTableUpdateEvent = false;
[SerializeField]
private bool m_EnableLoadDataTableDependencyAssetEvent = false;
[SerializeField]
private string m_DataTableHelperTypeName = "UnityGameFramework.Runtime.DefaultDataTableHelper";
[SerializeField]
private DataTableHelperBase m_CustomDataTableHelper = null;
[SerializeField]
private int m_CachedBytesSize = 0;
///
/// 获取数据表数量。
///
public int Count
{
get
{
return m_DataTableManager.Count;
}
}
///
/// 获取缓冲二进制流的大小。
///
public int CachedBytesSize
{
get
{
return m_DataTableManager.CachedBytesSize;
}
}
///
/// 游戏框架组件初始化。
///
protected override void Awake()
{
base.Awake();
m_DataTableManager = GameFrameworkEntry.GetModule();
if (m_DataTableManager == null)
{
Log.Fatal("Data table manager is invalid.");
return;
}
}
private void Start()
{
BaseComponent baseComponent = GameEntry.GetComponent();
if (baseComponent == null)
{
Log.Fatal("Base component is invalid.");
return;
}
m_EventComponent = GameEntry.GetComponent();
if (m_EventComponent == null)
{
Log.Fatal("Event component is invalid.");
return;
}
if (baseComponent.EditorResourceMode)
{
m_DataTableManager.SetResourceManager(baseComponent.EditorResourceHelper);
}
else
{
m_DataTableManager.SetResourceManager(GameFrameworkEntry.GetModule());
}
DataTableHelperBase dataTableHelper = Helper.CreateHelper(m_DataTableHelperTypeName, m_CustomDataTableHelper);
if (dataTableHelper == null)
{
Log.Error("Can not create data table helper.");
return;
}
dataTableHelper.name = "Data Table Helper";
Transform transform = dataTableHelper.transform;
transform.SetParent(this.transform);
transform.localScale = Vector3.one;
m_DataTableManager.SetDataProviderHelper(dataTableHelper);
m_DataTableManager.SetDataTableHelper(dataTableHelper);
if (m_CachedBytesSize > 0)
{
EnsureCachedBytesSize(m_CachedBytesSize);
}
}
///
/// 确保二进制流缓存分配足够大小的内存并缓存。
///
/// 要确保二进制流缓存分配内存的大小。
public void EnsureCachedBytesSize(int ensureSize)
{
m_DataTableManager.EnsureCachedBytesSize(ensureSize);
}
///
/// 释放缓存的二进制流。
///
public void FreeCachedBytes()
{
m_DataTableManager.FreeCachedBytes();
}
///
/// 是否存在数据表。
///
/// 数据表行的类型。
/// 是否存在数据表。
public bool HasDataTable() where T : IDataRow
{
return m_DataTableManager.HasDataTable();
}
///
/// 是否存在数据表。
///
/// 数据表行的类型。
/// 是否存在数据表。
public bool HasDataTable(Type dataRowType)
{
return m_DataTableManager.HasDataTable(dataRowType);
}
///
/// 是否存在数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 是否存在数据表。
public bool HasDataTable(string name) where T : IDataRow
{
return m_DataTableManager.HasDataTable(name);
}
///
/// 是否存在数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 是否存在数据表。
public bool HasDataTable(Type dataRowType, string name)
{
return m_DataTableManager.HasDataTable(dataRowType, name);
}
///
/// 获取数据表。
///
/// 数据表行的类型。
/// 要获取的数据表。
public IDataTable GetDataTable() where T : IDataRow
{
return m_DataTableManager.GetDataTable();
}
///
/// 获取数据表。
///
/// 数据表行的类型。
/// 要获取的数据表。
public DataTableBase GetDataTable(Type dataRowType)
{
return m_DataTableManager.GetDataTable(dataRowType);
}
///
/// 获取数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 要获取的数据表。
public IDataTable GetDataTable(string name) where T : IDataRow
{
return m_DataTableManager.GetDataTable(name);
}
///
/// 获取数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 要获取的数据表。
public DataTableBase GetDataTable(Type dataRowType, string name)
{
return m_DataTableManager.GetDataTable(dataRowType, name);
}
///
/// 获取所有数据表。
///
public DataTableBase[] GetAllDataTables()
{
return m_DataTableManager.GetAllDataTables();
}
///
/// 获取所有数据表。
///
/// 所有数据表。
public void GetAllDataTables(List results)
{
m_DataTableManager.GetAllDataTables(results);
}
///
/// 创建数据表。
///
/// 数据表行的类型。
/// 要创建的数据表。
public IDataTable CreateDataTable() where T : class, IDataRow, new()
{
return CreateDataTable(null);
}
///
/// 创建数据表。
///
/// 数据表行的类型。
/// 要创建的数据表。
public DataTableBase CreateDataTable(Type dataRowType)
{
return CreateDataTable(dataRowType, null);
}
///
/// 创建数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 要创建的数据表。
public IDataTable CreateDataTable(string name) where T : class, IDataRow, new()
{
IDataTable dataTable = m_DataTableManager.CreateDataTable(name);
DataTableBase dataTableBase = (DataTableBase)dataTable;
dataTableBase.ReadDataSuccess += OnReadDataSuccess;
dataTableBase.ReadDataFailure += OnReadDataFailure;
if (m_EnableLoadDataTableUpdateEvent)
{
dataTableBase.ReadDataUpdate += OnReadDataUpdate;
}
if (m_EnableLoadDataTableDependencyAssetEvent)
{
dataTableBase.ReadDataDependencyAsset += OnReadDataDependencyAsset;
}
return dataTable;
}
///
/// 创建数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 要创建的数据表。
public DataTableBase CreateDataTable(Type dataRowType, string name)
{
DataTableBase dataTable = m_DataTableManager.CreateDataTable(dataRowType, name);
dataTable.ReadDataSuccess += OnReadDataSuccess;
dataTable.ReadDataFailure += OnReadDataFailure;
if (m_EnableLoadDataTableUpdateEvent)
{
dataTable.ReadDataUpdate += OnReadDataUpdate;
}
if (m_EnableLoadDataTableDependencyAssetEvent)
{
dataTable.ReadDataDependencyAsset += OnReadDataDependencyAsset;
}
return dataTable;
}
///
/// 销毁数据表。
///
/// 数据表行的类型。
/// 是否销毁数据表成功。
public bool DestroyDataTable() where T : IDataRow, new()
{
return m_DataTableManager.DestroyDataTable();
}
///
/// 销毁数据表。
///
/// 数据表行的类型。
/// 是否销毁数据表成功。
public bool DestroyDataTable(Type dataRowType)
{
return m_DataTableManager.DestroyDataTable(dataRowType);
}
///
/// 销毁数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 是否销毁数据表成功。
public bool DestroyDataTable(string name) where T : IDataRow
{
return m_DataTableManager.DestroyDataTable(name);
}
///
/// 销毁数据表。
///
/// 数据表行的类型。
/// 数据表名称。
/// 是否销毁数据表成功。
public bool DestroyDataTable(Type dataRowType, string name)
{
return m_DataTableManager.DestroyDataTable(dataRowType, name);
}
///
/// 销毁数据表。
///
/// 数据表行的类型。
/// 要销毁的数据表。
/// 是否销毁数据表成功。
public bool DestroyDataTable(IDataTable dataTable) where T : IDataRow
{
return m_DataTableManager.DestroyDataTable(dataTable);
}
///
/// 销毁数据表。
///
/// 要销毁的数据表。
/// 是否销毁数据表成功。
public bool DestroyDataTable(DataTableBase dataTable)
{
return m_DataTableManager.DestroyDataTable(dataTable);
}
private void OnReadDataSuccess(object sender, ReadDataSuccessEventArgs e)
{
m_EventComponent.Fire(this, LoadDataTableSuccessEventArgs.Create(e));
}
private void OnReadDataFailure(object sender, ReadDataFailureEventArgs e)
{
Log.Warning("Load data table failure, asset name '{0}', error message '{1}'.", e.DataAssetName, e.ErrorMessage);
m_EventComponent.Fire(this, LoadDataTableFailureEventArgs.Create(e));
}
private void OnReadDataUpdate(object sender, ReadDataUpdateEventArgs e)
{
m_EventComponent.Fire(this, LoadDataTableUpdateEventArgs.Create(e));
}
private void OnReadDataDependencyAsset(object sender, ReadDataDependencyAssetEventArgs e)
{
m_EventComponent.Fire(this, LoadDataTableDependencyAssetEventArgs.Create(e));
}
}
}