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

推荐阅读

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

一、前言

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

二、正文

2-1、介绍

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

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

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

2-2、使用说明

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

(1)准备好预制体:

(2)在数据表Entiry中添加实体配置:

(3)生成实体

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

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

csharp 复制代码
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)使用(访问)实体

csharp 复制代码
var myAircraft = GameEntry.Entity.GetEntity(serialId);
var myAircraft = GameEntry.Entity.GetEntity("PlayerShip");

(5)删除(回收)实体

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

csharp 复制代码
GameEntry.Entity.HideEntity(serialId);
GameEntry.Entity.HideEntity(myAircraft);

2-3、实现及代码分析

Entity.cs

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

  • 实体游戏对象身上会挂载Entity组件。
  • 还有一个自定义逻辑类EntityLogic组件。
  • 每个实体Entity必须有一个EntityData属性,用来存储信息。
csharp 复制代码
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的子类。

csharp 复制代码
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去真正释放内存。

csharp 复制代码
//申请内存,其实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之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
相关推荐
醇醛酸醚酮酯24 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
jioulongzi29 分钟前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
Mr_Xuhhh2 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
纳兰青华2 小时前
bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
java·开发语言·spring·list
好开心啊没烦恼2 小时前
Python 数据分析:DataFrame,生成,用字典创建 DataFrame ,键值对数量不一样怎么办?
开发语言·python·数据挖掘·数据分析
liulilittle2 小时前
VGW 虚拟网关用户手册 (PPP PRIVATE NETWORK 基础设施)
开发语言·网络·c++·网关·智能路由器·路由器·通信
Devil枫2 小时前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer2 小时前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
漫游者Nova2 小时前
虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕
ue5·游戏引擎·虚幻·游戏开发完整教程·恐怖游戏开发