//------------------------------------------------------------ // 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)); } } }