虚幻引擎 Contains Item 节点

在虚幻引擎5中,Contains Item 节点主要用于检查一个数组(Array)或集合(Set)中是否包含某个特定的元素。它是一个非常实用的节点,常用于背包系统、任务条件判断、碰撞检测等场景。

🎯 核心功能

Contains Item 节点的逻辑非常简单:给它一个容器(数组或集合)和一个待查找的元素,它会返回一个布尔值(Boolean)

  • True:如果容器中找到了该元素

  • False:如果容器中没有该元素

注意Contains Item 节点只返回“是”或“否”,不会返回该元素在数组中的具体位置(索引)。如果需要知道位置,应使用 Find Item 节点

📝 准备工作

在蓝图中使用该节点前,你需要有一个已创建的数组集合变量。

  1. 创建变量:在蓝图的“我的蓝图”面板中,点击“+”新建变量,并为其命名(如 MyItemArray)。

  2. 设置类型:在变量的“详细信息”面板中,将其类型设置为 Array 或 Set,并指定其元素类型(如 Actor整数字符串 或自定义的 结构体 等)。

🛠️ 具体操作步骤

  1. 放置节点:在蓝图的事件图表中,右键点击空白处,在搜索框中输入 Contains Item,然后从列表中选择它

  2. 连接容器:将你的数组或集合变量拖拽到图表中,作为获取节点,然后将其输出引脚连接到 Contains Item 节点的 Target Set 或 Target Array 输入引脚上

  3. 指定查找项:将你想要查找的元素连接到节点的 Item to Find 输入引脚。这个元素的数据类型必须与容器中的元素类型一致。

  4. 使用结果:从 Contains Item 节点的 Return Value 输出引脚拖出一条线,连接到后续的逻辑节点(如 Branch 节点),根据真假结果执行不同的操作。

💡 实际应用案例

📦 案例一:背包系统 – 检查玩家是否拥有某物品

场景:玩家点击门时,检查其背包中是否有“红钥匙”。

操作流程

  1. 准备工作:创建物品结构体

    • 在内容浏览器中右键,选择 蓝图 (Blueprint) → 结构体 (Structure),命名为 ItemData

    • 打开结构体,添加变量:ItemName (文本类型)、ItemID (整数类型)。

    • 编译并保存。

  2. 设置玩家背包

    • 打开你的“玩家角色”蓝图。

    • 在“我的蓝图”面板,点击“+”新建变量,命名为 PlayerInventory

    • 在“详细信息”面板中,将其类型设置为 Array,元素类型选择为 ItemData (你刚创建的结构体)。这表示这个背包数组存放的是物品数据

    • 在事件图表中,你可以用 Add 节点往这个数组里添加几个测试物品。

  3. 实现开门交互逻辑

    • 在关卡中放置一扇门,为它添加一个“碰撞盒子”组件,并勾选“生成重叠事件”。

    • 选中门,在细节面板中点击“添加事件” → “OnComponentBeginOverlap (碰撞盒子)”,生成一个重叠事件节点

    • 在生成的事件节点中,右键搜索并添加 Contains Item 节点

    • 从 PlayerInventory 变量拖出“获取”节点,连接到 Contains Item 的 Target Array 输入引脚。

    • 为了创建要查找的物品,右键搜索并添加 Make ItemData 节点。设置其 ItemName 为“红钥匙”,ItemID 为 1。将 Make ItemData 的输出连接到 Contains Item 的 Item to Find 输入引脚

  4. 处理判定结果

    • 从 Contains Item 的 Return Value 输出引脚拖出,连接到一个 Branch (分支) 节点

    • Branch 为 True (找到钥匙)

      • 从 True 执行引脚拖出,添加 Print String 节点,输入“门已打开!”。

      • (可选) 从 PlayerInventory 变量拖出 Remove Item 节点,将“红钥匙”从背包移除。

    • Branch 为 False (未找到钥匙)

      • 从 False 执行引脚拖出,添加 Print String 节点,输入“需要红钥匙!”。


🧩 案例二:碰撞检测 – 检查重叠的组件是否符合条件

场景:一个机关盒子需要同时被“组件A”和“组件B”两个特定部件接触才能激活。

操作流程

  1. 准备工作:创建机关Actor

    • 创建一个新的蓝图类,继承自 Actor,命名为 TrapActor

    • 打开蓝图,在组件面板中添加两个 Box Collision 组件,分别命名为 Box1 和 Box2。调整它们的位置,使其能分别被两个不同的部件触发。

    • 确保两个碰撞盒子的碰撞预设都设置为“OverlapAllDynamic”或类似可以触发重叠事件的设置

  2. 添加重叠事件

    • 在组件面板中分别选中 Box1 和 Box2,在细节面板中为它们各自添加 OnComponentBeginOverlap 事件。这样当任何物体与盒子重叠时,都会触发事件。

  3. 在重叠事件中检测特定组件

    • 以 Box1 的 OnComponentBeginOverlap 事件为例,从事件节点的 Overlapped Component 输出引脚拖出

    • 右键搜索并添加 Contains Item 节点

    • 连接 Contains Item 的 Target Set 输入引脚到 GetOverlappingComponents 节点。你需要先获取与 Box1 重叠的所有组件列表。

      • 右键搜索并添加 Get Overlapping Components 节点,将其 Target 设置为 Box1 组件本身。

      • 将 GetOverlappingComponents 的输出(一个数组)连接到 Contains Item 的 Target Array 输入引脚

    • 对于 Item to Find,你需要指定要查找的“组件A”。你可以通过 Get Owner 或直接引用一个特定的组件变量。为了演示,这里直接创建一个指向“组件A”的引用。将其连接到 Item to Find 输入引脚

  4. 组合判定逻辑

    • 按照步骤3的方法,为 Box2 的重叠事件也创建一个检测逻辑,用于查找“组件B”。

    • 你需要一个变量来记录两个盒子是否都被触发了。在 TrapActor 中新建一个布尔变量 bBothTriggered,默认 false。

    • 当 Box1 检测到“组件A”时,将 bBothTriggered 设为 true;当 Box2 检测到“组件B”时,也设为 true。

    • 用一个 Branch 节点检查 bBothTriggered,如果为 true,则激活机关。


📋 案例三:任务系统 – 检查任务目标是否完成

场景:一个任务要求玩家收集“情报1”、“情报2”、“情报3”三份情报。

操作流程

  1. 准备工作:设置任务目标

    • 创建一个任务数据资产或结构体(如 QuestData),包含任务名称和目标物品列表。

    • 在玩家角色或游戏实例蓝图中,创建一个数组变量 CollectedItems (文本类型),用于存储已收集的物品名称

    • 创建一个任务目标数组变量 QuestTargets (文本类型),包含 ["情报1", "情报2", "情报3"]

  2. 实现物品收集逻辑

    • 当玩家拾取一个物品时(例如通过重叠事件),将物品名称添加到 CollectedItems 数组中。

    • 每次添加后,调用一个自定义事件,比如 CheckQuestCompletion,用于检查任务是否完成。

  3. 检查任务是否完成

    • 在 CheckQuestCompletion 事件中,你需要遍历 QuestTargets 数组,检查每一个目标是否都存在于 CollectedItems 中

    • 使用 For Each Loop 节点遍历 QuestTargets 数组。

    • 在循环体内:

      • 使用 Contains Item 节点,将 Target Array 设置为 CollectedItems 变量

      • 将 Item to Find 设置为 For Each Loop 的 Array Element 输出(即当前循环到的目标物品名称)

    • 使用一个布尔变量 bAllCollected,初始为 true

    • 如果 Contains Item 返回 False(说明某个目标物品还未收集),将 bAllCollected 设为 false 并跳出循环 (Break)。

    • 循环结束后,检查 bAllCollected。如果为 true,则所有目标都已收集,任务完成。

核心代码逻辑示意 (非代码,是蓝图逻辑)

  1. ForEachLoop (遍历 QuestTargets)

  2. → Contains Item (在 CollectedItems 中查找 Array Element)

  3. → 如果 Contains Item 返回 False

  4. → 设置 bAllCollected = false,并 Break

  5. 循环结束后,如果 bAllCollected 为 True,则任务完成。


⚠️ 重要提示

  • 类型必须匹配Contains Item 查找的元素类型必须与数组/集合中存储的元素类型完全一致

  • 避免在Tick中使用:不要在 Event Tick 等每帧执行的逻辑中对大型数组使用 Contains Item,它本质是线性搜索,可能影响性能

  • 结构体匹配:如果数组存储的是结构体,Contains Item 要求结构体的所有字段值都完全匹配才会返回 True

🤔 常见问题

  • Contains Item 能用于结构体吗?
    可以,但需要注意结构体必须完全匹配才会返回 True。即结构体中每个成员变量的值都相同。

  • 为什么我明明有元素,却返回 False
    最常见的原因是类型不匹配。比如,你在数组中存的是 Actor 引用,但查找时传入的是一个 Actor 类(Class),或者传入的是不同实例的同一个 Actor。请确保查找的元素与容器中的元素是同一个对象引用完全相同的值

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容