【GameFramework框架内置模块】6、实体(Entity)

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551

二、正文

2-1、介绍

实体Entity就是一个实体的基本单元,类似于Unity的GameObject对象本体,然后这个本体上面附加其他各种各样组件,才能实现各种各样的功能。

一般需要在游戏运行时动态加载的游戏对象,比如怪物、武器、子弹、特效,都需要给这个物体挂载一个实体Entity,这样的话就可以方便的对实例出来的对象进行管理。

下面就来看一下如何使用吧。

2-2、使用说明

这里以示例项目StarForce做演示。

(1)准备好预制体:
在这里插入图片描述
(2)在数据表Entiry中添加实体配置:
在这里插入图片描述
(3)生成实体

// GameEntry.Entity.GenerateSerialId() :生成Entity唯一id
// 10000:在Entity表中配置的类型id
GameEntry.Entity.ShowMyAircraft(new MyAircraftData(GameEntry.Entity.GenerateSerialId(), 10000)
{Name = "My Aircraft",Position = Vector3.zero,
});

(3)创建实体的监听回调

GameEntry.Event.Unsubscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
GameEntry.Event.Unsubscribe(ShowEntityFailureEventArgs.EventId, OnShowEntityFailure);
protected virtual void OnShowEntitySuccess(object sender, GameEventArgs e)
{
}
protected virtual void OnShowEntityFailure(object sender, GameEventArgs e)
{
}

(4)使用(访问)实体

var myAircraft = GameEntry.Entity.GetEntity(serialId);
var myAircraft = GameEntry.Entity.GetEntity("PlayerShip");

(5)删除(回收)实体
实体是无法删除的,只能通过对象池自动释放。

GameEntry.Entity.HideEntity(serialId);
GameEntry.Entity.HideEntity(myAircraft);

2-3、实现及代码分析

Entity.cs

实例化的物体本身不需要挂载脚本的,等到运行时,用Entity创建实体后会自动挂载。

  • 实体游戏对象身上会挂载Entity组件。
  • 还有一个自定义逻辑类EntityLogic组件。
  • 每个实体Entity必须有一个EntityData属性,用来存储信息。
namespace UnityGameFramework.Runtime
{/// 实体。public sealed class Entity : MonoBehaviour, IEntity{/// 获取实体编号。int Id/// 获取实体资源名称。string EntityAssetName/// 获取实体实例。object Handle/// 获取实体所属的实体组。IEntityGroup EntityGroup/// 实体初始化。void OnInit(int entityId, string entityAssetName, IEntityGroup entityGroup, bool isNewInstance, object userData);/// 实体回收。void OnRecycle();/// 实体显示。void OnShow(object userData);/// 实体隐藏。void OnHide(bool isShutdown, object userData);/// 实体附加子实体。void OnAttached(IEntity childEntity, object userData);/// 实体解除子实体。void OnDetached(IEntity childEntity, object userData);/// 实体附加子实体。void OnAttachTo(IEntity parentEntity, object userData);/// 实体解除子实体。void OnDetachFrom(IEntity parentEntity, object userData);/// 实体轮询。void OnUpdate(float elapseSeconds, float realElapseSeconds);}
}

EntityLogic.cs

EntityLogic是一个抽象类,继承子类使用,所有的实体继承于它。

StarForce中,所有的战机、子弹等实体都继承自StarForce.Entity,而StarForce.Entity就是UGF.EntityLogic的子类。

namespace UnityGameFramework.Runtime
{public abstract class EntityLogic : MonoBehaviour{private Entity m_Entity = null;private Transform m_CachedTransform = null;...protected virtual void OnInit(object userData);protected virtual void OnRecycle(object userData);protected virtual void OnShow(object userData);protected virtual void OnHide(object userData);protected virtual void OnAttached(object userData);protected virtual void OnDetached(object userData);...}
}

最后再聊一下GF的实体Entity管理,GF的实体Entity管理,其实就是对GameObject的管理。

开始从Prefab资源路径创建对应的实体,然后挂载Entity类来做后续的调用。

而Entity实体的调用的实现都是EntityLogic实现的,所以都要继承于这个类。

EntityInstanceObject去统一类型,通过EntityGroup进行实体的显示控制。

EntityGroup就是一个ObjectPool<EntityInstanceObject>(groupName),而Entity则通过包了层EntityInfo在列表中进行跟踪。

而对象池的实现其实很简单。就是从内存中创建一个Object,放队列里不释放,直到外部显示的调用,Remove函数去减少池子里对象,才会真正删除对象。留给GC去真正释放内存。

//申请内存,其实Acquire内部还是简单的New
var c1 =  Acquire<ClassA>();
var c2 = Acquire<ClassA>();
var c3 = Acquire<ClassA>();//  Release 将类放进队列避免被释放掉。并执行Clear(这边是代码,GF在外面又包了一层。一层属于ReferenceCollection)
Release<ClassA>(c3);// 真正的释放对应的内存。
Remove<ClassA>(1);

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496770.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React UI框架Antd 以及 如何按需引入css样式配置(以及过程中各种错误处理方案)

一、react UI框架Antd使用 1.下载模块 npm install antd -S 2.引入antd的样式 import ../node_modules/antd/dist/reset.css; 3.局部使用antd组件 import {Button, Calendar} from antd; import {PieChartTwoTone} from ant-design/icons; {/* 组件汉化配置 */} import l…

PyTorch概述(六)---View

Tensor.view(*shape)-->Tensor 返回一个新的张量同之前的张量具有相同的数据&#xff0c;但是具有不同的形状&#xff1b;返回的张量同之前的张量共享相同的数据&#xff0c;必须具有相同数目的元素&#xff0c;可能具有不同的形状&#xff1b;对于经过view操作的张量&…

Java 反射机制

​ 更多内容&#xff0c;前往IT-BLOG ​ 反射Reflection被视为动态语言的关键&#xff0c;反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构…

uniapp腾讯地图JavaScript Api,H5端和原生APP端可用

因项目需要&#xff0c;在uniapp中集成使用腾讯地图&#xff0c;为了方便维护&#xff0c;希望通过一套代码实现H5和APP同时可用。H5显示相对简单&#xff0c;APP端比较麻烦&#xff0c;记录下实现过程 一、集成步骤 1.使用 renderjs script标签使用renderjs&#xff0c;因为…

Vue项目 快速上手(如何新建Vue项目,启动Vue项目,Vue的生命周期,Vue的常用指令)

目录 一.什么Vue框架 二.如何新建一个Vue项目 1.使用命令行新建Vue项目 2.使用图形化界面新建Vue项目 三.Vue项目的启动 启动Vue项目 1.通过VScode提供的图形化界面启动Vue项目 2.通过命令行的方式启动Vue项目 四.Vue项目的基础使用 常用指令 v-bind 和 v-model v…

SpringCloud认识微服务

文章目录 1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 微服务架构是一种架构模式&…

爬虫入门四(抽屉半自动点赞、xpath使用、动作链、打码平台、scrapy框架介绍与安装及创建项目)

文章目录 一、抽屉半自动点赞二、xpath的使用三、动作链四、打码平台介绍超级鹰打码基本测试 五、自动登录超级鹰六、scrapy框架介绍安装创建爬虫项目 一、抽屉半自动点赞 登录抽屉账号保存cookiesimport timeimport jsonfrom selenium import webdriverfrom selenium.webdrive…

c# 异常处理

异常类 .NET Framework 类库中的所有异常都派生于 Exception 类&#xff0c;异常包括系统异常和应用异常。 默认所有系统异常派生于 System.SystemException&#xff0c;所有的应用程序异常派生于 System.ApplicationException。 系统异常一般不可预测&#xff0c;比如内存堆…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式&#xff0c;虽然它可能看起来有些复杂&#xff0c;但是一旦掌握了基本命令&#xff0c;你…

stable-diffusion-webui-forge 介绍,安装,运行

一 stable-diffusion-webui-forge 介绍 stable-diffusion-webui-forge 的作用和stable-diffusion-webui一样&#xff0c;但性能上作了优化&#xff0c;说得上是是stable-diffusion-webui优化版&#xff0c;本人在使用stable-diffusion-webui时偶尔会有内存不够报错。本人的环境…

‘grafana.ini‘ is read only ‘defaults.ini‘ is read only

docker安装grafana 关闭匿名登录情况下的免密登录遇到问题 grafana.ini is read only defaults.ini is read only 参考回答&#xff08;Grafana.ini giving me the creeps - #2 by bartweemaels - Configuration - Grafana Labs Community Forums&#xff09; 正确启动脚本 …

《系统架构设计师教程(第2版)》第5章-软件工程基础知识-05-净室软件工程(CSE)

文章目录 1. 概述2. 理论基础2.1 函数理论2.2 抽样理论 3. 技术手段3.1 增量式开发3.2 基于函数的规范与设计3.3 正确性验证3.4 统计测试 (Statistically Based Testing) 和软件认证 4. 应用与缺点1&#xff09;太理论化2&#xff09;缺少传统模块测试3&#xff09;带有传统软件…