实体功能介绍
官方解释:我们将游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。
先看下实体组件的参数:
EnableShowEntityUpdateEvent:是否显示实体更新事件
EnableShowEntityDependencyAssetEvent:是否显示实体加载依赖资源事件
InstanceRoot:实体组的根物体
EntityHelper:实体辅助器,可自定义实体辅助器,需继承于EntityHelperBase。主要功能为实例化、创建、释放实体的逻辑。
EntityGroupHelper:实体组辅助器,可自定义实体辅助器,需继承于EntityGroupHelperBase。目前没啥实际的功能,也想不到需要扩展的需求。
EntityGroups:实体组,实体使用前需要先在此处分组,设置如下属性
1、entityGroupName 实体组名称。
2、instanceAutoReleaseInterval 实体实例对象池自动释放可释放对象的间隔秒数。
3、instanceCapacity 实体实例对象池容量。
4、instanceExpireTime 实体实例对象池对象过期秒数。
5、instancePriority 实体实例对象池的优先级。
实体组的属性对应实体的生命周期如下
instanceCapacity参数解释
对象池容量指的是最小稳定容量。创建实体时,与对象池容量无关,业务逻辑有创建的需求时即可创建。影藏实体时,与对象池容量有关,影藏后如果实体数量大于对象池容量,则立即销毁刚才影藏的实体。如果小于或等于则保留,等待过期。
注意:实体影藏后,如果有创建的需要,会直接结束实体的生命周期,进入下一个实体的生命周期。
实体使用
我们以Demo的小行星实体为例
实体及属性表设置
首先把制作的实体放在如下目录
在实体表中添加小行星资源名称,以及编号
小行星额外有一个小行星表Asteroid
Entity实体表和Asteroid小行星表是我们需要关注的。
点击下图按钮会创建bytes文件以及数据表(实体表、小行星表)对应的属性类(DR类)
DR类中的属性数据是原始数据表的行数据
创建实体数据类及逻辑类
Demo里面新建了AsteroidData小行星数据类,对DR类数据进行了封装
Asteroid是小行星的逻辑类,可用于处理小行星生成、死亡、回收、显示、轮询生命周期逻辑以及实体间的碰撞出发等业务逻辑。
生成实体数据
预加载流程ProcedurePreload中会预先加载我们所需的数据表,表名需添加到DataTableNames数组里面。
public static readonly string[] DataTableNames = new string[]
{
"Aircraft",
"Armor",
"Asteroid",
"Entity",
"Music",
"Scene",
"Sound",
"Thruster",
"UIForm",
"UISound",
"Weapon",
};
如下是加载数据表代码
private void LoadDataTable(string dataTableName)
{
//dataTableAssetName:路径名带后缀(从Assets开始)
string dataTableAssetName = AssetUtility.GetDataTableAsset(dataTableName, true);
m_LoadedFlag.Add(dataTableAssetName, false);
GameEntry.DataTable.LoadDataTable(dataTableName, dataTableAssetName, this);
}
获取实体数据,生成实体
//获取小行星数据表
IDataTable dtAsteroid = GameEntry.DataTable.GetDataTable();
//获取小行星数据表对应小行星编号的数据
DRAsteroid drAsteroid = dtAsteroid.GetDataRow(TypeId);//TypeId为小行星编号
下面是显示实体的代码
/// <summary>
/// 显示实体。
/// </summary>
/// <param name="entityId">实体编号。</param>
/// <param name="entityLogicType">实体逻辑类型。</param>
/// <param name="entityAssetName">实体资源名称。</param>
/// <param name="entityGroupName">实体组名称。</param>
/// <param name="priority">加载实体资源的优先级。</param>
/// <param name="userData">用户自定义数据。</param>
public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName, int priority, object userData)
{
if (entityLogicType == null)
{
Log.Error("Entity type is invalid.");
return;
}
m_EntityManager.ShowEntity(entityId, entityAssetName, entityGroupName, priority, ShowEntityInfo.Create(entityLogicType, userData));
}
需要的参数有实体编号、实体逻辑类、实体资源路径及名称、实体组名称。
如下EntityExtension脚本对于实体的显示做了扩展封装,我们不需要传入路径,名称等内容
public static void ShowAsteroid(this EntityComponent entityCompoennt, AsteroidData data)
{
entityCompoennt.ShowEntity(typeof(Asteroid), "Asteroid", Constant.AssetPriority.AsteroiAsset, data);
}
private static void ShowEntity(this EntityComponent entityComponent, Type logicType, string entityGroup, int priority, EntityData data)
{
if (data == null)
{
Log.Warning("Data is invalid.");
return;
}
IDataTable<DREntity> dtEntity = GameEntry.DataTable.GetDataTable<DREntity>();
DREntity drEntity = dtEntity.GetDataRow(data.TypeId);
if (drEntity == null)
{
Log.Warning("Can not load entity id '{0}' from data table.", data.TypeId.ToString());
return;
}
entityComponent.ShowEntity(data.Id, logicType, AssetUtility.GetEntityAsset(drEntity.AssetName), entityGroup, priority, data);
}
最终我们创建小行星实体,只需要如下一行代码,只需传入小行星数据类的实体ID和实体编号即可,实体ID从实体组件中获取,确保每一个实体的ID不会重复。实体编号则通过数据表唯一对应了实体的名称。
GameEntry.Entity.ShowAsteroid(new AsteroidData(GameEntry.Entity.GenerateSerialId(), 60002));
影藏实体
有两种方式,可传入ID,也可传入实体逻辑类。创建实体时,逻辑类会挂载在实体上。
GameEntry.Entity.HideEntity(Id);
GameEntry.Entity.HideEntity(entity); //entity为Entity类、继承了Entity的类文章来源:https://www.toymoban.com/news/detail-742885.html
获取实体
实体唯一确定的是ID,可以通过ID从实体组件获取创建的实体。
GameEntry.Entity.GetEntity(Id);文章来源地址https://www.toymoban.com/news/detail-742885.html
到了这里,关于Unity Game FrameWork—模块使用—Entity实体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!