Choose your operating system:
Windows
macOS
Linux
蓝图Map 继 蓝图阵列 后如此流行事出有因。其支持使用相关键对值进行高效查找和检索。完成本指南的学习,便能拥有在蓝图脚本环境中创建和编辑Map、查询和显示项目,以及在虚幻引擎4(UE4)中对蓝图Map执行基本操作的部分经验。
1.必需设置
开始使用蓝图Map前,需设置项目以显示容器中的内容。
-
选择 游戏(Games) > 第一人称(First Person) 模板,新建一个项目,并且使用以下设置:
-
选择 蓝图(Blueprint)
-
选择 最高质量(Maximum Quality)
-
选择 桌面/游戏机(Desktop/Console)
-
选择 含初学者内容(With Starter Content)
-
-
将项目命名为 ExampleMapProject 。
-
从项目的 内容浏览器 中双击 Blueprint 文件夹。
-
在 内容浏览器 中,点击 新增 按钮,然后选择 蓝图类 ,其位于 创建基本资源(Create Basic Asset) 弹出菜单下。
-
打开 选取父类(Pick Parent Class) 菜单后,点击 所有类 箭头,搜索 TextRender Actor 蓝图类。
-
在 搜索栏 中输入 TextRenderActor ,选择 TextRenderActor 蓝图类,然后点击 选择 按钮。
-
现在,在项目的 内容浏览器 中可找到新的 TextRender Actor 。将此新的Actor命名为 DisplayMap 。
-
现在,将 DisplayMap TextRender Actor拖入虚幻编辑器的 视角(3D)视口(Perspective (3D) Viewport) 。
-
选择 DisplayMap TextRender Actor后,点击 +添加组件 按钮(位于 细节 面板中),并在 搜索栏 中输入 Box Collision 。
-
将 盒体碰撞组件(Box Collision Component) 添加到TextRender Actor后,将新组件命名为 Trigger Box 。
-
现在选择TextRender组件,在 细节 面板中查看Actor的 变换 。
-
更新 显示Map Actor的 变换 ,以反映以下值:
-
现在,将 显示Map Actor的 水平对齐 改为 居中 对齐(而非 水平对齐 默认值 左 对齐)。
-
目前, 触发框 组件已 在游戏中隐藏 。取消勾选 在游戏中隐藏 复选框(位于 细节 面板的 渲染 菜单中),即可在游戏中查看 盒体碰撞(Box Collision) 组件。
在游戏中查看 盒体碰撞 组件是利用底层逻辑驱动触发事件,以调试潜在问题的好办法。
-
如进入PIE(在编辑器中运行)模式,可发现发射物会对 显示Map 碰撞盒体产生碰撞响应。目前仅需要 显示Map 碰撞盒体触发事件,以显示Map容器的内容。为此,前往 碰撞 菜单(位于 细节 面板中),点击 碰撞预设 下拉列表框,然后选择 自定义…… 选项。
-
最后更新 碰撞预设 反映以下值:
阶段成果
现在已新建项目,同时设置新的TextRender Actor,其将显示你在下一步中创建、编辑和显示的蓝图Map容器的内容。
2.创建和显示蓝图Map
已在新建项目中设置 TextRender Actor,现可创建蓝图Map容器,其中内容将在游戏内显示。
-
如屏幕显示如下,点击 打开完整蓝图编辑器(Open Full Blueprint Editor) 链接开始操作。
-
应可看到 DisplayMap TextRender Actor蓝图 事件图表 ,可在其中添加蓝图Map及其显示逻辑。
-
现在应创建蓝图Map容器,需将部分之后显示的键-值对保存其中。要新建蓝图Map,点击 +新增 按钮(位于 我的蓝图 面板中),并从下拉列表中选择 变量 。
-
将该新变量命名为
Instruction Map
。
-
点击变量命名旁的变量 引脚类型(pin type) 按钮。
-
现在选择下拉列表中的 整数 变量类型。
-
点击变量的 容器类型 按钮,其位于 细节 面板中 变量类型 下拉列表旁。
-
现在选择下拉列表中的 Map 容器类型。
-
是时候定义Map的键-值属性类型了。键目前是 帧数 类型,为理想属性类型。然而该值类型并非 字符串 变量类型。要将值从 整数 改为 字符串 ,点击值属性类型下拉列表。
-
在下拉列表中选择 字符串 。
-
现在已拥有由 整数 类型和 字符串 类型组成的键-值对(各自)。同时蓝图图表将进行提示:需编译蓝图,才可定义要存储在容器内的项目。点击 编译 按钮开始操作。
编译蓝图会将替换容器的 默认值 消息换为其他界面,以便使用键-值对填充容器,其中Map的键为整数,值为字符串。
-
如尚未完成该步骤,请点击 保存 按钮,保存目前所有工作。
-
点击 + (添加元素)按钮(位于 细节 面板的 默认值 菜单中),将新键-值对添加到新定义的 指令Map(Instruction Map) 容器中。
-
定义容器的新键-值对,将键定义为
1
,并将值定义为使用WASD运行(WASD to run)
。 -
重复以上两个步骤,确保使用以下键-值对填充 指令Map 容器:
编写逻辑脚本
在显示新建蓝图Map的内容前,需编写必要逻辑。
-
现已定义容器,继续将 指令Map 变量拖入蓝图事件图表。
-
在 指令Map 下拉列表中选择 获取(Get) 。
-
从 Instruction Map 节点连出引线,并从 Map实用程序(Map Utilities) 界面添加 Find 节点。
有多种方法会可获取Map中的值。对于本教程的此章节,将继续并增加整数键显示 指令Map 中包含的相关值。
-
牢记之前事项,点击 +添加新增(Add New) 按钮,在下拉列表中选择 变量 。
-
确保将新变量的类型设为 整数 类型,并命名为
Key
。右键点击引脚类型,将它改为单个值,而非Map类型(如有必要)。 -
声明并定义新的 整数 变量后,将 键 拖入蓝图事件图表中,并在下拉列表中选择 获取 。
-
从 Key 节点连出引线,搜索并添加 IncrementInt 节点。
-
现将 IncrementInt 节点连接至 Find 节点。
本教程中将使用时间函数来增量 Key 变量。
-
从 Event Tick 节点连出引线,搜索并添加 Delay 节点。
-
将延时时长设为 2 秒,然后将 Delay 节点连接至 IncrementInt 节点。
-
然后从 Event BeginPlay 节点连出引线,搜索并连接至 Branch 节点。
-
将 IncrementInt 节点连接至 Branch 节点。
-
现在将属于 Find 节点的 布尔 返回值连接到 Branch 节点的 条件 引脚。
如 Find 节点成功定位Map中的项目,则该节点将返回true。否则, Find 节点返回false时,Map中将不包含使用提供键的项目。
-
从 Branch 节点的 True 引脚连出引线,搜索并连接到 Set Text(TextRender) 节点。
逻辑的此分支意味着,如容器中存在有效键-值对,则显示容器的相关值。
-
要在游戏中显示容器的值,将 Find 节点的返回 值 引脚连接到 Set Text 节点的 值 引脚。
-
现在从 Branch 节点的 False 引脚连出引线,搜索并连接 Set Text(TextRender) 节点。
逻辑的此分支意味着,如容器中无有效键-值对,则显示其他内容。
-
从 Branch 节点的 值 引脚连出引线,搜索并连接到 ToText(string) 节点。
-
现在定义要读取的字符串:
Now, shoot the blocks!
。 -
检查完成的脚本后,点击 编译 按钮,之后返回编辑器的 视口 界面。
-
在编辑器的 视口 界面中,点击 运行 按钮查看新实现的脚本。
分段结果
本指南目前的章节中,已定义新的蓝图Map、键-值对已填充到容器中,并已使用 TextRender Actor蓝图事件图表中创建的部分基本逻辑显示了值。如要学习更高级的操作方式,请继续下一步骤,可学习向Map 添加 键-值对,以后续显示Map的值。
3.向Map添加键和值
现在应该已具有了 TextRender Actor,其将显示在上一步中定义的蓝图Map的相关值。在此步中将可学习向Map 添加 键-值对的方法,以后续显示Map的键和相关值。
-
现在应能看到 显示Map TextRender Actor蓝图 事件图表 ,可在其中添加新的蓝图Map,同时可向其中 添加 新的键值对,最终将Map的键-值对和相关值显示到 视口 。
-
在本教程的此步骤中,需新建之后 添加 运算的蓝图Map容器。右键点击 指令Map 变量,并在下拉列表中选择 复制 ,以新建蓝图Map变量,并将其命名为
Weapon Inventory Map
。 -
确保新的Map容器匹配以下属性,其中键为字符串,值为整数:
为讲解需要进行说明:当前创建的是武器物品栏蓝图Map容器,其中键是武器名称,值是武器可用弹药量。
-
如选择新的蓝图Map,应可看到内容为
Please compile the blueprint
的 默认值 消息。 -
点击 编译 按钮。
-
编译蓝图后,应可看到 默认值 消息消失,为默认的空白Map让出空间。点击 + (添加元素)按钮,添加一个键值对。
-
编辑器的编译结果窗口此时还会发出以下警告:
-
用以下键-值对填充新 武器物品栏Map 容器:
-
现在点击 编译 按钮。
-
用正确类型的键-值对填充 武器物品栏Map ,满足新蓝图Map的键值属性要求后,警告应该会消失。
-
向现有蓝图事件图添加新逻辑前,将 武器物品栏Map 变量拖入蓝图中,然后在下拉菜单中选择 获取(Get) 变量。
编写逻辑脚本
-
要开始构建新逻辑,从 Map实用程序 界面中 Weapon Inventory Map 节点连出引线并添加 Keys 节点。
Keys 节点将输出 武器物品栏Map 中显示的所有键的阵列。
-
从 Keys 节点的 阵列 输出引脚连出引线,搜索并添加 ForEachLoop 节点。
-
现在,从 ForEachLoop 节点的 阵列元素(Array Element) 引脚连出引线,搜索并添加 Print String 节点。
-
右键点击蓝图图表,打开 快捷菜单 ,在其中搜索并添加 Event ActorBeginOverlap 。
-
从 Event ActorBeginOverlap 节点的 Other Actor 引脚连出引线,搜索并添加 Cast To FirstPersonProjectile 节点。
-
现在将 Cast To FirstPersonProjectile 节点连接至 Keys 节点。
显示Map的键
现在如进入PIE模式,将可向 显示Map TextRender Actor的碰撞盒体中射出发射物,其中将能显示包含在 武器物品栏Map 中的键阵列。
完成脚本
-
现在应向容器中添加新键-值对。为此,将 Weapon Inventory Map 变量拖入蓝图。
-
从 Weapon Inventory Map 变量连出引线,并从 Map实用程序 界面添加 Add 节点。
-
现在定义要添加的键-值对,将
Weapon 6
定义为键、60
为值。 -
从 Add 节点的输出引脚,搜索并添加 Branch 节点。
-
在可设置额外显示逻辑,显示添加的键前,需将 Weapon Inventory Map 变量拖入蓝图。
-
现在从 Weapon Inventory Map 变量连出引线,并从 Map实用程序 界面添加 Keys** 节点。
-
从 Keys 节点的 阵列 输出引脚连出引线,搜索并添加 ForEachLoop 节点。
-
现在,从 ForEachLoop 节点的 阵列元素 引脚连出引线,搜索并添加 Print String 节点。
-
点击 文本颜色 框打开 取色器 菜单。
-
将颜色设置为以下值:
-
在可设置更多显示逻辑,显示额外值前,同样需将 Weapon Inventory Map 变量拖入蓝图。
-
现在从 Weapon Inventory Map 变量连出引线,并从 Map实用程序 界面添加 Values 节点。
-
从属于 Values 节点的 阵列 输出引脚连出引线,搜索并添加 ForEachLoop 节点。
-
现在从 ForEachLoop 节点的 执行输出 引脚连出引线,搜索并添加 Print String 节点。
-
从 ForEachLoop 节点的 阵列元素 引脚连出引线,将其连接至 Print String 节点的 输入字符串(In String) 引脚。
-
点击 文本颜色 框打开 取色器 菜单。
-
将颜色设置为以下值:
-
将 Branch 节点的 True 引脚连接到 Keys 节点。
-
现在将 Branch 节点的 False 引脚连接到 Values 节点。
-
要完成脚本的逻辑,将 Cast To FirstPersonProjectile 节点的 Cast Failed 引脚连接到 Add 节点。
-
脚本检查完成后,点击 编译 按钮。
-
最后点击 保存 按钮,然后返回编辑器的 视口 界面。
-
在编辑器的 视口 界面中,点击 运行 按钮查看当前运行的更新脚本。
最终结果
正如视频中所见,最初向 显示Map TextRender Actor的碰撞盒体中射出 第一人称发射物 时,可看到初始的五个键被打印到 视口 中。之后,穿过碰撞盒体时,可看到新键被添加之后又被打印。退出碰撞盒体后,继续发射另一枚 第一人称发射物 ,以确认新添加的键。最后二次穿过碰撞盒体时,将看到所有的值已被打印。