重叠检测事件
目前我们已经实现好了基本的抓取功能。我们再回过头来实现“检测门”的逻辑:检测到雕塑放入,门向下移动打开通行。在这一篇文章中,我们先实现物体放入的检测。
我们选中之前的门组件,在细节窗体右侧,点击蓝图图标按钮,选择 创建子蓝图类,将其命名为 BP_SecretWall。
在弹出的 BP_SecretWall 蓝图窗体中,我们点击 添加 - Box Collision。Box Collision 是一个隐形体积组件,它本身不可见,但可以检测是否与其他物体发生碰撞或重叠。
如图 1 所示,我们可以调整 Box Collision 的大小,让其铺满门里面的凹槽区域。接着在右侧的细节窗体里核对 碰撞预设 属性,默认是 OverlapAllDynamic。展开查看具体碰撞响应,可以看到几乎和所有类型的物体都是 重叠 响应方式,这正是我们需要的。所以我们不需要修改默认的碰撞预设。并且确认 生成重叠事件 属性是勾选使能的。
门凹槽内有点暗,我们可以加一盏聚光灯。

接着我们来到 事件图标 窗口。如图 2 所示,我们添加 On Component Begin Overlap 事件节点,并打印与其发生重叠的 Actor 的名字。

完成好后,我们就可以运行程序,验证打印结果了。运行会发现,角色人物进入凹槽可以正常打印,但是雕塑进入无法打印。这是因为雕塑组件的 生成重叠事件 属性没有使能,需要将其使能。
注意,要有重叠事件产生,两者的"生成重叠事件"属性都要打开。
Box Collision 组件,在 C++ 组件类中,对应的是 Box Component。后续我们会使用 C++ 类的方式扩展功能。
我们删除原先添加的 Box Collision 组件。然后点击 添加 - 添加C++组件。Box Component 不在“常见类”标签卡里,我们要到“所有类”标签卡中进行搜索添加,并命名组件为 Trigger。
相比于默认的场景组件类,Box Component 类的初始内容相当“简陋”。我们可以参照复制之前 Grabber 场景组件类里面的内容,粘贴到 Box Component 类中。
如代码清单 1 所示,我们复制 UCLASS 宏的内容,它表示这个类可以在蓝图里使用,并归在 Custom 组下。接着我们复制 BeginPlay() 的定义。
- UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))
- class CRYPTRAIDER_API UTriggerComponent : public UBoxComponent
- {
- GENERATED_BODY()
- protected:
- // Called when the game starts
- virtual void BeginPlay() override;
- };
接着,如代码清单 2 所示,我们复制并微调 BeginPlay() 的实现,此处增加了打印。
- // Called when the game starts
- void UTriggerComponent::BeginPlay()
- {
- Super::BeginPlay();
- UE_LOG(LogTemp, Display, TEXT("Trigger Component Alive"));
- }
代码完成并编译好之后,我们回到蓝图界面。如图 3 所示,在 添加 选项中,已经可以识别到 Trigger 类,我们添加它。
蓝图代码几乎是一样的。我们把原先的 On Component Begin Overlap 事件节点删掉。然后右击左侧的 Trigger 组件,选择 添加事件,添加新的 On Component Begin Overlap 事件节点。
