游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。

EntityGroup

内部包含对象池

实体加载成功订阅

GameEntry.Event.Subscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
protected virtual void OnShowEntitySuccess(object sender, GameEventArgs e){ShowEntitySuccessEventArgs ne = (ShowEntitySuccessEventArgs)e;if (ne.EntityLogicType == typeof(MyAircraft)){m_MyAircraft = (MyAircraft)ne.Entity.Logic;}}

EntityManager

GameFramework.Entity.EntityManager.Update
实体组轮询,变为单一实体OnUpdate

创建实体

StarForce.GameBase.Initialize
与加载UI类似
GameFramework.Entity.EntityManager.ShowEntity

GameFramework.Entity.EntityManager.ShowEntity EntityInstanceObject entityInstanceObject = entityGroup.SpawnEntityInstanceObject(entityAssetName);if (entityInstanceObject == null){int serialId = ++m_Serial;m_EntitiesBeingLoaded.Add(entityId, serialId);m_ResourceManager.LoadAsset(entityAssetName, priority, m_LoadAssetCallbacks, ShowEntityInfo.Create(serialId, entityId, entityGroup, userData));return;}InternalShowEntity(entityId, entityAssetName, entityGroup, entityInstanceObject.Target, false, 0f, userData);

如果实体组中对象池能实例出来,即立即返回
否则调用资源加载
实体资源表中确定ID与asset的关系

  IDataTable<DREntity> dtEntity = GameEntry.DataTable.GetDataTable<DREntity>();DREntity drEntity = dtEntity.GetDataRow(data.TypeId);

正在加载中实体释放

public void HideEntity(int entityId, object userData){if (IsLoadingEntity(entityId)){GameFrameworkLog.Info("实体{0}正在加载等待释放", entityId);m_EntitiesToReleaseOnLoad.Add(m_EntitiesBeingLoaded[entityId]);m_EntitiesBeingLoaded.Remove(entityId);return;}

Entity

实体接口,包含被挂载,或者挂载别的方法
根据资源加载出的GameObject–》挂载Entity脚本(继承了于MonoBehaviour)

 /// <summary>/// 创建实体。/// </summary>/// <param name="entityInstance">实体实例。</param>/// <param name="entityGroup">实体所属的实体组。</param>/// <param name="userData">用户自定义数据。</param>/// <returns>实体。</returns>public override IEntity CreateEntity(object entityInstance, IEntityGroup entityGroup, object userData){GameObject gameObject = entityInstance as GameObject;Transform transform = gameObject.transform;transform.SetParent(((MonoBehaviour)entityGroup.Helper).transform);return gameObject.GetOrAddComponent<Entity>();}

实体统一设置到实体组子物体下,那么武器跟随人动如何实现

   namespace UnityGameFramework.Runtime{public sealed class Entity : MonoBehaviour, IEntity{private int m_Id;private string m_EntityAssetName;private IEntityGroup m_EntityGroup;private EntityLogic m_EntityLogic;

ObjecBase

对象基类
UI面板,资源(asset,resource),实体都是继承对象基类

EntityInstanceObject

实体实例对象,不会继承自MonoBehavior,在实体资源加载成功后调用创建
GameFramework.Entity.EntityManager.LoadAssetSuccessCallback

//实例化出来EntityInstanceObject entityInstanceObject = EntityInstanceObject.Create(entityAssetName, entityAsset, m_EntityHelper.InstantiateEntity(entityAsset), m_EntityHelper);showEntityInfo.EntityGroup.RegisterEntityInstanceObject(entityInstanceObject, true);InternalShowEntity(showEntityInfo.EntityId, entityAssetName, showEntityInfo.EntityGroup, entityInstanceObject.Target, true, duration, showEntityInfo.UserData);ReferencePool.Release(showEntityInfo);

把预制体加载完成,然后实例化后GameObject设置为实体的Target

EntityLogic

public abstract class EntityLogic : MonoBehaviour
实体逻辑基类
实体挂载好Entity,后Entity初始化时挂载逻辑处理脚本
public abstract class Entity : EntityLogic,此实体与gf实体不是同样东西(不在同个命名空间中)
创建时,通过逻辑类型就传递下去

public static void ShowMyAircraft(this EntityComponent entityComponent, MyAircraftData data){entityComponent.ShowEntity(typeof(MyAircraft), "Aircraft", Constant.AssetPriority.MyAircraftAsset, data);}

SurvivalGame

继承GameBase
游戏模式
Update中随机产生陨石实体
GameEntry.Entity.ShowAsteroid

TargetableObject

所有的实体逻辑继承
OnTriggerEnter,碰撞检测

放入到回收池,什么时候彻底去除引用

Weapon

增加武器实体,为什么能挂载人身上
武器挂载
在创建完成后,挂载在主角身上
StarForce.Weapon.OnShow

protected override void OnShow(object userData){base.OnShow(userData);m_WeaponData = userData as WeaponData;GameEntry.Entity.AttachEntity(Entity, m_WeaponData.OwnerId, AttachPoint);}

AttachEntity

附加子实体GameFramework.Entity.EntityManager.AttachEntity

             IEntity childEntity = childEntityInfo.Entity;IEntity parentEntity = parentEntityInfo.Entity;DetachEntity(childEntity.Id, userData);childEntityInfo.ParentEntity = parentEntity;parentEntityInfo.AddChildEntity(childEntity);parentEntity.OnAttached(childEntity, userData);childEntity.OnAttachTo(parentEntity, userData);

在childEntity.OnAttachTo(parentEntity, userData);设置unity 父子物体关系

 protected internal virtual void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData){CachedTransform.SetParent(parentTransform);}

InternalHideEntity隐藏实体

//先隐藏子实体while (entityInfo.ChildEntityCount > 0){IEntity childEntity = entityInfo.GetChildEntity();HideEntity(childEntity.Id, userData);}//把自己从父实体上移除IEntity entity = entityInfo.Entity;DetachEntity(entity.Id, userData);entityInfo.Status = EntityStatus.WillHide;entity.OnHide(m_IsShutdown, userData);entityInfo.Status = EntityStatus.Hidden;//实体组移除EntityGroup entityGroup = (EntityGroup)entity.EntityGroup;entityGroup.RemoveEntity(entity);//放入到回收队列m_RecycleQueue.Enqueue(entityInfo);

GameFramework.Entity.EntityManager.Update 中轮询处理实体进入实体组的对象池

//处理回收队列的实体while (m_RecycleQueue.Count > 0){EntityInfo entityInfo = m_RecycleQueue.Dequeue();IEntity entity = entityInfo.Entity;EntityGroup entityGroup = (EntityGroup)entity.EntityGroup;entityInfo.Status = EntityStatus.WillRecycle;entity.OnRecycle();entityInfo.Status = EntityStatus.Recycled;entityGroup.UnspawnEntity(entity); //实体组回收,相当于对象池ReferencePool.Release(entityInfo);}

Unity3d+Gameframework:entity实体代码分析,基于StarForce相关推荐

  1. 开源项目kcws代码分析--基于深度学习的分词技术

    http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...

  2. 红橙Darren视频笔记 view的绘制流程(上) onMeasure测量代码分析 基于API27

    一.准备工作Activity的onCreate和onResume调用过程 从ActivityThread的handleLaunchActivity开始进行代码跟踪 private void handl ...

  3. 慢慢欣赏linux之串口驱动代码分析 - 基于powerpc 2.6.x版本

    串口驱动分两阶段初始化 第一阶段  串口驱动没有初始化前的准备工作,包括设备树的解析,platform设备注册 asmlinkage void __init start_kernel(void)    ...

  4. 微型项目实践(6):Business层代码分析——实体类的生成策略

    上一篇中,我们分析了实体类的基类Entity,这一篇中,我们就分析一下基于该类的实体类. 每一个实体类都会有两个文件组成,我们以BlogClass为例,该类包含两个文件:BlogClass.cs和Bl ...

  5. GameFramework:资源热更代码分析,检查版本信息,下载版本文件,校验版本文件,得到更新文件数量,下载文件,TaskPool

    资源下载流程图 流程跳转的日志 版本信息-版本检测-下载版本列表-下载散文件代码分析 进入ProcedureCheckVersion.OnEnter流程,进行task请求,userData为StarF ...

  6. 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...

    基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...

  7. GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析

    GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 文章目录 GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 SetUp,库声明 数据准 ...

  8. 基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程

    基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程在线看Android源代码网址: http://aospxref.com/a ...

  9. [solidity语法学习二]基于Remix以太坊的BlindAuction模板代码分析

    前言 编译环境:Remix. 代码来源:SolidityDoc. 疑难解决来源:Ethereum gitter. 例子三参考:例图. 以太币单位换算:以太币单位. 本文主要由三个例子构成.分别是Sim ...

  10. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)

    最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门.这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析.一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触 ...

最新文章

  1. html 多项选择,选项标签中的HTML多字段选择
  2. Struts初步知识
  3. 洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径
  4. bcp 不能调用where 子句_技术分享 || Mysql中IS NULL、IS NOT NULL不能走索引?
  5. ELV局部视图与差分隐私【敏感度到底怎么理解】【下】
  6. NDK 在 Android studio如何使用(Android studio NDK)
  7. 【mybatis】mybatis中 if test=等于的条件怎么写
  8. java arraylist用法_Java入门系列:实例讲解ArrayList用法
  9. DoraHacks的笔记
  10. 金仓数据库 KingbaseGIS使用手册(2. 简介)
  11. 2022年朝阳区科技创新课之“产品创新与成果转化”训练营活动圆满结束
  12. 【WZOI】AC大礼包(1~130)
  13. python3.6 opencv3.4.3使用surf特征出错【解决方案】
  14. Ubuntu Desktop 显示文件路径
  15. 鸿蒙初辟原无姓,打破顽冥须悟空
  16. ANSYS渡槽槽身动水压力的施加(2)——U型渡槽
  17. Qt入门教程【QObject篇】属性系统
  18. Netfilter源码分析
  19. 杂谈——什么是Google Fuchsia ?
  20. QT实现局域网聊天工具(带UDP文件传输)

热门文章

  1. fastai v1环境搭建:Win10 MX250 CUDA10.1 cuDNN Pytorch1.0.0 Fastai v1安(bi)装(keng)指南
  2. js下载文件 阿星小栈
  3. WIFI通信-笔记整理
  4. ubuntu检查端口是否开启_技术|使用 nc 命令检查远程端口是否打开
  5. 二维码扫描枪中文开发指导
  6. 虚拟机安装linux的\/root,pt深海湛蓝爆屏图 -官网
  7. 关于linux网络编程的项目,linux网络编程入门
  8. 微信小游戏排行榜功能快速开发教程
  9. Rdd,DataFrame和DataSet的区别
  10. unfinished application