UGF学习5-实体
1. 什么是实体
我们将游戏场景中,动态创建的一切物体定义为实体。
此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。
实体使用结束后可以不立刻销毁,从而等待下一次重新使用。
在GF里,实体有以下几个特性:
- 所有的游戏物体都被当做实体
- 实体(Entity)与实体逻辑(EntityLogic)分离
实体逻辑通过组件的形式组装到实体身上。 - 实体逻辑是创造实体的时候动态添加的。
实体组件的用法
EntityComponent的使用
打开实体
ShowEntity<自定义实体逻辑脚本>(int id, string path, string groupName);
- id: 实体ID
- path:实体预制体路径
- groupName:实体组名
注意:
若id不同,会生成并打开新实体
若id相同,会打开旧实体并数据不变隐藏实体
HideEntity(int id);
id: 实体IDHideEntity(实体对象);
可以是this该对象必须为继承了Entity的类的实例
HideAllLoadingEntities();
隐藏所有加载中的实体HideAllLoadedEntities();
隐藏所有加载完成的实体
一旦实体被隐藏,该实体的行为就不确定了,可能会被GC(销毁)
获取已激活的实体对象
GetEntity(int id);
ID:实体ID无法获得已经隐藏的实体
将实体挂到其他游戏物体上成为子物体
EntityBase
当你为实体写逻辑代码时,逻辑代码需要继承自EntityLogic类。
以下方法都可以重写在继承了EntityLogic的实体逻辑类中
该类实体的生存周期如下:
- 实体初始化
void OnInit(object userData)
- 实体显示
void OnShow(object userData)
- 每帧轮询
void OnUpdate(float elapseSeconds, float realElapseSeconds)
- 实体隐藏
void OnHide(bool isShutdown, object userData)
- 实体回收
void OnRecycle()
- 实体附加子实体
void OnAttached(EntityLogic childEntity, Transform parentTransform, object userData)
当前实体为父物体,传入实体为子物体void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
当前实体为子物体,传入实体为父物体
- 实体解除子实体
void OnDetached(EntityLogic childEntity, object userData)
当前实体为父物体,传入实体为子物体void OnDetachFrom(EntityLogic parentEntity, object userData)
当前实体为子物体,传入实体为父物体
实体组件的原理
实体基类:EntityBase
数据存储基类:EntityData
实体扩展类:EntityExtension