Unity Game FrameWork—模块使用—Entity实体

实体功能介绍

官方解释:我们将游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。
先看下实体组件的参数:
[图片]
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的类

获取实体

实体唯一确定的是ID,可以通过ID从实体组件获取创建的实体。
GameEntry.Entity.GetEntity(Id);

猜你喜欢

转载自blog.csdn.net/qq_37619255/article/details/129624414
今日推荐