【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://xiahunao.cn/news/2815182.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

备战蓝桥杯————k个一组反转单链表

k个反转单链表&#xff0c;顾名思义就是k个节点为一组进行反转&#xff0c;这是一道困难的题目&#xff0c;如何解答&#xff0c;可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xf…

Spring AOP -- 面相切面编程

AOP是Spring框架的核心之一&#xff0c;AOP是一种思想&#xff0c;它的实现方法有很多&#xff0c;有Spring AOP&#xff0c;也有AspectJ、CGLIB等。我们熟知的拦截器其实就是AOP思想的一种实现方式。 AOP是一种思想&#xff0c;是对某一类事情的集中处理。 Spring AOP的实现…

【MySQL】MySQL复合查询--多表查询自连接子查询 - 副本

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询 4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询 4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------…

IAudioManager.cpp源码解读

IAudioManager.cpp源码如下&#xff1a; 源码路径&#xff1a;https://cs.android.com/android/platform/superproject/main//main:frameworks/native/services/audiomanager/IAudioManager.cpp;drc84410fbd18148d422d3581201c67f1a72a6658c4;l147?hlzh-cn /** Copyright (C)…

JavaWeb——005 请求响应 分层解耦(Postman、三层架构、IOC、DI、注解)

SpringBootWeb请求响应 这里写目录标题 SpringBootWeb请求响应前言1. 请求1.1 Postman1.1.1 介绍1.1.2 安装 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 …

Linux线程(二)----- 线程控制

目录 前言 一、线程资源区 1.1 线程私有资源 1.2 线程共享资源 1.3 原生线程库 二、线程控制接口 2.1 线程创建 2.1.1 创建一批线程 2.2 线程等待 2.3 终止线程 2.4 线程实战 2.5 其他接口 2.5.1 关闭线程 2.5.2 获取线程ID 2.5.3 线程分离 三、深入理解线程 …

WinCC如何与三菱Q系列PLC进行以太网通讯

本文主要描述人机界面WinCC如何与三菱Q系列PLC进行以太网通讯&#xff0c;主要介绍了CPU自带以太网口和扩展以太网模块两种情况以及分别使用TCP、UDP两种协议进行通讯组态步骤及其注意事项。 一、 说明 WinCC从V7.0 SP2版本开始增加了三菱以太网驱动程序&#xff0c;支持和三…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…

数字乡村建设全攻略:从0到1的构建思路与实践

数字乡村建设是推进乡村振兴战略、实现农业农村现代化的重要抓手&#xff0c;其目标是通过数字化手段提升乡村治理效能&#xff0c;优化农村公共服务&#xff0c;推动农业产业升级&#xff0c;助力农民增收致富。 以下是从0到1构建数字乡村的总体思路与实践步骤&#xff1a;一、…

Day03:Web架构OSS存储负载均衡CDN加速反向代理WAF防护

目录 WAF CDN OSS 反向代理 负载均衡 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载/端口服务/Shell反弹等 抓包技术&#xff1a…

STM32实现webserver显示数据及配置参数

之前已经在STM32中移植好了FREERTOSLWIP&#xff0c;要实现webserver配置参数及显示数据&#xff0c;需要使用到httpdcgissi cubeMx中配置以及代码实现参考&#xff1a;ECE471/571 (RTOS) STM32 FreeRTOSLwIP Example - Interactive Web Site 其实提到的将fsdata.c重命名为fs…

【视频编码\VVC】帧间预测编码基础知识

帧间预测编码概述 基本原理 利用时间相关性&#xff0c;使用邻近已编码图像像素值预测当前图像的像素值&#xff0c;能够有效去除时域冗余。目前的视频编码标准中&#xff0c;帧间预测都采用了基于块的运动补偿技术。 运动估计&#xff08;ME&#xff09;&#xff1a;当前图…

Dockerfile(2) - LABEL 指令详解

LABEL 可以为生成的镜像添加元数据标签信息&#xff0c;这些信息可以用来辅助过滤出特定镜像 LABEL <key><value> <key><value> <key><value> ... 栗子一 # key 加了 " LABEL "com.example.vendor""ACME Incorpor…

括号生成(力扣题目22)

题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()&q…

vue组件中data为什么必须是一个函数

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

LeetCode19. 删除链表的倒数第 N 个结点(C++)

LeetCode19. 删除链表的倒数第 N 个结点 题目链接代码 题目链接 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/ 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : …

2024年sCrypt编程马拉松即将开幕

BSV区块链的建设者们&#xff0c;你们在哪&#xff1f;2024年sCrypt编程马拉松即将拉开帷幕&#xff01; 2024年3月16日至17日&#xff0c;我们将在旧金山市举办一场以比特币智能合约&#xff08;即 sCrypt&#xff09;和比特币通证&#xff08;如Ordinals&#xff09;相结合为…

Redisson 3.18.0版本解决failover相关问题

前言 Redisson 在历史多个版本都出现了failover期间报错的问题并且目前没有一个版本可以完全解决这个问题&#xff0c;所以在当前使用版本3.18.0基础上做了二次开发&#xff0c;达到降低业务由于redis遇到问题导致不可用。 背景 Redisson 作为业务线使用的Redis 客户端&…

unity学习(41)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——创建发包!

1.客户端的程序结构被我精简过&#xff0c;现在去MessageManager.cs中增加一个UserHandler函数&#xff0c;根据收到的包做对应的GameInfo赋值。 2.在Model文件夹下新增一个协议文件UserProtocol&#xff0c;内容很简单。 using System;public class UserProtocol {public co…

使用Rust加速Python程序,让代码飞起来

大家好&#xff0c;作为一种解释型语言&#xff0c;Python在开发速度和灵活性方面具有明显的优势&#xff0c;但在性能方面却不如编译型语言如C或Rust。对于性能要求苛刻的应用程序&#xff0c;如果纯粹使用Python编写可能会运行缓慢&#xff0c;影响用户体验。因此&#xff0c…