Unity3d+Gameframework:entity实体代码分析,基于StarForce
游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。
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相关推荐
- 开源项目kcws代码分析--基于深度学习的分词技术
http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...
- 红橙Darren视频笔记 view的绘制流程(上) onMeasure测量代码分析 基于API27
一.准备工作Activity的onCreate和onResume调用过程 从ActivityThread的handleLaunchActivity开始进行代码跟踪 private void handl ...
- 慢慢欣赏linux之串口驱动代码分析 - 基于powerpc 2.6.x版本
串口驱动分两阶段初始化 第一阶段 串口驱动没有初始化前的准备工作,包括设备树的解析,platform设备注册 asmlinkage void __init start_kernel(void) ...
- 微型项目实践(6):Business层代码分析——实体类的生成策略
上一篇中,我们分析了实体类的基类Entity,这一篇中,我们就分析一下基于该类的实体类. 每一个实体类都会有两个文件组成,我们以BlogClass为例,该类包含两个文件:BlogClass.cs和Bl ...
- GameFramework:资源热更代码分析,检查版本信息,下载版本文件,校验版本文件,得到更新文件数量,下载文件,TaskPool
资源下载流程图 流程跳转的日志 版本信息-版本检测-下载版本列表-下载散文件代码分析 进入ProcedureCheckVersion.OnEnter流程,进行task请求,userData为StarF ...
- 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...
基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...
- GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析
GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 文章目录 GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 SetUp,库声明 数据准 ...
- 基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程
基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程在线看Android源代码网址: http://aospxref.com/a ...
- [solidity语法学习二]基于Remix以太坊的BlindAuction模板代码分析
前言 编译环境:Remix. 代码来源:SolidityDoc. 疑难解决来源:Ethereum gitter. 例子三参考:例图. 以太币单位换算:以太币单位. 本文主要由三个例子构成.分别是Sim ...
- Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)
最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门.这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析.一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触 ...
最新文章
- html 多项选择,选项标签中的HTML多字段选择
- Struts初步知识
- 洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径
- bcp 不能调用where 子句_技术分享 || Mysql中IS NULL、IS NOT NULL不能走索引?
- ELV局部视图与差分隐私【敏感度到底怎么理解】【下】
- NDK 在 Android studio如何使用(Android studio NDK)
- 【mybatis】mybatis中 if test=等于的条件怎么写
- java arraylist用法_Java入门系列:实例讲解ArrayList用法
- DoraHacks的笔记
- 金仓数据库 KingbaseGIS使用手册(2. 简介)
- 2022年朝阳区科技创新课之“产品创新与成果转化”训练营活动圆满结束
- 【WZOI】AC大礼包(1~130)
- python3.6 opencv3.4.3使用surf特征出错【解决方案】
- Ubuntu Desktop 显示文件路径
- 鸿蒙初辟原无姓,打破顽冥须悟空
- ANSYS渡槽槽身动水压力的施加(2)——U型渡槽
- Qt入门教程【QObject篇】属性系统
- Netfilter源码分析
- 杂谈——什么是Google Fuchsia ?
- QT实现局域网聊天工具(带UDP文件传输)
热门文章
- fastai v1环境搭建:Win10 MX250 CUDA10.1 cuDNN Pytorch1.0.0 Fastai v1安(bi)装(keng)指南
- js下载文件 阿星小栈
- WIFI通信-笔记整理
- ubuntu检查端口是否开启_技术|使用 nc 命令检查远程端口是否打开
- 二维码扫描枪中文开发指导
- 虚拟机安装linux的\/root,pt深海湛蓝爆屏图 -官网
- 关于linux网络编程的项目,linux网络编程入门
- 微信小游戏排行榜功能快速开发教程
- Rdd,DataFrame和DataSet的区别
- unfinished application