虚幻引擎 Get Hit Result Under Cursor 节点

Get Hit Result Under Cursor(及其变体Get Hit Result Under Cursor by Channel)是虚幻引擎5中实现鼠标与3D世界交互的核心节点。它通过从摄像机向鼠标位置发射射线来进行碰撞检测

以下是该节点的完整使用案例和具体操作步骤。

节点概述

此节点属于Player Controller,主要有两个版本

  • Get Hit Result Under Cursor by Channel:根据指定的碰撞通道(Trace Channel) 进行检测

  • Get Hit Result Under Cursor for Objects:根据指定的对象类型(Object Type) 列表进行检测

两者核心功能一致,常用的是前者。

核心参数与输出

  • Trace Channel (碰撞通道):选择用于检测的通道,常用 Visibility 或 Camera。目标物体必须阻塞(Block) 此通道才能被检测到

  • Trace Complex (复杂追踪)

    • True:使用网格的三角面进行精确检测,性能开销较大

    • False:使用物体的简化碰撞体,性能更好

  • Return Value (布尔值)True 表示检测到物体,False 表示未命中

  • Hit Result (命中结果结构体):包含丰富的命中信息

    • Hit Actor:被击中的 Actor。

    • Hit Component:被击中的具体组件。

    • Location:命中点的世界坐标。

    • 以及其他如撞击法线、骨骼名称等信息。


完整操作步骤 (蓝图实现)

第一步:项目设置与准备

  1. 显示鼠标光标:打开关卡蓝图(Level Blueprint) 或在游戏模式(Game Mode) 中,使用 Show Mouse Cursor 节点,确保其值为 True

    text
    Event BeginPlay -> Get Player Controller -> Show Mouse Cursor (True)
  2. 确保输入(Input)可用:在项目设置(Project Settings) -> 引擎(Engine) -> 输入(Input) 中,绑定鼠标按键(如左键)事件。通常在关卡蓝图玩家控制器蓝图中处理。

第二步:构建核心交互逻辑 (点击并打印信息)

这是最基础的应用,在鼠标点击时检测并打印命中物体的信息

  1. 关卡蓝图玩家控制器蓝图的事件图表中,添加 InputAction 或 InputKey 事件(例如,Left Mouse Button)。

  2. 从该事件节点拖出连线,添加 Get Player Controller 节点(目标为 Player Controller 0

  3. 从 Get Player Controller 节点拖出连线,搜索并添加 Get Hit Result Under Cursor by Channel 节点

  4. 配置该节点的参数:

    • Trace Channel:选择 Visibility

    • Trace Complex:根据需要选择 False(性能优先)或 True(精确优先)。

  5. 从 Get Hit Result Under Cursor by Channel 节点拖出 Return Value 引脚,添加 Branch 节点。这是关键步骤,用于确保只有在成功命中物体时才执行后续操作

  6. 在 Branch 节点的 True 执行引脚上,从 Get Hit Result Under Cursor by Channel 节点的 Hit Result 输出引脚拖出,添加 Break Hit Result 节点

  7. 从 Break Hit Result 节点拖出 Hit Actor 和 Location 引脚,连接到 Print String 节点,以在屏幕上显示信息

    蓝图逻辑示意

    text
    [Left Mouse Button] -> [Get Player Controller] -> [Get Hit Result Under Cursor by Channel]
                                                           |
                                                           v (Return Value)
                                                      [Branch] --False--> (不做任何事)
                                                           |
                                                           v (True)
                                                      [Break Hit Result]
                                                           |
                                             +-------------+-------------+
                                             |                           |
                                             v (Hit Actor)              v (Location)
                                        [Print String]            [Print String]

第三步:实现高级应用 (物体跟随鼠标移动)

这是一个更动态的例子,让一个物体(如小球)跟随鼠标在3D空间中的位置移动

  1. 在场景中放置一个你想控制的 Actor(例如,一个球体)。

  2. 关卡蓝图中,创建一个自定义事件,命名为 UpdateObjectLocation

  3. 在这个事件中,重复第二步的步骤 2-5 来获取鼠标的命中位置。

  4. 在 Branch 节点的 True 执行引脚上,添加 Set Actor Location 节点。

  5. 将 Set Actor Location 节点的 Target 设置为你的球体。

  6. 将其 New Location 引脚连接到 Break Hit Result 节点的 Location 引脚。

  7. 关卡蓝图的 Event Tick 节点上,调用你创建的 UpdateObjectLocation 事件。

    • 注意:在 Event Tick 中执行射线检测可能会有性能开销,但对于简单的演示是可行的。


常见问题与技巧 (FAQ)

  1. 节点一直返回 False,检测不到任何物体?

    • 检查碰撞设置:确保目标物体的碰撞预设(Collision Preset)阻塞(Block) 了你选择的 Trace Channel(如 Visibility

    • 检查物体可见性:确保物体的 Visible 和 Hidden in Game 属性为 True。如果物体在游戏中不可见,可能无法被检测到

    • 检查鼠标光标:确认 Show Mouse Cursor 已启用。

  2. 如何区分点击到的是UI还是3D世界物体?

    • 如果点击到UI(UMG),Get Hit Result Under Cursor 通常不会返回有效的3D命中结果。你可以先检测UI的命中情况,再决定是否进行3D射线检测。

  3. Get Hit Result Under Cursor by Channel 和 Line Trace by Channel 有什么区别?

    • Get Hit Result Under Cursor 是便捷节点,它封装了“将屏幕坐标转换为世界射线并执行检测”的完整流程。而 Line Trace by Channel 需要你手动提供射线的起点和终点。

  4. 如何让物体只在鼠标悬停时高亮?

    • 可以使用 OnBeginCursorOver 和 OnEndCursorOver 事件,它们专门用于处理鼠标悬停逻辑。需要在 Player Controller 中启用 Enable Mouse Over Events

扩展应用

掌握此节点后,可以实现多种交互:

  • 点击选中物体:在RTS或点击式冒险游戏中

  • 鼠标悬停显示信息:如Tooltip

  • 点击地面控制角色移动:在俯视角或MOBA游戏中

  • 3D空间中的拖拽:结合点击和移动事件

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

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

昵称

取消
昵称表情代码图片

    暂无评论内容