UGF学习5-实体

1. 什么是实体

我们将游戏场景中,动态创建的一切物体定义为实体。

此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。

实体使用结束后可以不立刻销毁,从而等待下一次重新使用。

在GF里,实体有以下几个特性:

  • 所有的游戏物体都被当做实体
  • 实体(Entity)与实体逻辑(EntityLogic)分离
    实体逻辑通过组件的形式组装到实体身上。
  • 实体逻辑是创造实体的时候动态添加的。

实体组件的用法

EntityComponent的使用

  • 打开实体
    ShowEntity<自定义实体逻辑脚本>(int id, string path, string groupName);

    • id: 实体ID
    • path:实体预制体路径
    • groupName:实体组名

    注意:
    若id不同,会生成并打开新实体
    若id相同,会打开旧实体并数据不变

  • 隐藏实体

    • HideEntity(int id);
      id: 实体ID

    • HideEntity(实体对象);
      可以是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