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

这篇具有很好参考价值的文章主要介绍了Unity Game FrameWork—模块使用—Entity实体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实体功能介绍

官方解释:我们将游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。
先看下实体组件的参数:
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
EnableShowEntityUpdateEvent:是否显示实体更新事件
EnableShowEntityDependencyAssetEvent:是否显示实体加载依赖资源事件
InstanceRoot:实体组的根物体
EntityHelper:实体辅助器,可自定义实体辅助器,需继承于EntityHelperBase。主要功能为实例化、创建、释放实体的逻辑。
EntityGroupHelper:实体组辅助器,可自定义实体辅助器,需继承于EntityGroupHelperBase。目前没啥实际的功能,也想不到需要扩展的需求。
EntityGroups:实体组,实体使用前需要先在此处分组,设置如下属性
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
1、entityGroupName 实体组名称。
2、instanceAutoReleaseInterval 实体实例对象池自动释放可释放对象的间隔秒数。
3、instanceCapacity 实体实例对象池容量。
4、instanceExpireTime 实体实例对象池对象过期秒数。
5、instancePriority 实体实例对象池的优先级。
实体组的属性对应实体的生命周期如下
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
instanceCapacity参数解释
对象池容量指的是最小稳定容量。创建实体时,与对象池容量无关,业务逻辑有创建的需求时即可创建。影藏实体时,与对象池容量有关,影藏后如果实体数量大于对象池容量,则立即销毁刚才影藏的实体。如果小于或等于则保留,等待过期。
注意:实体影藏后,如果有创建的需要,会直接结束实体的生命周期,进入下一个实体的生命周期。

实体使用

我们以Demo的小行星实体为例

实体及属性表设置

首先把制作的实体放在如下目录
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
在实体表中添加小行星资源名称,以及编号
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
小行星额外有一个小行星表Asteroid
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
Entity实体表和Asteroid小行星表是我们需要关注的。
点击下图按钮会创建bytes文件以及数据表(实体表、小行星表)对应的属性类(DR类)
DR类中的属性数据是原始数据表的行数据
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎

创建实体数据类及逻辑类

Demo里面新建了AsteroidData小行星数据类,对DR类数据进行了封装
Asteroid是小行星的逻辑类,可用于处理小行星生成、死亡、回收、显示、轮询生命周期逻辑以及实体间的碰撞出发等业务逻辑。
gameframework 实体,Unity Game FrameWork学习笔记,unity,c#,游戏引擎
生成实体数据
预加载流程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);文章来源地址https://www.toymoban.com/news/detail-742885.html

到了这里,关于Unity Game FrameWork—模块使用—Entity实体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C# .NET 】使用 Entity Framework Core 操作sqlite数据库

    添加包 EF Core design package   NuGet Gallery | Home 使用用于 EF Core 迁移和现有数据库中的反向工程(基架)的工具需要安装相应的工具包: 可在 Visual Studio 包管理器控制台中使用的 PowerShell 工具的 Microsoft.EntityFrameworkCore.Tools 跨平台命令行工具的 dotnet-ef 和 Microsoft.EntityFramewor

    2024年02月14日
    浏览(44)
  • .NET Core Entity Framework Core 多线程中使用Context报错问题

    本文主要介绍Entity Framework Core在ASP.NET Core中,多个请求中使用同一个context问题,Entity Framework Core上下文(context)不能在多线程中使用,多个请求其实就是多个线程。报错信息:InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members a

    2024年02月07日
    浏览(58)
  • GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

            游戏在转换场景的时候,需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到)。         所以,如果这一小段时间,画面就卡在这里,啥也做不了,玩家也不知道啥时候能

    2024年02月02日
    浏览(38)
  • Springboot实体类entity相关知识点详解

    目录 entity实体类相关知识点详解:       解释1:上面代码使用的注解是 Lombok 提供的注解,用于简化实体类的开发。       解释2:属性的注释自动生成问题:                解释3:java序列化反序列化,实体类实现Serializable接口:                     java序列化和反

    2024年02月08日
    浏览(30)
  • Entity Framework的最佳实践一

    Entity Framework (EF) Core 是轻量化、可扩展、 开源 和跨平台版的常用 Entity Framework 数据访问技术。 EF Core 可用作对象关系映射程序 (O/RM) EF Core API链接 Github地址   DbContext 的生存期从创建实例时开始,并在 释放 实例时结束。 通过依赖关系 为每个请求创建一个 ApplicationDbContext 

    2024年02月06日
    浏览(24)
  • Spring Data访问Elasticsearch----实体回调Entity Callbacks

    Spring Data基础结构提供了钩子,用于在调用某些方法之前和之后修改实体。这些所谓的EntityCallback实例提供了一种方便的方式来检查并可能以回调风格修改实体。 EntityCallback看起来很像一个专门的ApplicationListener。一些Spring Data模块发布特定于存储的事件(如BeforeSaveEvent),允许

    2024年03月21日
    浏览(33)
  • Java中的实体类(entity class)和model

    编写代码时,经常会遇到一些具有“现实”意义的“ 个体 ”,eg:一个用户、一首歌曲、一条评论等。它们在逻辑上是完整的整体,具有相似的结构,但是却因为“ 属性 ”的不同而不同。 下面看一个典型的Entity class: 总结: 一个Entity类,代表了某一种“个体”,类中的属

    2024年02月16日
    浏览(29)
  • 【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 )

    对于 Room 框架 来说 , 使用 Java 语言 开发和使用 Kotlin 语言 开发 , 需要在 build.gradle 构建脚本 中进行不同的配置 , 主要有以下两个配置不同 : 应用的插件不同 ; 导入依赖库方式不同 ; 应用插件 应用的插件区别 : 如果使用 Java 语言开发 , 只需要导入 android 插件 ; 如果使用 Kotli

    2024年02月05日
    浏览(46)
  • XML External Entity-XXE-XML实体注入

    概念 本课程介绍如何执行 XML 外部实体攻击以及如何滥用和防范该攻击。 目标 用户应该具备 XML 的基本知识 用户将了解 XML 解析器的工作原理 用户将学习如何执行 XXE 攻击以及如何防范它。 XML 实体允许定义标签,在解析 XML 文档时这些标签将被内容替换。一般来说,实体分

    2024年02月06日
    浏览(28)
  • Dynamics 365: 详解虚实体(Virtual Entity) 从0到1

    从Dynamics 365 for Customer Engagement 9.0开始,虚实体通过在Dynamics 365 Customer Engagement中无缝地将数据表示为实体,实现了外部系统中的数据集成。它无需数据复制,通常也无需自定义编码。 虚实体有如下的限制,但除了下面的这些限制外,它和其它的那些自定义实体没有区别: 数

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包