在虚幻引擎5中,Contains Item 节点主要用于检查一个数组(Array)或集合(Set)中是否包含某个特定的元素。它是一个非常实用的节点,常用于背包系统、任务条件判断、碰撞检测等场景。
🎯 核心功能
Contains Item 节点的逻辑非常简单:给它一个容器(数组或集合)和一个待查找的元素,它会返回一个布尔值(Boolean):
-
True:如果容器中找到了该元素。
-
False:如果容器中没有该元素。
注意:
Contains Item节点只返回“是”或“否”,不会返回该元素在数组中的具体位置(索引)。如果需要知道位置,应使用Find Item节点。
📝 准备工作
在蓝图中使用该节点前,你需要有一个已创建的数组或集合变量。
-
创建变量:在蓝图的“我的蓝图”面板中,点击“+”新建变量,并为其命名(如
MyItemArray)。 -
设置类型:在变量的“详细信息”面板中,将其类型设置为 Array 或 Set,并指定其元素类型(如
Actor、整数、字符串或自定义的结构体等)。
🛠️ 具体操作步骤
-
放置节点:在蓝图的事件图表中,右键点击空白处,在搜索框中输入
Contains Item,然后从列表中选择它。 -
连接容器:将你的数组或集合变量拖拽到图表中,作为获取节点,然后将其输出引脚连接到
Contains Item节点的Target Set或Target Array输入引脚上。 -
指定查找项:将你想要查找的元素连接到节点的
Item to Find输入引脚。这个元素的数据类型必须与容器中的元素类型一致。 -
使用结果:从
Contains Item节点的Return Value输出引脚拖出一条线,连接到后续的逻辑节点(如Branch节点),根据真假结果执行不同的操作。
💡 实际应用案例
📦 案例一:背包系统 – 检查玩家是否拥有某物品
场景:玩家点击门时,检查其背包中是否有“红钥匙”。
操作流程:
-
准备工作:创建物品结构体
-
在内容浏览器中右键,选择 蓝图 (Blueprint) → 结构体 (Structure),命名为
ItemData。 -
打开结构体,添加变量:
ItemName(文本类型)、ItemID(整数类型)。 -
编译并保存。
-
-
设置玩家背包
-
打开你的“玩家角色”蓝图。
-
在“我的蓝图”面板,点击“+”新建变量,命名为
PlayerInventory。 -
在“详细信息”面板中,将其类型设置为 Array,元素类型选择为
ItemData(你刚创建的结构体)。这表示这个背包数组存放的是物品数据。 -
在事件图表中,你可以用
Add节点往这个数组里添加几个测试物品。
-
-
实现开门交互逻辑
-
在关卡中放置一扇门,为它添加一个“碰撞盒子”组件,并勾选“生成重叠事件”。
-
选中门,在细节面板中点击“添加事件” → “OnComponentBeginOverlap (碰撞盒子)”,生成一个重叠事件节点。
-
在生成的事件节点中,右键搜索并添加
Contains Item节点。 -
从
PlayerInventory变量拖出“获取”节点,连接到Contains Item的Target Array输入引脚。 -
为了创建要查找的物品,右键搜索并添加
Make ItemData节点。设置其ItemName为“红钥匙”,ItemID为1。将Make ItemData的输出连接到Contains Item的Item to Find输入引脚。
-
-
处理判定结果
-
从
Contains Item的Return Value输出引脚拖出,连接到一个Branch(分支) 节点。 -
Branch为 True (找到钥匙):-
从
True执行引脚拖出,添加Print String节点,输入“门已打开!”。 -
(可选) 从
PlayerInventory变量拖出Remove Item节点,将“红钥匙”从背包移除。
-
-
Branch为 False (未找到钥匙):-
从
False执行引脚拖出,添加Print String节点,输入“需要红钥匙!”。
-
-
🧩 案例二:碰撞检测 – 检查重叠的组件是否符合条件
场景:一个机关盒子需要同时被“组件A”和“组件B”两个特定部件接触才能激活。
操作流程:
-
准备工作:创建机关Actor
-
创建一个新的蓝图类,继承自
Actor,命名为TrapActor。 -
打开蓝图,在组件面板中添加两个 Box Collision 组件,分别命名为
Box1和Box2。调整它们的位置,使其能分别被两个不同的部件触发。 -
确保两个碰撞盒子的碰撞预设都设置为“OverlapAllDynamic”或类似可以触发重叠事件的设置。
-
-
添加重叠事件
-
在组件面板中分别选中
Box1和Box2,在细节面板中为它们各自添加OnComponentBeginOverlap事件。这样当任何物体与盒子重叠时,都会触发事件。
-
-
在重叠事件中检测特定组件
-
以
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输入引脚。
-
-
组合判定逻辑
-
按照步骤3的方法,为
Box2的重叠事件也创建一个检测逻辑,用于查找“组件B”。 -
你需要一个变量来记录两个盒子是否都被触发了。在
TrapActor中新建一个布尔变量bBothTriggered,默认 false。 -
当
Box1检测到“组件A”时,将bBothTriggered设为 true;当Box2检测到“组件B”时,也设为 true。 -
用一个
Branch节点检查bBothTriggered,如果为 true,则激活机关。
-
📋 案例三:任务系统 – 检查任务目标是否完成
场景:一个任务要求玩家收集“情报1”、“情报2”、“情报3”三份情报。
操作流程:
-
准备工作:设置任务目标
-
创建一个任务数据资产或结构体(如
QuestData),包含任务名称和目标物品列表。 -
在玩家角色或游戏实例蓝图中,创建一个数组变量
CollectedItems(文本类型),用于存储已收集的物品名称。 -
创建一个任务目标数组变量
QuestTargets(文本类型),包含["情报1", "情报2", "情报3"]。
-
-
实现物品收集逻辑
-
当玩家拾取一个物品时(例如通过重叠事件),将物品名称添加到
CollectedItems数组中。 -
每次添加后,调用一个自定义事件,比如
CheckQuestCompletion,用于检查任务是否完成。
-
-
检查任务是否完成
-
在
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,则所有目标都已收集,任务完成。
-
核心代码逻辑示意 (非代码,是蓝图逻辑):
-
ForEachLoop(遍历QuestTargets) -
→
Contains Item(在CollectedItems中查找Array Element) -
→ 如果
Contains Item返回False -
→ 设置
bAllCollected = false,并Break -
循环结束后,如果
bAllCollected为True,则任务完成。
⚠️ 重要提示
-
类型必须匹配:
Contains Item查找的元素类型必须与数组/集合中存储的元素类型完全一致。 -
避免在Tick中使用:不要在
Event Tick等每帧执行的逻辑中对大型数组使用Contains Item,它本质是线性搜索,可能影响性能。 -
结构体匹配:如果数组存储的是结构体,
Contains Item要求结构体的所有字段值都完全匹配才会返回True。
🤔 常见问题
-
Contains Item能用于结构体吗?
可以,但需要注意结构体必须完全匹配才会返回True。即结构体中每个成员变量的值都相同。 -
为什么我明明有元素,却返回
False?
最常见的原因是类型不匹配。比如,你在数组中存的是Actor引用,但查找时传入的是一个Actor 类(Class),或者传入的是不同实例的同一个Actor。请确保查找的元素与容器中的元素是同一个对象引用或完全相同的值。
感谢您的来访,获取更多精彩文章请收藏本站。







暂无评论内容