使用Map

学习在蓝图中使用Map的方法。

Windows
MacOS
Linux

workingWithMaps_topicBanner.png

蓝图Map蓝图阵列后如此流行事出有因。其支持使用相关键对值进行高效查找和检索。完成本指南的学习,便能拥有在蓝图脚本环境中创建和编辑Map、查询和显示项目,以及在虚幻引擎4(UE4)中对蓝图Map执行基本操作的部分经验。

1.必需设置

开始使用蓝图Map前,需设置项目以显示容器中的内容。

  1. 虚幻项目浏览器 中,选择 新建项目(New Project) 选项卡,选择 第一人称(First Person) 蓝图项目,并将其命名为 ExampleMapProject

点击查看大图。

  1. 在新建项目前,确保该项目已进行以下设置:

点击查看大图。

  1. 从项目的 内容浏览器 中双击 Blueprint 文件夹。

点击查看大图。

  1. 内容浏览器 中,点击 新增 按钮,将鼠标光标悬停在 蓝图类 上,其位于 创建基本资源(Create Basic Asset) 弹出菜单下。

点击查看大图。

  1. 打开 选取父类(Pick Parent Class) 菜单后,点击 所有类 箭头,搜索 TextRender Actor 蓝图类。

Step1_4.png

  1. 搜索栏 中输入 TextRenderActor,选择 TextRenderActor 蓝图类,然后点击 选择 按钮。

Step1_5.png

  1. 现在,在项目的 内容浏览器 中可找到新的 TextRender Actor。将此新的Actor命名为 DisplayMap

点击查看大图。

  1. 现在,将 DisplayMap TextRender Actor拖入虚幻编辑器的 视角(3D)视口(Perspective (3D) Viewport)

点击查看大图。

  1. 选择 DisplayMap TextRender Actor后,点击 +添加组件 按钮(位于 细节 面板中),并在 搜索栏 中输入 Box Collision

点击查看大图。

  1. 盒体碰撞组件(Box Collision Component) 添加到TextRender Actor后,将新组件命名为 Trigger Box

点击查看大图。

  1. 现在选择TextRender组件,在 细节 面板中查看Actor的 变换

点击查看大图。

  1. 更新 显示Map Actor的 变换,以反映以下值:

Step1_11.png

  1. 现在,将 显示Map Actor的 水平对齐 改为 居中 对齐(而非 水平对齐 默认值 对齐)。

Step1_12.png

  1. 目前,触发框 组件已 在游戏中隐藏。取消勾选 在游戏中隐藏 复选框(位于 细节 面板的 渲染 菜单中),即可在游戏中查看 盒体碰撞(Box Collision) 组件。

Step1_13.png

在游戏中查看 盒体碰撞 组件是利用底层逻辑驱动触发事件,以调试潜在问题的好办法。

  1. 如进入PIE(在编辑器中运行)模式,可发现发射物会对 显示Map 碰撞盒体产生碰撞响应。目前仅需要 显示Map 碰撞盒体触发事件,以显示Map容器的内容。为此,前往 碰撞 菜单(位于 细节 面板中),点击 碰撞预设 下拉列表框,然后选择 自定义…… 选项。

Step1_14.png

  1. 最后更新 碰撞预设 反映以下值:

Step1_15.png

分段结果

点击查看大图。

现在已新建项目,同时设置新的TextRender Actor,其将显示你在下一步中创建、编辑和显示的蓝图Map容器的内容。

2.创建和显示蓝图Map

已在新建项目中设置 TextRender Actor,现可创建蓝图Map容器,其中内容将在游戏内显示。

  1. 在项目的 内容浏览器 中,双击 显示集 TextRender Actor,打开其蓝图 事件图表

    点击查看大图。

  2. 如屏幕显示如下,点击 打开完整蓝图编辑器(Open Full Blueprint Editor) 链接开始操作。

    点击查看大图。

  3. 应可看到 显示集 TextRender Actor蓝图 事件图表,可在其中添加蓝图Map及其显示逻辑。

    点击查看大图。

    如屏幕未入之前所示那样显示,点击 事件图表 选项卡,打开Actor的蓝图事件图表编辑器。

    点击查看大图。

  4. 现在应创建蓝图Map容器,需将部分之后显示的键-值对保存其中。要新建蓝图Map,点击 +新增 按钮(位于 我的蓝图 面板中),并从下拉列表中选择 变量
    Step2_4.png

  5. 将该新变量命名为 Instruction Map
    Step2_5.png

  6. 点击变量命名旁的变量 引脚类型(pin type) 按钮。
    Step2_6.png

  7. 现在选择下拉列表中的 整数 变量类型。
    Step2_7.png

  8. 点击变量的 容器类型 按钮,其位于 细节 面板中 变量类型 下拉列表旁。
    Step2_8.png

  9. 现在选择下拉列表中的 Map 容器类型。
    Step2_9.png

  10. 是时候定义Map的键-值属性类型了。键目前是 帧数 类型,为理想属性类型。然而该值类型并非 字符串 变量类型。要将值从 整数 改为 字符串 ,点击值属性类型下拉列表。
    Step2_10.png

  11. 在下拉列表中选择 字符串
    Step2_11.png

  12. 现在已拥有由 整数 类型和 字符串 类型组成的键-值对(各自)。同时蓝图图表将进行提示:需编译蓝图,才可定义要存储在容器内的项目。点击 编译 按钮开始操作。

    点击查看大图。

    编译蓝图会将替换容器的 默认值 消息换为其他界面,以便使用键-值对填充容器,其中Map的键为整数,值为字符串。

  13. 如尚未完成该步骤,请点击 保存 按钮,保存目前所有工作。

    点击查看大图。

    建议提前并随时进行保存。

  14. 点击 +(添加元素)按钮(位于 细节 面板的 默认值 菜单中),将新键-值对添加到新定义的 指令Map(Instruction Map) 容器中。

    点击查看大图。

  15. 定义容器的新键-值对,将键定义为 1,并将值定义为 使用WASD运行(WASD to run)

    Step2_15.png

  16. 重复以上两个步骤,确保使用以下键-值对填充 指令Map 容器:

    Step2_16.png

编写逻辑脚本

在显示新建蓝图Map的内容前,需编写必要逻辑。

  1. 现已定义容器,继续将 指令Map 变量拖入蓝图事件图表。

    点击查看大图。

  2. 指令Map 下拉列表中选择 获取(Get)

    点击查看大图。

  3. Instruction Map 节点连出引线,并从 Map实用程序(Map Utilities) 界面添加 Find 节点。

    点击查看大图。

    有多种方法会可获取Map中的值。对于本教程的此章节,将继续并增加整数键显示 指令Map 中包含的相关值。

  4. 牢记之前事项,点击 +添加新增(Add New) 按钮,在下拉列表中选择 变量

    Step2_20.png

  5. 确保将新变量的类型设为 整数 类型,并命名为 Key

    Step2_21.png

  6. 声明并定义新的 整数 变量后,将 拖入蓝图事件图表中,并在下拉列表中选择 获取

    点击查看大图。

  7. Key 节点连出引线,搜索并添加 IncrementInt 节点。

    点击查看大图。

  8. 现将 IncrementInt 节点连接至 Find 节点。

    点击查看大图。

    本教程中将使用时间函数来增量 Key 变量。

  9. Event Tick 节点连出引线,搜索并添加 Delay 节点。

    点击查看大图。

  10. 将延时时长设为 2 秒,然后将 Delay 节点连接至 IncrementInt 节点。

    点击查看大图。

  11. 然后从 Event BeginPlay 节点连出引线,搜索并连接至 Branch 节点。

    点击查看大图。

  12. IncrementInt 节点连接至 Branch 节点。

    点击查看大图。

  13. 现在将属于 Find 节点的 布尔 返回值连接到 Branch 节点的 条件 引脚。

    点击查看大图。

    Find 节点成功定位Map中的项目,则该节点将返回true。否则,Find 节点返回false时,Map中将不包含使用提供键的项目。

  14. Branch 节点的 True 引脚连出引线,搜索并连接到 Set Text(TextRender) 节点。

    点击查看大图。

    逻辑的此分支意味着,如容器中存在有效键-值对,则显示容器的相关值。

  15. 要在游戏中显示容器的值,将 Find 节点的返回 引脚连接到 Set Text 节点的 引脚。

    点击查看大图。

  16. 现在从 Branch 节点的 False 引脚连出引线,搜索并连接 Set Text(TextRender) 节点。

    点击查看大图。

    逻辑的此分支意味着,如容器中无有效键-值对,则显示其他内容。

  17. Branch 节点的 引脚连出引线,搜索并连接到 ToText(string) 节点。

    点击查看大图。

  18. 现在定义要读取的字符串:Now, shoot the blocks!

    点击查看大图。

  19. 检查完成的脚本后,点击 编译 按钮,之后返回编辑器的 视口 界面。

    点击查看大图。

  20. 在编辑器的 视口 界面中,点击 运行 按钮查看新实现的脚本。

    点击查看大图。

分段结果

本指南目前的章节中,已定义新的蓝图Map、键-值对已填充到容器中,并已使用 TextRender Actor蓝图事件图表中创建的部分基本逻辑显示了值。如要学习更高级的操作方式,请继续下一步骤,可学习向Map 添加 键-值对,以后续显示Map的值。

3.向Map添加键和值

现在应该已具有了 TextRender Actor,其将显示在上一步中定义的蓝图Map的相关值。在此步中将可学习向Map 添加 键-值对的方法,以后续显示Map的键和相关值。

  1. 在项目的 内容浏览器 中,双击 显示Map TextRender Actor,打开其蓝图 事件图表

    点击查看大图。

  2. 现在应能看到 显示Map TextRender Actor蓝图 事件图表,可在其中添加新的蓝图Map,同时可向其中 添加 新的键值对,最终将Map的键-值对和相关值显示到 视口

    点击查看大图。

  3. 在本教程的此步骤中,需新建之后 添加 运算的蓝图Map容器。右键点击 指令Map 变量,并在下拉列表中选择 复制,以新建蓝图Map变量,并将其命名为 Weapon Inventory Map

    Step3_3.png

  4. 确保新的Map容器匹配以下属性,其中键为字符串,值为整数:

    Step3_4.png

    为讲解需要进行说明:当前创建的是武器物品栏蓝图Map容器,其中键是武器名称,值是武器可用弹药量。

  5. 如选择新的蓝图Map,应可看到内容为 Please compile the blueprint默认值 消息。

    点击查看大图。

  6. 点击 编译 按钮。

    点击查看大图。

  7. 编译蓝图后,应可看到 默认值 消息消失,为默认键-值对让出空间。

    点击查看大图。

  8. 编辑器此时还会发出以下警告:

    点击查看大图。

    UE4发送此警告是由于正在复制 指令Map,该蓝图Map具备整数-字符串的键-值属性,以创建 武器物品栏Map(Weapon Inventory Map),其也是具备整数-字符串的键-值属性的蓝图Map。在复制过程中,引擎会解析属于 指令Map 的键-值对,尝试将其复制到 武器物品栏Map 的键-值对中,此并非理想行为。

    点击查看大图。

  9. 用以下键-值对填充新 武器物品栏Map 容器:

    Step3_9.png

  10. 现在点击 编译 按钮。

    点击查看大图。

  11. 用正确类型的键-值对填充 武器物品栏Map,满足新蓝图Map的键值属性要求后,警告应该会消失。

    点击查看大图。

  12. 向现有蓝图事件图添加新逻辑前,将 武器物品栏Map 变量拖入蓝图中。

    点击查看大图。

编写逻辑脚本

  1. 要开始构建新逻辑,从 Map实用程序 界面中 Weapon Inventory Map 节点连出引线并添加 Keys 节点。

    点击查看大图。

    Keys 节点将输出 武器物品栏Map 中显示的所有键的阵列。

  2. Keys 节点的 阵列 输出引脚连出引线,搜索并添加 ForEachLoop 节点。

    点击查看大图。

  3. 现在,从 ForEachLoop 节点的 阵列元素(Array Element) 引脚连出引线,搜索并添加 Print String 节点。

    点击查看大图。

  4. 右键点击蓝图图表,打开 快捷菜单,在其中搜索并添加 Event ActorBeginOverlap

    点击查看大图。

  5. Event ActorBeginOverlap 节点的 Other Actor 引脚连出引线,搜索并添加 Cast To FirstPersonProjectile 节点。

    点击查看大图。

  6. 现在将 Cast To FirstPersonProjectile 节点连接至 Keys 节点。

    点击查看大图。

显示Map的键

现在如进入PIE模式,将可向 显示Map TextRender Actor的碰撞盒体中射出发射物,其中将能显示包含在 武器物品栏Map 中的键阵列。

点击查看大图。

完成脚本

  1. 现在应向容器中添加新键-值对。为此,将 Weapon Inventory Map 变量拖入蓝图。

    点击查看大图。

  2. Weapon Inventory Map 变量连出引线,并从 Map实用程序 界面添加 Add 节点。

    点击查看大图。

  3. 现在定义要添加的键-值对,将 Weapon 6 定义为键、60 为值。

    点击查看大图。

  4. Add 节点的 布尔返回值 引脚连出引线,搜索并添加 Branch 节点。

    点击查看大图。

  5. 在可设置额外显示逻辑,显示添加的键前,需将 Weapon Inventory Map 变量拖入蓝图。

    点击查看大图。

  6. 现在从 Weapon Inventory Map 变量连出引线,并从 Map实用程序 界面添加 Keys** 节点。

    点击查看大图。

  7. Keys 节点的 阵列 输出引脚连出引线,搜索并添加 ForEachLoop 节点。

    点击查看大图。

  8. 现在,从 ForEachLoop 节点的 阵列元素 引脚连出引线,搜索并添加 Print String 节点。

    点击查看大图。

  9. 点击 文本颜色 框打开 取色器 菜单。

    点击查看大图。

  10. 将颜色设置为以下值:

    Step3_28.png

  11. 在可设置更多显示逻辑,显示额外值前,同样需将 Weapon Inventory Map 变量拖入蓝图。

    点击查看大图。

  12. 现在从 Weapon Inventory Map 变量连出引线,并从 Map实用程序 界面添加 Values 节点。

    点击查看大图。

  13. 从属于 Values 节点的 阵列 输出引脚连出引线,搜索并添加 ForEachLoop 节点。

    点击查看大图。

  14. 现在从 ForEachLoop 节点的 执行输出 引脚连出引线,搜索并添加 Print String 节点。

    点击查看大图。

  15. ForEachLoop 节点的 阵列元素 引脚连出引线,将其连接至 Print String 节点的 输入字符串(In String) 引脚。

    点击查看大图。

  16. 点击 文本颜色 框打开 取色器 菜单。

    点击查看大图。

  17. 将颜色设置为以下值:

    Step3_35.png

  18. Branch 节点的 True 引脚连接到 Keys 节点。

    点击查看大图。

  19. 现在将 Branch 节点的 False 引脚连接到 Values 节点。

    点击查看大图。

  20. 要完成脚本的逻辑,将 Cast To FirstPersonProjectile 节点的 Cast Failed 引脚连接到 Add 节点。

    点击查看大图。

  21. 脚本检查完成后,点击 编译 按钮。

    点击查看大图。

  22. 最后点击 保存 按钮,然后返回编辑器的 视口 界面。

    点击查看大图。

  23. 在编辑器的 视口 界面中,点击 运行 按钮查看当前运行的更新脚本。

    点击查看大图。

最终结果

正如视频中所见,最初向 显示Map TextRender Actor的碰撞盒体中射出 第一人称发射物 时,可看到初始的五个键被打印到 视口 中。之后,穿过碰撞盒体时,可看到新键被添加之后又被打印。退出碰撞盒体后,继续发射另一枚 第一人称发射物,以确认新添加的键。最后二次穿过碰撞盒体时,将看到所有的值已被打印。

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见