【Unity】 HTFramework框架(二十)Entity实体管理器

更新日期:2019年9月27日。
Github源码:[点我获取源码]

Entity管理器简介

Entity管理器用于管理全局动态创建的实体,任何一个Prefab都可以定义为一个实体,类似于UI管理器,一个实体逻辑类只能对应一个实体对象。

使用Entity管理器

创建实体对象

创建任意一个游戏对象,并创建成预制体就可以了,这就是我们的实体对象(如下的Hero)。
在这里插入图片描述

创建实体逻辑类

每一个实体对象都由一个实体逻辑类所持有,且只能是一对一的关系,如果你的设计文档中不满足这个要求(比如某个实体逻辑类必须拥有两个实体对象才能实现业务需求),那请你重新设计实体(比如尝试着将这两个实体对象合并为一个,或者为另一个多余的实体对象重新设计一个实体逻辑类)。

新建一个实体逻辑类,必须满足以下条件:
1.继承至EntityLogicBase
2.标记特性EntityResource

推荐使用快捷创建方式:
Project界面右键 -> Create -> HTFramework -> C# EntityLogic Script
在这里插入图片描述
如下图,我新建了一个名为HeroLogic的逻辑类,他持有的实体为上文创建的Hero:

/// <summary>
/// 新建实体逻辑类
/// </summary>
[EntityResource("hero", "Assets/Hero.prefab", "Hero")]
public class HeroLogic : EntityLogicBase
{
    /// <summary>
    /// 初始化
    /// </summary>
    public override void OnInit()
    {
        base.OnInit();
    }

    /// <summary>
    /// 显示实体
    /// </summary>
    public override void OnShow()
    {
        base.OnShow();
    }

    /// <summary>
    /// 隐藏实体
    /// </summary>
    public override void OnHide()
    {
        base.OnHide();
    }

    /// <summary>
    /// 销毁实体
    /// </summary>
    public override void OnDestroy()
    {
        base.OnDestroy();
    }

    /// <summary>
    /// 实体逻辑刷新
    /// </summary>
    public override void OnUpdate()
    {
        base.OnUpdate();
    }

    /// <summary>
    /// 重置实体
    /// </summary>
    public override void Reset()
    {
        base.Reset();
    }
}

实体逻辑类结构

1.EntityResource特性标记了此实体逻辑类所指向的实体对象。
第一个参数:AssetBundleName为实体对象所打入的AB包名称;
第二个参数:AssetPath为实体对象在AB包中的路径(必须指明后缀,以便于Editor模式下加载);
第三个参数:ResourcePath为实体对象在Resources中的路径;
第四个参数:useObjectPool是否使用内置对象池。

注意:当资源加载方式采用AssetBundle方式时,参数1和参数2有效;当资源加载方式采用Resources方式时,参数3有效。

2.OnInit():实体创建成功后呼叫一次,若中途销毁实体,再次创建会重新呼叫。

3.OnShow():实体显示后呼叫一次。

4.OnHide():实体隐藏后呼叫一次。

5.OnDestroy():实体销毁前呼叫一次。

6.OnUpdate():实体处于显示状态时,每帧呼叫。

创建实体

写好了实体逻辑类,并做好了实体对象,直接调用框架接口就可以快速创建实体:

    private IEnumerator Load()
    {
        //方法1
        //等待创建实体完成,实体名为【张三】,如果不指定名称默认使用逻辑类名
        yield return Main.m_Entity.CreateEntity<HeroLogic>("张三");
        //通过名称获取实体
        HeroLogic hero = Main.m_Entity.GetEntity<HeroLogic>("张三");
        hero.DoSomething();

        //方法2
        //等待创建实体完成,实体名为【张三】
        yield return Main.m_Entity.CreateEntity<HeroLogic>("张三", null, (obj) =>
        {
            obj.DoSomething();
        });
    }

显示、隐藏实体

        //显示实体 _hero
        Main.m_Entity.ShowEntity(_hero);

        //隐藏实体 _hero
        Main.m_Entity.HideEntity(_hero);

        //显示所有 HeroLogic 实体
        Main.m_Entity.ShowEntities<HeroLogic>();

销毁实体

        //销毁实体 _hero
        Main.m_Entity.DestroyEntity(_hero);

        //销毁所有 HeroLogic 实体
        Main.m_Entity.DestroyEntities<HeroLogic>();

获取实体对象

在实体逻辑类中获取实体对象,只需要调用Entity字段就可以了:

    /// <summary>
    /// 初始化
    /// </summary>
    public override void OnInit()
    {
        base.OnInit();

        Entity.FindChildTran("Attack").GetComponent<Attack>().Init();
    }

强制定义实体逻辑类与实体对象的对应关系

根据一个实体逻辑类对应一个实体对象的关系,每一个实体逻辑类所持有的实体对象由EntityResource特性标记,但在某些时候,对于一些简单的程序,我们既不想使用AB包模式,也不想动态Resources加载,我们就想让某个实体逻辑类使用某个特定的实体对象。
这就需要使用Define Entity了,在检视面板可以直接指定某个实体逻辑类使用某个实体对象,该实体对象可以是Scene中的游戏物体,也可以是Project中的预制体。
如下,我强制定义了HeroLogic类始终使用Hero作为实体对象,无论他的EntityResource标记如何改变。
在这里插入图片描述

运行时检视面板

在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:
在这里插入图片描述
1.展示已创建的所有实体以及处于回收对象池中的所有实体,点击Show按钮可以模拟显示该实体,点击Hide按钮可以模拟隐藏该实体。

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/101541066