该篇学习一些简单的额外知识可用作知识储备,会进行不定时更新
目录
Actor生命周期
- 将所有的Actor复制到一个新的场景中,后调用 PostDuplicate 代表复制完成。最后调用 InitializeActorsForPlay 来进行Actor的初始化操作(接口等)
- 将磁盘中的资源读到内存中,完成后调用 PostLoad (该接口可重写)。最后调用InitializeActorsForPlay 来进行Actor的初始化操作
- 在加载对象后立即执行所需的任何特定于对象的清理。这不会被新创建的对象调用,默认情况下总是在游戏线程上执行
- 准备播放Actor——各个组件的初始化:预初始化-初始化-Post初始化
- PreInitialize Components:预初始化。初始化一些准备工作,例如配表
- InitializeComponents:初始化。例如 注册、序列化
- PosInitializeComponents:Pos初始化。初始化结束
- BeginPlay:调用所有的 BeginPlay——开始GamePlay的逻辑
- SpawnActor:均使用World生成,当World销毁Actor也会销毁。当生成的Actor中有需要渲染的组件将可以被渲染出来
- PostSpawnInitiate:初始化结束,可自定义
- ExecuteConstruction:执行构造。例如组件的创建
- PostActorConstruction:构造完成。可自定义
- 进行初始化:预初始化-初始化-Post初始化
左边是Class直接进行反序列化即可。Class中记录角色具体信息,Spawn是划一片内存将Class的信息塞到Spawn(对象)中
- 执行BeginPlay→执行Tick
- Actor的删除模式最终汇总到EndPlay
- 将所有删除的角色标记为 RF_PendingKill
- 如果希望删除也可直接将Actor标记为RF_PendingKill,GC在下一次释放
- 保证没有关联后进行移除(World)
- 最后进行删除工作调用 BeginDestroy
- BeginDestroy
- IsReadyForFinishDestroy
- FinishDestroy:可重写
附上生命周期官方文档 Actor生命周期
设置游戏模式
定义游戏的一组规则。这些规则包括游戏启动时玩家将生成的默认Pawn。你需要设置这些规则才能生成你已创建的玩家角色。
Game Mode 和 Game State
游戏中的基础规则构成了 GameMode。在最基础的层面上,规则包括
- 出现的玩家和观众数量,以及允许的玩家和观众最大数量
- 玩家进入游戏的方式,可包含选择生成地点和其他生成/重生行为的规则
- 游戏是否可以暂停,以及如何处理游戏暂停
- 关卡之间的过渡,包括游戏是否以动画模式开场
当游戏中发生与规则相关的事件并需要与所有玩家进行追踪和分享时,这些信息便会通过Game State 进行存储和同步。这些信息包括
- 游戏已运行的时间(包括本地玩家加入前的运行时间)
- 每个个体玩家加入游戏的时间和玩家的当前状态
- 当前 Game Mode 的基类
- 游戏是否已开始
Game Mode
虽然某些基本原则(如进行游戏所需要的玩家数量,或玩家加入游戏的方法)在许多类型的游戏中都很常见,但根据你所开发的特定游戏,可能存在无限个变化。不管这些规则是什么,Game Modes 都是用来定义和执行这些规则的。目前有两个常用的游戏模式基类。
AGameModeBase
所有 Game Mode 均为 AGameModeBase
的子类。而 AGameModeBase
包含大量可覆盖的基础功能。部分常见函数包括
函数/事件(Function/Event) | 目的(Purpose) |
InitGame |
|
PreLogin | 接受或拒绝试图加入服务器的玩家。如果将ErrorMessage设置为非空字符串,则导致Login函数失败。PreLogin在Login之前被调用,并且在Login被调用之前可能会经过很长一段时间,特别是当加入玩家需要下载游戏内容时 |
PostLogin | 成功登录后调用。这是第一个可以安全地在PlayerController上调用复制函数的地方。OnPostLogin可以在Blueprint中实现,以添加额外的逻辑 |
HandleStartingNewPlayer | 在 PostLogin 后或无缝游历后调用,可在蓝图中覆盖,修改新玩家身上发生的事件。它将默认创建一个玩家 pawn。 |
RestartPlayer | 调用开始生成一个玩家 pawn。如需要指定 Pawn 生成的地点,还可使用 RestartPlayerAtPlayerStart 和 RestartPlayerAtTransform 函数。OnRestartPlayer 可在蓝图中实现,在此函数完成后添加逻辑。 |
SpawnDefaultPawnAtTransform | 这实际生成玩家 Pawn,可在蓝图中覆盖 |
Logout | 玩家离开游戏或被摧毁时调用。可实现 OnLogout 执行蓝图逻辑 |
Game Mode 不会复制到加入多人游戏的远程客户端;它只存在于服务器上,因此本地客户端可看到之前使用过的留存 Game Mode 类(或蓝图);但无法访问实际的实例并检查其变量,确定游戏进程中已发生哪些变化。如玩家确实需要更新与当前 Game Mode 相关的信息,可将信息保存在一个 AGameStateBase
Actor 上,轻松保持同步。AGameStateBase
Actor 随 Game Mode 而创建,之后被复制到所有远程客户端。
AGameMode
AGameMode
是 AGameModeBase
的子类,拥有一些额外的功能支持多人游戏和旧行为。所有新建项目默认使用 AGameModeBase
。如果需要此额外行为,可切换到从 AGameMode
进行继承。如从 AGameMode
进行继承,也可从 AGameState
继承游戏状态(其支持比赛状态机)。
AGameMode
包含一个跟踪比赛状态或整体游戏流程的状态机。可使用 GetMatchState
或 HasMatchStarted
、IsMatchInProgress
和 HasMatchEnded
之类的封装器查询当前的状态。以下是可能的比赛状态:
EnteringMap
是初始状态。Actor 尚未进行 tick,世界场景尚未完整初始化。内容完整加载后将过渡到下个状态-
WaitingToStart
是下个状态,进入时将调用HandleMatchIsWaitingToStart
。Actor 正在进行 tick,但玩家尚未生成。如ReadyToStartMatch
返回 true 或StartMatch
被调用,它将过渡到下个状态 -
InProgress
是游戏主体所发生的状态。进入此状态时将调用HandleMatchHasStarted
,然后在所有 Actor 上调用BeginPlay
。此时,正常游戏进程已在进行中。ReadyToEndMatch
返回 true 或调用EndMatch
时比赛将过渡到下个状态。 -
WaitingPostMatch
是倒数第二个状态,进入时将调用HandleMatchHasEnded
。Actor 仍在 tick,但新玩家无法加入。地图转换开始时它将过渡到下个状态 -
LeavingMap
是正常流程中的最后一个状态,进入时将调用HandleLeavingMap
。转换到新地图时比赛将保持在此状态中,进入新地图时将过渡回到EnteringMap
-
Aborted
是失败状态,调用AbortMatch
可开始此状态。出现无法恢复的错误时将进行此设置
游戏状态将固定为 InProgress
,因为这是调用 BeginPlay
、actor 开始 tick 的状态。然而,个体游戏可能覆盖这些状态的行为,用更复杂的规则构建一个多人游戏,如在一款多人射击游戏中等待其他玩家加入时允许玩家在关卡中自由飞行。
设置 Game Mode
- 设置
DefaultEngine.ini
文件的/Script/EngineSettings.GameMapsSettings
部分的GlobalDefaultGameMode
输入将设置项目中所有地图的默认游戏模式 - 在编辑器中 World Settings 标签下设置 GameMode Override 即可覆盖个体地图的项目设置
- URL 可被传到可执行文件,强制游戏加载时带特定选项。使用
game
选项设置游戏模式。查看 命令行参数中的详细内容 - 可在
DefaultEngine.ini
文件的/Script/Engine.WorldSettings/
部分中设置地图前缀(和 URL 法的别名)。这些前缀设置所有拥有特定前缀的地图的默认游戏模式 - 请查阅 设置 Game Mode 文档中设置 Game Mode 的范例。但是蓝图版本,具体等后边进项目的时候再具体学习了。
Game State
Game State 负责启用客户端监控游戏状态。从概念上而言,Game State 应该管理所有已连接客户端已知的信息(特定于 Game Mode 但不特定于任何个体玩家)。它能够追踪游戏层面的属性,如已连接玩家的列表、夺旗游戏中的团队得分、开放世界游戏中已完成的任务,等等
Game State 并非追踪玩家特有内容(如夺旗比赛中特定玩家为团队获得的分数)的最佳之处,因为它们由 Player State 更清晰地处理。整体而言,GameState 应该追踪游戏进程中变化的属性。这些属性与所有人皆相关,且所有人可见。Game mode 只存在于服务器上,而 Game State 存在于服务器上且会被复制到所有客户端,保持所有已连接机器的游戏进程更新
函数或变量(Function or Variable) | 使用(Use) |
GetServerWorldTimeSeconds | 这是 UWorld 函数 GetTimeSeconds 的服务器版本,将在客户端和服务器上同步,因此它是用于复制的可靠时间。 |
PlayerArray | 这是所有 APlayerState 对象的阵列,对游戏中所有玩家执行操作时十分实用 |
HasBegunPlay | 如果在游戏中的角色上调用了BeginPlay函数,则返回true。 |
AGameStateBase
通常在 C++ 或蓝图中延展,包含用于使游戏中玩家知晓当前情况的额外变量和函数。进行的特定修改通常基于 Game State 的配对 Game Mode。Game Mode 自身也可将其默认 Game State 类覆盖为派生自 AGameStateBase
的任意 C++ 类或蓝图。
GamePlay框架快速参考
用户界面(User Interfaces)和HUD
HUD指的是游戏期间在屏幕上覆盖的状态和信息。HUD的目的是 告知玩家当前游戏状态,即分数、生命值、游戏剩余时间等。 HUD通常是不可互动的,意味着玩家不能单击HUD的元素,因此 在HUD和用户界面难以分离的某些类型游戏中,这些元素会显示为灰色区域
用户界面 指的是菜单和其他互动元素。这些元素通常是在屏幕上覆盖绘制的, 就像HUD一样,但在某些情况下,它们会成为游戏世界本身的一部分, 在场景中的一个表面上渲染出来。最明显的UI示例是游戏启动时显示的主菜单, 或玩家暂停游戏时显示的暂停菜单。但是,游戏期间可能会显示其他UI。这些 可以用于显示游戏中不同角色之间的对话,或在更复杂的情况下,如RTS或RPG, 它们可能成为游戏本身不可或缺的一部分,让玩家可以选择武器、盔甲、建筑单位等等。
Slate UI框架
Slate 是一种自定义、平台无关的用户界面框架。
UMG 是作为Slate的封装每个UMG控件都有对应的Slate的控件,在调用函数UUserWidget::AddToViewport会将UMG控件树翻译为Slate控件树,对于UUserWidget会翻译成SObjectWidget,这样可以在绘制的Paint的流程中调到UMG这边的Tick
框架类关系
此流程图说明了这些Gameplay类是如何相互关联的。游戏由游戏模式和游戏状态组成。加入游戏的人类玩家与玩家控制器相关联。 这些玩家控制器允许玩家在游戏中拥有Pawn,这样他们就可以在关卡中拥有物理代表。玩家控制器还向玩家提供输入控制、抬头显示(HUD), 以及用于处理摄像机视图的玩家摄像机管理器

开发者文件夹与源码管理
开发者文件夹
在多人开发中使用,每位开发者都有自己的文件夹来管理自己的文件。
如果在 内容浏览器(Content Browser)中看不到"开发者(Developers)"文件夹则按照步骤
- 在 内容浏览器(Content Browser) 中,单击 设置(Settings)
- 在"设置(Settings)"菜单中,启用 显示开发者内容(Show Developer Content) 选项
在使用源码控制系统时,可配置UE引擎以查看其他开发者的文件夹中的资产。
- 在 内容浏览器(Content Browser) 中,单击 过滤器(Filters)
- 在"过滤器(Filters)"菜单中,选择 其他过滤器(Other Filters)> 其他开发者(Other Developers)
为了确保不会意外打包已损坏或正在处理的资产,可从烘焙版本中排除"开发者(Developers)"文件夹。
- 在主菜单中,转到 编辑(Edit)> 项目设置(Project Settings),然后搜索 从不烘焙的目录(Directories to never cook) 数组
- 单击 添加(+)(Add (+)) 按钮向数组中添加新项目
- 单击 … 以打开项目中的文件夹列表
- 单击 开发者(Developers) 文件夹以将其选中
源码管理
源码管理(Source Control)软件用来管理代码、数据在一段时间内的状态。可用于协同开发。
虚幻引擎默认支持Perforce和SVN
*这里先介绍源码管理的功能流程,具体使用会在后面的【建立开发流程】中再具体学习,内容包括:
- 虚幻编辑器中的版本控制
- 关卡快照
- 使用Perforce版本控制软件
- 使用SVN作为版本控制软件
这里就不做过多的介绍学习了
通过编辑(Edit)> 编辑器偏好设置(Editor Preferences)> 加载和保存(Loading & Saving)启用源码管理
项目(Item) | 说明(Description) |
资产修改时是否自动检出 (Automatically Checkout on Asset Modification) |
选中后,它将自动检出所有发生过修改的资产 |
修改包时提示检出 (Prompt for Checkout on Package Modification) |
选中后,当你改动某个由源码管理控制的安装包时,将出现一条提示,询问你是否希望检出(锁定)该包。 |
修改时添加新文件 (Add New Files when Modified) |
在发生改动时向源码管理添加新的文件 |
使用全局设置 (Use Global Settings) |
使用全局性的源码管理登录设置,而非单独设置每个项目。修改后需重新登录。 |
文本比对工具 (Tool for diffing text) |
指定文本比对工具的路径 |
停用源码管理
只有在绝对确定不想要使用源码管理时,才使用此选项。停用源码管理将导致你的本地内容无法与源码管理系统同步,并且将无法检入更改。
- 在关卡编辑器窗口的右上角,点击绿色双箭头图标(
)。这将打开 源码管理登录(Source Control Login) 界面
- 点击 脱离源码管理运行(Run Without Source Control) 按钮。关卡编辑器窗口中的绿色图标将变成一个带斜杠的红色圆圈(
),指示没有使用源码管理
内容浏览器中的集合
集合 是一种将资产集整理成组的方式。与文件夹不同,集合不包含资产本身,而仅包含对这些资产的引用。实际上,这意味着一个资产可以属于多个集合。
- 点击集合(Collections)面板上的 添加(Add) (+) 按钮
- 选择集合 类型
类型(Type) 说明(Description) 共享集合(Shared Collection) 共享集合对其他用户可见。此选项仅在你处理多用户项目时可用 私人集合(Private Collection) 私人集合仅适用于被明确邀请查看集合的用户。此选项仅在你处理多用户项目时可用 本地集合(Local Collection) 本地集合仅在你的本地机器上可用 - 输入新集合的名称,然后按 回车键(Enter)
你可以右键点击集合(Collection),然后从出现的上下文菜单中选择 新增(New) ,并按照上述步骤1-3来创建子集合。
将资产添加进集合中
- 点击资产选择它,然后将其拖到集合中
- 右键点击资产。然后,从上下文菜单中,选择 管理集合(Manage Collections),然后点击你要添加资产的目标集合
- 资产已经归属集合的名称旁边将有复选标记
- 点击资产可以选择它,然后启用你要添加资产的目标集合旁边的复选标记
- 如果资产已经是该集合的一部分,则该集合旁边的复选标记将已启用。在这种情况下,清除复选标记将从该集合中 删除 资产
如果你将资产添加到具有父集合的集合,则该资产也将添加到父集合
你可以使用以下方法之一从集合中删除资产:
- 键点击资产。然后,从上下文菜单中,选择 管理集合(Manage Collections),然后点击你要从中删除资产的集合
- 点击资产可以选择它,然后禁用你要从中删除资产的集合旁边的复选标记
如果你在集合中选择资产,并按 删除(Delete) ,你可以完全删除该资产。你将收到提示,确认这是你要执行的操作,但请记住,删除资产意味着它 完全 从你的项目中删除。要简单地从集合中删除资产,请始终使用上述方法之一即可。
请注意,由于集合是对实际资产的引用,因此删除你的集合不会删除集合中的资产。
高级搜索语法
在内容浏览器中的搜索栏中可以通过特殊的运算符进行高级搜索。
例如“键-值”对的方式,还可以通过使用 AND
、OR
和 NOT
运算符,同时完成多个搜索运算。
具体的查看文档就行了,这边就不记录了,等用到的时候再看吧
自定义虚幻引擎
插件安装位置
-
Windows上的
C:\Program Files\Epic Games\UE_[version]\Engine\Plugins
-
macOS上的
/Users/Shared/Epic Games/UE_[version]/Engine/Plugins
使用项目和模版
创建自定义模版
在以下教程中,[ProjectName] 代表你的虚幻引擎项目名(比如
MyProjectName.uproject
)。这与DefaultGame.ini
文件中的变量 ProjectName 不同(没有方括号)。
要将已有的项目转换为模板:
- 将 整个 项目文件夹复制到你的引擎安装目录的
Templates
文件夹啊。如果你从Epic Games启动器安装了虚幻引擎,那么Templates
文件夹会位于:- Windows系统:
C:\Program Files\Epic Games\UE_[version]\Templates
- Mac:
/Users/Shared/Epic Games/UE_[version]/Templates
- Windows系统:
-
如果你从源代码编译了虚幻引擎,那么
Templates
文件夹会位于[ForkLocation]\UE4\Templates
。 -
打开
[ProjectName]\Config\DefaultGame.ini 文件
。然后添加或更新 ProjectName 变量。这是在创建新项目时显示在模板选择区域内的名称。例如:
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=E6468D0243A591234122E38F92DB28F4
ProjectName=MyTestTemplate
注意 ProjectID 变量是为每一个项目生成的一个独特的ID。
- 在你的虚幻引擎安装目录中,找到
Templates\TP_FirstPerson\Config\
。将TemplateDefs.ini
文件复制到[ProjectName]\Config
文件夹
除了
TP_FirstPerson
以外,你还可以使用任何已有的模板文件夹,只要其中包含一个TemplateDefs.ini
文件即可
- 打开上一步复制的
TemplateDefs.ini
文件并且更新 LocalizedDisplayNames 和 LocalizedDescriptions 变量。一共有四组变量,每组对应一个虚幻引擎支持的语言:英文 (en)、韩文 (ko)、日文 (ja) 以及简体中文 (zh-Hans)
例如:
[/Script/GameProjectGeneration.TemplateProjectDefs]
LocalizedDisplayNames=(Language="en",Text="My Test Template")
LocalizedDescriptions=(Language="en",Text="This is a custom template that includes a first-person character and uses Blueprint.")
-
当你创建新项目时,你的模板会在
TemplateDefs.ini
文件中定义的类别里出现。这由 Categories 变量所控制。不管变量名称是什么,一个模板只能分配 一个 类别。-
Games - 游戏
-
ME - 电影、电视和现场活动
-
AEC - 建筑、工程和建造
-
MFG - 汽车、产品设计和生产
-
更多信息可以参考 [虚幻引擎安装目录]\UE_[版本]\Templates
文件夹下的 TemplateCategories.ini
文件。
- 你可以在
[ProjectName]\Media
文件夹中添加一个图标和预览图。这些图片必须为PNG格式并且满足以下命名要求- 图标:
[ProjectName].png
-
预览图:
[ProjectName]_Preview.png
- 图标:
Project Setting
这个项目设置就大概看看有个印象就行。
关卡
- 点击 主菜单 中的 文件(File),然后点击 新建关卡(New Level)
- 使用 Ctrl+N(Windows)或 Cmd+N(Mac)快捷键
以上会出现下个界面
我的这个版本(5.3.1)在 内容浏览器 中点击右键。然后,在 创建基本资产(Create Basic Asset) 下,选择 关卡(Level)貌似不会出现上边那个界面
- 开放世界(Open World):一个包含示例内容的关卡,允许你使用世界分区来创建大型、可流送的开放世界
- 空的开放世界(Empty Open World):一个使用世界分区的关卡,但不包含任何内容
- 基本(Basic):一个包含地面、光照、大气和指数雾的关卡
- 空关卡(Empty Level):一个没有任何内容的关卡
管理多关卡
关卡为非 Open Level 时(使用Basic)通过 Window → Levels 来打开关卡界面。
在主关卡中显示的子关卡的 Actor 为方便开发显示的Actor当运行时并不会显示,若显示可以通过关卡流送体积(Level Streaming Volume)、蓝图(Blueprint)或C++代码加载。
可用作多人开发(例如一个子关卡负责音效,一个子关卡负责特效)
可拆分子关卡:
- 选中要移到新关卡的Actor
- 在 关卡(Levels) 窗口中,单击 关卡(Levels) 下拉菜单,然后选择 使用选定Actor新建(Create New with Selected Actors) 以创建一个新子关卡
- 也可以将关卡中的 Actor 移动到指定关卡中
可通过设置Show → Advanced → Level Coloration 来区分关卡中的物体
也可以通过右键子关卡更改流方式来显示指定关卡的Actor
世界设置
世界分区设置和世界分区
世界分区(World Partition) 是新的数据管理和基于距离的关卡流送系统,可以为大型世界管理提供完整的解决方案。以前需要通过将单个持久关卡中的世界存储到网格单元格中,以便将大型关卡划分成子关卡,但现在的系统已经不需要如此操作,并且能够自动流送系统,从而根据与流送源的距离来加载和卸载这些单元格。
如需详细了解世界分区以及如何配置其设置,请参考虚幻引擎5抢先体验版文档中的世界分区部分。
虚拟现实
使用 米级世界缩放(World to Meters) 变量来调整虚拟世界(VR)的大小规模。提高或降低此数字将会使用户感觉自己相对于周围的世界而言变得更大或更小了。此设置用虚幻单位(UU)来表示。在UE4中,1虚幻单位(UU)等于1厘米(cm)。
假设你的内容使用1虚幻单位 = 1厘米进行构建,将 米级世界缩放(World to Meters) 设置为 10 将会使世界看起来非常大,而将米级世界缩放设置为 1000 将使世界变得非常小。
如需详细了解如何缩放虚拟现实(VR)体验,请参阅VR世界规模。
如需了解在UE5中开发XR的一般性说明,请参阅XR开发。
人工智能
在此部分中,可以启用虚幻引擎4的人工智能(AI)系统。
如需详细了解此系统,请参阅人工智能。
- 介绍了虚幻引擎中的AI系统——一种可用于在项目中创建高真实度AI实体的系统
资产和内容包
切勿直接在磁盘上移动、复制或删除资产,这可能会破坏项目中的功能并导致数据损坏或丢失。应始终通过虚幻编辑器管理
.uasset
文件。如果你要将资产从一个项目移动到另一个项目,请参阅迁移资产页面了解如何执行此操作。
自动重新导入
编辑器偏好设置(Editor Preferences)> 加载与保存(Loading & Saving)> 自动重新导入(Auto Reimport)
自定义指定目录,排除通配符文件
替换引用工具
替换引用工具(Replace References Tool) 在编辑器中提供了一种将多个资产合并成单个资产的简单方法。
但是存在替换失败的情况
类查看器
工具(Tools)> 类查看器(Class Viewer)
全局资产选取器
过全局资产选取器,你可以快速找到资产树的任何文件夹中的资产。
全局资产选取器(Ctrl-P)是编辑资产或将资产放入关卡的快速访问方法。
然后你 单击并拖动 资产,将它移到场景中,也可以 双击 资产来调出相关的编辑器。
属性矩阵
属性矩阵(Property Matrix) 允许对大量对象或Actor进行批量编辑 和值比对。它允许以表格形式列出一组对象的各种可配置属性, 并且表格可以按任意列排序。属性矩阵还提供标准的属性编辑器, 显示该表格视图中设置的当前选择的所有属性。
功能 |
优势 |
---|---|
批量对象编辑 |
|
批量细粒度对象比较 |
|
深度属性和数组支持 |
|
功能按钮 |
说明 |
|
---|---|---|
键盘 |
||
Esc |
退出当前单元格的编辑模式。某些单元格有复杂的编辑控件,它们的ESC键有自己的优先行为,因此用户可能需要多次按下ESC键。 |
|
Ctrl + C |
复制 |
|
Ctrl + V |
粘贴 |
|
Ctrl + A |
全选 |
|
Home 或 Ctrl + 左箭头 |
将当前单元格移到当前行的第一个单元格处。 |
|
End 或 Ctrl + 右箭头 |
将当前单元格移到行的最后一个单元格处。 |
|
Ctrl + Home |
将当前单元格移到表的第一个单元格处。 |
|
Ctrl + End |
将当前单元格移到表的最后一个单元格处。 |
|
左箭头 或 Shift + Tab |
将当前单元格移到当前行的前一个单元格处。 |
|
右箭头 或 Tab |
将当前单元格移到当前行的下一个单元格处。 |
|
上箭头 |
将当前单元格移到列的上一个单元格处。 |
|
下箭头 |
将当前单元格移到列的下一个单元格处。 |
|
Ctrl + 上箭头 |
将当前单元格移到列的第一个单元格处。 |
|
Ctrl + 下箭头 |
将当前单元格移到列的最后一个单元格处。 |
|
Shift + 上箭头 |
将当前单元格移到当前列的上一个单元格,并将其所在行添加到现有选择范围。 |
|
Shift + 下箭头 |
将当前单元格移到当前列的下一个单元格,并将其所在行添加到现有选择范围。 |
|
Ctrl + Shift + 上箭头 |
将当前单元格移到当前列的第一个单元格,并选择期间的所有行。 |
|
Ctrl + Shift + 下箭头 |
将当前单元格移到当前列的最后一个单元格,并选择期间的所有行。 |
|
F2 |
当前单元格进入编辑模式。 |
|
鼠标控制 |
||
LMB单击 单元格 |
被单击的单元格变成当前单元格,该单元格所在的行变为新选择范围。 |
|
Ctrl + LMB单击 单元格 |
如果被单击的单元格不属于已经选中的行,则该单元格变为当前单元格,它所在的行添加到当前选择范围,否则会从选择范围中移除该单元格所在的行。 |
|
Shift + LMB单击 单元格 |
被单击的单元格变为当前单元格,原始当前单元格所在行和被单击单元格所在行之间的所有行将添加到现有选择范围。 |
|
LMB单击 当前单元格 |
当前单元格进入编辑模式。 |
|
LMB双击 单元格 |
单元格变为当前单元格,并进入编辑模式。 |
|
MMB单击 列标题 |
从表中移除该列。 |
|
MMB单击 "细节"(Details)面板中的属性 |
切换是否将被单击属性固定到表格中。 |
Actor和几何体
变换Actor
Actor分组
一个Actor一次只能属于一个组。
可以通过选中需要分组的物体后按 [Ctrl + G] 的方式,也可通过右键物体的方式
还可使用 [Ctrl + G] 键盘快捷方式将Actor重新分组。
通过 [Shift + G] 来取消分组
锁定(Lock):
- 选择锁定组中的Actor,将选择整个组
- 变换会影响组中的所有Actor
未锁定(Unlock)
- 选择和变换属于该组的单个Actor
- 从该组中删除Actor
枢轴点通过 [Alt + 鼠标中键] 的方式更改其位置,或者,中键点击并拖动 该组的变换控件中心处的球体来移动。
Actor对齐
快捷键 | 作用 |
V + LMB | 吸附到最近的网格点 |
Alt + V + MMB | 吸附坐标轴到最近的网格点 |
Ctrl + End | 吸附到最近的参考网格 |
Shift + End | 吸附到它下面的地板上 |
*这个对齐并没有说想象中的那样在对齐的同时进行旋转对齐
合并 Actor
在虚幻引擎中将两个或更多静态网格体Actor合并为单个Actor。这样可以减少绘制调用,有助于项目优化。
菜单栏 → Actor → Merge Actors
合并类型 | 介绍 |
合并(Merge) | 在默认情况下,该方式会合并全部选中的静态网格体Actor,为每个材质创建一个网格体分段。可以指定要使用的 LOD 级别。绘制调用数量等于 材质 数量。这种方式保留UV。您也可以选择合并全部材质,这将为整个网格体烘焙单一材质。其结果是单一分段和单一绘制调用,但 不 保留UV。将针对每一分段进行遮挡剔除 |
简化(Simplify) | 该合并方式将全部选中的静态网格体Actor合并成一个单一网格体,它被称为 代理网格体(Proxy Mesh)。它使用选定每个网格体的最少细节LOD,并根据设置简化网格体形状。顶点数量也会减少。其结果是单一绘制调用。它为整个网格体烘焙单一材质,且 不 保留UV。将针对整个网格体进行遮挡剔除 |
批量(Batch) | 该方式将基于相同的静态网格体组件创建实例化静态网格体组件。它保留UV,且不影响遮挡剔除 |
近似(Approximate) | 这是 虚幻引擎5 的新功能,与"简化(Simplify)"合并方式相似。两者区别在于"近似(Approximate)"可以处理更复杂的源网格体(例如Nanite网格体),而"简化(Simplify)"在简化或纹理烘焙步骤中都会失败 |
有关于 合并设置 这里就不介绍了详细的看官方文档就可以了
- 网格体设置(Mesh Settings)
- 材质设置(Material Settings)
- 地形剔除(Landscape Culling)
- 代理设置
- 输出网格体过滤和简化设置
- 网格体法线和切线设置
- 网格体UV生成设置
- 输出静态网格体设置
- 材质烘焙设置
- 调试输出设置
- 等等
如果启用 替换源Actor(Replace Source Actors) 选项,在视口中选中的Actor会被移除,并替换为新合并的Actor。这不会从内容浏览器或项目文件夹中删除源Actor资产。
该选项对于本页描述的所有合并方法通用。
*该设置在窗口的最下方
Actor参考
Kill Z体积
Kill Z体积Actor(Kill ZVolume Actor) 会在玩家角色进入体积或与之交互时将其干掉。
Kill Z体积Actor不同于 世界设置(World Settings) 面板中的"Kill Z"选项,后者会在玩家越过Z轴(垂直轴)上的特定点之后立即摧毁玩家
施加伤害体积
会对进入体积的玩家或对象逐渐造成伤害。例如,如果玩家站在火焰中,你可以设置施加伤害体积来对其生命值产生对应的伤害
请参阅伤害施加体积页面了解更多。
文本渲染Actor
提供了向关卡添加文本的简单方法。
目标点Actor
提供了世界中的一个泛型点,你可以从中生成项目。例如刷怪点。
3D文本Actor
可以使用Sequencer编辑器为3D文本对象制作动画,在虚幻编辑器中直接创建动态图形。
Sequencer是引擎中的过场动画编辑器,可与Composure合成系统结合使用。
下面会介绍在 Level Sequencer 中对3D文本Actor的简单使用
- 启用 文本3D(Text 3D) 插件:编辑(Edit)> 插件(Plugins)
- 放置 文本3D Actor
- 我的工程在使用该插件并将其放置到后大世界后,地面上的网格会一直闪烁。闪的我眼睛直疼
- 开启新工程后网格同样也是闪。
- 没有测试空工程开启此插件后的打包情况
属性 | 说明 |
文本(Text) | Shift+Enter |
挤压(Extrude) | 设置几何体的深度:即文字从前到后的厚度 |
斜面(Bevel) | 设置沿着字幕边缘的斜面大小 |
斜面类型(Bevel Type) | 设置边缘斜面的类型:用于锐利、平直斜面的线性或是用于圆形边缘的半圆形 |
半圆分段数 (Half Circle Segments) |
设置创建半圆斜面所使用的分段数 |
正面材质(Front Material) | 选择给字母正面表面着色的材质 |
斜面材质(Bevel Material) | 选择给斜面表面着色的材质 |
挤压材质(Extrude Material) | 选择给字母侧面着色的材质 |
背面材质(Back Material) | 选择给字母背面着色的材质 |
字体(Font) | 导入字体 |
水平对齐(Horizontal Alignment) | 根据Actor在3D空间中的位置,将文本水平向左、居中或向右对齐 |
垂直对齐(Vertical Alignment) | 根据Actor在3D空间中的位置,将文本在垂直方向上与控件的顶线、顶部、底部或中心对齐 |
字距调整(Kerning) | 设置各个字符之间的额外空间 |
行距(Line Spacing) | 设置各行之间的额外空间 |
字距(Word Spacing) | 设置各个词之间的额外空间 |
最大宽度(Max Width) | 设置文本的最大宽度 |
最大高度(Max Height) | 设置文本的最大高度 |
按比例缩放(Scale Proportionally) | 将字母的高度和宽度锁定为当前比例。一旦启用,对字幕的高度或宽度的任何改动都会同时影响到两者 |
创建3D文本Actor
添加名为 [Text3DCharacterTransform] 的组件,在该组件上便可以对字体进行编辑。
添加场景序列
在序列中找到3D的文本对象后对其进行设置
- 注意添加关键帧与相应动作
这里再简单提一嘴导入字体的事情。右边的 [simkai_Font]是将字体拖进来后自动生成的,左边[MyFontTest]是通过在 [Content Browser] 中Add→User Interface→Font创建出来的。
贴花Actor
在定义贴花材质的时候注意下面这两个属性就可以了
- Material Domain:改为Deferred Decal
- Blend Mode:改为Translucent
玩家出生点
- 放置玩家出生点
- 无玩家出生点时,玩家将在世界场景中0,0,0点出生
- 在编辑器视口中 单击右键,选择 Play From Here(从此处开始)
体积Actor
在关卡中指定区域的行为和特征
- 对体积内的玩家或其他Actor造成伤害
- 作为碰撞表面,阻止特定Actor进入体积
- 当Actor进入体积时,对环境做出某种改变(例如,打开门)
- 更改关卡中的照明或可视性
- 音频体积 - 一种区域性音频播放功能
物理组件
破碎
选中需要破碎的Actor,选择 Fracture Mode
New → 选择一种破碎方式 → Fracture → 将破碎颜色关掉
在Content Browser → All 中搜索Bomb添加到场景中,运行便会看到破碎
上方黄色的为剔除厂:
- 将该剔除厂放置到场景中
- 在破碎物体中搜索 [initialization Fields]来添加该剔除厂
目前官方文档初步学习进度
学习的初步学习进度到:编程和脚本编写
之后会在项目与文档间切换着来,此篇将视为随时更新类随笔文档。