Unreal Engine05:UE4基本概念

news2024/11/17 17:25:19

写在前面

主要是介绍一下UE4中的一些常用概念。
参考的博客如下:

  • UE4常用逻辑关系和说明;
  • UE4入门学习4:C++编程介绍;
  • UE4中基础的类及其之间的关系;
  • [官方] 虚幻引擎 4 术语;
  • 《图解UE4渲染体系》Part 0 引擎基础

一、UE4世界结构

UE4世界的主要结构如下:

  • World (当前游戏世界,可以包含多个Level)
    • Level (关卡地图,每个关卡被保存为单独的.umap文件,可以有多个Sub-Levels)
      • Actor(基本实体,可以被动态添加到Level中)
        • Component(组件,隶属于Actor的功能对象体,可以为Actor赋予视觉、声音、运动等表现)
      • Pawn(特殊的Actor,表示游戏中的生命体)
        • Controller(控制器,负责接受来自玩家或者AI的输入,赋予Pawn以玩家或者类似玩家的行为)
      • Character(特殊的Pawn,表示游戏中的人,增加了碰撞组件CapsuleComponent和人物运动组件CharacterMovementComponent
  • GameMode(定义游戏规则)
  • GameState(游戏状态,包含玩家列表、得分情况、玩家任务清单等)
  • PlayerState(玩家的状态,包含名字、得分、等级等)

Controller有两种类型,分别是PlayerController和AIController;
隶属于PlayerController的一些模块如下:

  • HUD(Heads-Up Display,在屏幕上显示二维的UI信息,如血条和玩家名称等,每个PlayerController只有一个AHUD对象)
  • Camera(相当于人的眼睛,提供玩家的视角,每个PlayerController只有一个PlayerCameraManager对象)

PlayerController和Pawn的关系如下:
PlayerController和Pawn的关系

二、UE4基本类结构

  • 其实上面所提到的世界中的大部分模块都是一个类,但这里只介绍一些常用的类;

1. UObject

  • 是所有Object的基类;

  • 功能包括垃圾回收、元数据、在磁盘和网络中的序列化、类属性和函数的运行时反射和蓝图集成等;

  • 不能被添加到关卡Level中,也不能在蓝图中使用,但可以包含数据和函数;

  • 常用的宏:

    • UCLASS:声明类;
    • USTRUCT:声明结构体;
    • UFUNCTION:声明成员函数;
    • UPROPERTY:声明成员变量;
  • 一个例子如下:

USTRUCT()
struct FVector2D
{
	UPROPERTY()
	float X;
	UPROPERTY()
	float Y;

	UFUNCTION()
	float GetLength() const;
}
  • 下面介绍一下一些常用宏的说明符;

  • (1) UPROPERTY()的常用说明符如下:

    • VisibleAnywhere:在蓝图面板的详细信息和主面板的蓝图实例的详细信息窗格中都可见,也就是变量在所有的属性窗口中均可见,但无法编辑
    • VisibleDefaultsOnly:仅在蓝图面板的详细信息窗格中可见,同时无法编辑,也就是蓝图类内变量可见,可以得知一个相对公共的设定值;
    • VisibleInstanceOnly:仅在主面板的蓝图或C++类实例的详细信息窗格中可见,同时无法编辑,也就是蓝图对象内变量可见,只能得知一个相对私有的设定值;
    • EditAnywhere:在蓝图面板的详细信息和主面板的蓝图实例的详细信息窗格中都可见且可被修改,也就是变量在所有的属性窗口中均可见且可被修改
    • EditDefaultsOnly:仅在蓝图面板的详细信息窗格可见且可被修改,修改的是类的值,将影响该类之后生成的所有实例;
    • EditInstanceOnly:仅在主面板的蓝图或C++类实例的详细信息窗格可见且可被修改,修改对象的值,仅影响当前拖动到地图中生成的实例;
    • BlueprintReadOnly:可在蓝图中读取值,但不能修改值;
    • BlueprintReadWrite既可在蓝图中读取值,也可以在蓝图中修改值
    • Category="xxx|xxx":将当前变量分组到文件夹中,|符号用于创建子文件夹,注意引号内的所有空格均有意义,注意删掉无意义空格;
    • DisplayName="xxx":更改在信息窗格中显示的文本标签名字;
    • ToolTip="xxx":当鼠标悬停到信息窗格的对应属性时出现的提示信息文本,如果没有,则默认使用代码中的注释内容;
  • 参考:

    • UE4 C++学习 浅析UProperty属性说明符;
    • [官方] https://docs.unrealengine.com/5.0/zh-CN/unreal-engine-uproperty-specifiers/;
  • 一些补充说明:

    • 所有带Edit的说明符和带Visible的说明符不能同时出现,只能出现其中一种;
    • BlueprintReadOnlyBlueprintReadWrite起码要出现一个,不然在蓝图中右键是找不到这个属性的;
  • (2) UFUNCTION()的常用说明符如下:

    • BlueprintCallable:该函数可以在蓝图中被调用
    • BlueprintImplementableEvent:这个函数只能用蓝图实现,不能用C++实现;
    • BlueprintNativeEvent:这个函数必须用蓝图重写实现,有默认调用的方法(以_Implementation为后缀,需要用C++实现),因此在蓝图中是重写实现,不能用C++重写;
    • BlueprintPure:这个函数在蓝图中没有接口,不能被其他函数调用,只能用它的返回结果,而且不会缓存它的计算结果,每次调用时均会执行一次计算,可以参考:【UE·C++】BlueprintCallable与BlueprintPure区别;
    • DisplayNameToolTip均是元数据类型,使用时应写meta = (MetaTag1="xxx", MetaTag2="xxx", ...),更多关于元数据的介绍参考官方文档:https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/GameplayArchitecture/Metadata/;
  • 参考:

    • UE4 C++学习 UFunction函数说明符;
    • [官方] https://docs.unrealengine.com/5.0/zh-CN/function-specifiers/;
  • 一些补充说明:

    • BlueprintCallableBlueprintPure只能出现一个,前者仅在第一次调用时计算结果后者是每次调用均重新计算结果,因此计算的开销很大;
  • (3) UCLASS()的常用说明符如下:

    • Blueprintable:该类可以在主面板右键创建基于此类的蓝图类
  • 参考:

    • [官方] https://docs.unrealengine.com/5.0/zh-CN/class-specifiers/;

2. AActor

  • 继承于UObject
  • 是所有Actor的基类;
  • 有一个RootComponent成员变量,用于保存组件树中的根组件,结构示意如下:
    Actor结构
  • 一个Actor如果想被放进Level中,就必须先赋予USceneComponent * RootComponent一个SceneComponent对象,因为SceneComponent对象能为Actor提供变换信息(位置、旋转和缩放等);
  • 生命周期的事件:
    • BeginPlay():Actor对象首次在Gameplay中存在时调用;
    • Tick():每帧调用一次;
    • EndPlay():Actor对象离开Gameplay空间时调用;

3. UActorComponent

  • 是所有Component的基类;

  • 不可以单独存在,只能作为Actor中的成员变量使用;

  • 派生的Component类包括:

    • USceneComponent:使Actor有位置变换的能力,包括位移、旋转和缩放等;
    • UPrimitiveComponent:使Actor有被渲染的能力;
    • UMeshComponent:使Actor有形状外貌的能力;
    • UStaticMeshComponent静态网格体组件,继承前面3个类,是UE4的基本场景构建单位,最为常用;
    • UChildActorComponent:可以作为子节点搭建一棵组件树;
  • 它们的关系如下:
    基本组件类关系

  • 其他的组件介绍可以参考官方博客:https://docs.unrealengine.com/4.27/zh-CN/Basics/Components/;

4. APawn

  • 继承于AActor
  • 有物理表示和基本的移动能力;
  • 可以被PlayerController或者AIController实现控制;

5. ACharacter

  • 继承于APawn
  • 在Pawn的基础上默认挂载了三个组件:
    • USkeletalMeshComponent:骨骼网络组件;
    • UCharacterMovementComponent:人物移动组件,包括走、跑、跳、飞、游泳等;
    • UCapsuleComponent:碰撞组件;
  • APawnACharacter之间的关系如下:
    APawn和ACharacter的关系

6. AController

  • 可以和Pawn关联;
  • Controller和Pawn的关系:
    • Controller的抽象级别要更高一点,生命周期也更长,相当于一个控制中心,而Pawn则为一个被控制的实体
    • Controller可以搭配不同的Pawn,并负责向Pawn输出某些共有的控制逻辑,或者说是一套行为准则;
    • 每个Pawn只能认领一个Controller,并接受它所输出的行为准则,当然,它也可以更换不同的Controller获得不同的行为准则;
  • Controller和Pawn的关系示意图如下:
    Controller和Pawn的关系

三、代码命名规范

  • 类、变量和函数的命名均用大驼峰式,首字母大写;
  • 每个的命名前面均需要加前缀,如下:
    • A:派生自AActor的类;
    • U:派生自UObject的类;
    • S:派生自SWidget的类;
    • E:枚举类;
    • I:接口类;
    • T:模板类;
    • F:除上述的其他类;
  • 和类对应的C++文件名则不加前缀;
  • 变量的命名仅布尔变量需要增加前缀,如下:
    • b:布尔变量;
  • 如果返回值是布尔类型的函数的命名需要增加前缀,如下:
    • Is或者Should:返回值是布尔类型的函数;

四、常用变量类型

1. 基本数据类型

  • bool:布尔类型;
  • int8 / uint8:整数,8bit;
  • int16 / uint16:整数,16bit,相当于short int;
  • int32 / uint32:整数,32bit,相当于int;
  • int64 / uint64:整数,64bit,相当于long long int;
  • float:单精度浮点数,32bit;
  • double:双精度浮点数,64bit;

2. 指针类型

  • PTRINT:和指针同样大小的整数;

3. 字符串类型

  • TCHAR:字符,相当于char;
  • FString
  • FText
  • FName

4. 容器类型

  • TArray:动态数组,相当于vector;
  • TDoubleLinkedList:双向链表,相当于list;
  • TMap:字典,相当于unordered_map;
  • TSet:集合,相当于unordered_set;
  • TQueue:队列,相当于queue;

5. 文件相关类型

  • FFileManagerGeneric
  • FArchive:序列化相关操作类;

6. 智能指针类型

  • TSharedPtr:共享指针,针对普通的C++对象;
  • TWeakPtr:弱指针,针对普通的C++对象;
  • TWeakObjPtr:针对UObject对象;
  • TAutoPtr
  • TScopedPtr
  • TUniquePtr

7. 其他类型

  • FVector:空间坐标向量,有三个成员变量,分别代表X轴、Y轴和Z轴;

    • 可以参考博客:UE4 FVector向量的一些知识;
  • FRotator:旋转向量,有三个成员变量Pitch、Yaw和Roll,分别代表绕Y轴、Z轴和X轴旋转;

    • 注意如果该变量可以在细节面板上显示,则会自动转换为X、Y和Z,此时就各自对应X轴、Y轴和Z轴;
    • 也就是说在Editor中显示是正常的顺序;
    • 但在C++代码中是Y轴、Z轴和X轴的顺序;
  • FMath:数学函数功能类;

五、注释

1. 函数注释

  • 遵循JavaDoc形式,如下:
/*
* 函数功能说明
* 
* @param 参数1 参数1说明
* @param 参数2 参数2说明
* @return 返回值说明
*/
返回值类型 函数名(参数1, 参数2);
  • 或者用一行注释说明,如下:
/** 函数功能及参数说明 */
返回值类型 函数名(参数1, 参数2);

2. 函数内注释

  • 在代码的上一行独立注释,如下:
	...
	// 注释内容
	代码内容;
	...
  • 如果注释的内容太长可以手动分开多段来写;

六、资源命名规范

  • 资源均放在Content文件夹下,每个资源文件的命名要加上前缀,如下:

    • L_:关卡(Level / Map);
    • BP_:蓝图(Blueprint);
    • S_:静态网格(StaticMesh);
    • SK_:骨架网格(SkeletalMesh);
    • T_:纹理(Texture);
    • PS_:粒子系统(Particle System);
    • WBP_:组件蓝图(Widget Blueprint);
  • 存放资源的文件夹也要对应命名,如下:

    • Maps:关卡;
    • Blueprints:蓝图;
    • Animations:动画;
    • Sounds:音频;
    • Materials:材质;
    • Textures:纹理;
    • Effects:特效;

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

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

相关文章

记录robosense RS-LIDAR-16使用过程5

本篇记录RS-LIDAR-16录制bag包,并解析bag包为pcd。官网操作基本过了一遍,接下来记录标定。相机、雷达设备在出厂前通常都完成了内参标定工作,若要联合使用多雷达或雷达-相机时,就需要进行外参标定。接下来学习并记录标定。首先找到…

扬帆优配|杠杆资金重仓股曝光,3只科创板股获多路资金青睐

到2月16日,科创板融资余额环比前一日削减1104.16万元,其间,23股融资余额环比添加超千万元,融资净买入居前的有晶科动力、诺诚健华、爱博医疗等。 到2月16日,市场融资余额算计1.48万亿元,较前一交易日削减27…

frp实现内网穿透

文章目录一: frp是什么二: 程序文件结构三、使用步骤四:总结一: frp是什么 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网…

如何使用ArcGIS进行地理配准

1.概述 对于GIS数据而言,坐标信息是灵魂,有了坐标信息之后才能和别的数据结合使用,之前有介绍过矢量数据定义坐标信息的方法,针对栅格图,这里为大家介绍一下通过地理配准增加坐标信息的方法,希望能对你有所…

深圳“托育”放大招!政府出钱帮你带娃啦!

工作忙得不可开交 难以照料孩子的起居 这个带娃难题常常让双职工家庭 感觉到头疼不已 一边是工作,一边是孩子 父母都上班,宝宝谁来带? 未来这个问题将迎刃而解! 因为政府要出钱帮你带娃啦! 近日,深圳市总工…

Computer Graphics From Scratch - Chapter 8

系列文章目录 简介:Computer Graphics From Scratch-《从零开始的计算机图形学》简介 第一章: Computer Graphics From Scratch - Chapter 1 介绍性概念 第二章:Computer Graphics From Scratch - Chapter 2 基本光线追踪 第三章:Computer Gr…

ts基础入门学习之上篇

1.安装typescript编译器 npm i -g typescript 安装之后使用tsc运行ts文件,然后会编译出对应的js文件,再通过node运行js文件,就能获得打印内容。 ts定义内容 function fn(people, date) {console.log(hello${people},today is ${date}); } fn…

C++模板(一)

文章目录C模板(一)1. 泛型编程2. 函数模板2.1 函数模板格式2.2 模板原理2.3 模板实例化2.4 模板参数匹配原则3. 类模板3.1 类模板格式3.2 背景3.3 类模板的实例化C模板(一) 1. 泛型编程 前面我们学到了函数重载这个特性&#xf…

Zabbix“专家坐诊”第181期问答汇总

题一 Q:大佬们,有没有基础的 监控模板 触发器分享下? A:你可以试一下乐维免费版(https://forum.lwops.cn/download ),里面基本的模板全齐。 问题二 Q :orabbix监控查询SQL执行时…

如何保证数据库和缓存双写一致性?

前言 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率…

CAD中怎么旋转光标?CAD旋转光标的方法步骤

CAD中怎么旋转光标?浩辰CAD软件作为一款拥有自主核心技术的CAD平台软件产品,提供了CAD旋转光标命令,本节课程就和小编一起来了解一下浩辰CAD软件中CAD旋转光标的方法步骤吧! CAD旋转光标命令启动方式: 1、命令行&…

Redis第三讲

目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …

Java反序列化漏洞——CommonsCollections3链分析

一、原理CC1链中我们是通过调用Runtime.getRuntime.exec()来执行系统命令,而另一个方向我们可以通过TemplatesImpl加载字节码的类,通过调⽤其newTransformer() 方法,即可执⾏这段字节码的类构造器,我们在类构造器中加入恶意代码&a…

【Seata】_01 分布式事务基础知识和常见的解决方案

本地事务 单一的数据库事务,ACID由数据库直接提供 分布式事务 一个服务调用操作两个数据库; 多个服务操作同一个数据库; 多个服务操作多个数据库; 分布式事务无法由数据库保证 Seata 分布式事务解决方案 Seata提供AT/TCC/SAG…

HDMI Audio InfoFrame

Audio InfoFrame 是HDMI Source向Sink传递当前音频流特性的一种InfoFrame。要求是至少每两帧图像就要传输一次Audio InfoFrame。Audio InfoFrame的传输可以是Data Island周期的任何时刻。 HDMI在音频的传输上,packet包的标准是按照IEC60958或者IEC61938来的。 Aud…

使用契约测试得不偿失?试试契约先行开发

契约维护的难题 如今微服务凭借其灵活、易开发、易扩展等优势深入人心,不同服务之间的集成和交互日渐繁多且复杂。这些服务之间交互的方式是多样的,常见的有 HTTP 请求和消息队列。在它们交互的过程中,会有服务的版本演进,交互信…

算法的时间复杂度与空间复杂度

…………………………………………………………………………………………………………………… ………………………………………………………………………加油…………………………………………………………………………. 如何衡量一个算法的好与坏呢?这是本篇的重点…

财报解读:硬件支撑思科增长,云平台何时能突围?

北京时间2023年2月16日,美国网络设备老牌巨头思科公布了其2023财年第二季度财报,业绩超预期。 据思科财报显示,其2023财年Q2实现营收136亿美元,分析师预期为134.3亿美元;同时给出大超预期的业绩指引,思科预…

jetson nano(ubuntu)编译Qt creator

文章目录一.apt安装二.源码编译安装1.Qt Creator源码下载2.相关软件安装cmakeninjallvm/clang3.Qt Creator源码编译一.apt安装 sudo apt-get install qtcreatorapt安装的版本只有4的,版本较低,只有qmake进行项目配置,6版本以上可以使用cmake…

7大体系防作弊,牛客放大招了!严肃笔试客户端上线!

如果问起学生对在线笔试的印象,“不公平”和“不服气”占了半壁江山。学生认为很多企业的在线笔试系统并不完善。原因一,不能有效地规避部分学生的作弊行为;原因二,在线考试系统不稳定,bug频出,导致笔试发挥…