更新日期: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按钮可以模拟隐藏该实体。