IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 《InsideUE4》GamePlay架构学习_Actor与Componet -> 正文阅读

[游戏开发]《InsideUE4》GamePlay架构学习_Actor与Componet

Actor与Componet

前话

??本次系列是关于知乎InsideUE系列的学习记录。原作链接如下:原文链接

Unity To UE4

在Unity的世界里,存在一个世界空间,空间中的最基础的东西就是 GameObject(物体)。物体拥有最基础的 Transform(变换)组件以及Mono有关的功能,我们称该功能为 Component(组件)。在不同组件有着不同功能的概念下,我们通过在不同物体上添加不同的组件来创造一个我们想要的游戏世界。

那么UE4是怎么什么实现这方面的功能呢?

在UnrealEngine中,首先最基础最底层的就是 UObject ,UObject主要提供跟类以及引擎有关的工作:

GC垃圾回收、反射、元数据、序列化、编辑器可见、Class Default Object等等。

可以说这是一个抽象的概念。而将其具象化到游戏场景的是AActor(Actor)。Actor类似于Unity中的GameObject,但又不完全一样。它可以表示一个具体的物体如:方块、人等,也能用来表示一些抽象但存在的元素,代表世界中的某种规则或者信息表示,如AInfo(派生类AWorldSetting,AGameMode,AGameSession,APlayerState,AGameState等),AHUD,APlayerCameraManager等。因此对于Actor来说,Transform不是必须的组件。

经过了UE的权衡和考虑,把Transform封装进了SceneComponent,当作RootComponent。但在权衡到使用的便利性的时候,大部分Actor其实是有Transform的,我们能通过一些API来获取。

跟Unity一样,有了单一Actor之后,就需要UActorComponent来扩充Actor的能力。不同组件有不同功能,通过将其连接到Actor来给其添加不同的功能模块。

思考

Actor和Component的关系

Actor更像一个容器,在这容器下包含着不同的Components。感觉Unity组件是彻底“融入”物体,而UE更像是挂在Actor身上。

下图是最常见的一些Component成员。
在这里插入图片描述

为何ActorComponent不能互相嵌套?而在SceneComponent一级才提供嵌套?

如下图:
在这里插入图片描述
因为两者各有好处,这里直接引用原文作者的话:

老实说,如果让我来设计Entity-Component模式,我很可能会为了通用性而在ActorComponent这一级直接提供嵌套,这样所有的Component就与生俱来拥有了组合其他Component的能力,灵活性大大提高。但游戏引擎的设计必然也经过了各种权衡,虽然说架构上显得并不那么的统一干净,但其实也大大减少了被误用的机会。实体组件模式推崇的“组合优于继承”的概念确实很强大,但其实同时也带来了一些问题,如Component之间如何互相依赖,如何互相通信,嵌套过深导致的接口便利损失和性能损耗,真正一个让你随便嵌套的组件模式可能会在使用上更容易出问题。

SceneComponent哲学

UE注重于让各个部分(不同SceneComponent)完成好不同的功能,然后在放在一个盒子(Actor)下运行;而不是在Actor上(直接对Actor编码)去统一操作各个部分(各个部分只具有抽象出来的最基本的功能,如位置变换等等。)

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:32:32  更:2021-07-22 14:32:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 14:19:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码