Unreal Engine 5:如何通过光标检测玩家注视的对象?
在UE5中实现注视Actor显示名称的方案
核心思路就是从玩家相机发射射线检测前方Actor,这比单纯用相机向量更可靠,因为射线能准确判断是否击中目标,还能处理遮挡问题。以下是具体实现步骤:
一、准备工作
- 给需要被识别的Actor(比如立方体)添加标签(例如
Interactable),方便后续筛选;也可以直接检测特定类(比如StaticMeshActor)。 - 创建一个UMG Widget,用来显示Actor名称,将其锚点设为屏幕中央,初始状态设置为隐藏。
二、实现射线检测逻辑
可以在玩家角色的Tick函数中每帧执行检测,或者用定时器控制检测频率:
蓝图实现方式
- 获取玩家相机的世界位置和向前向量,计算射线终点(比如向前延伸1000单位,可按需调整)。
- 使用
Line Trace By Channel节点,选择Visibility碰撞通道,避免检测到场景中不可见的碰撞体。 - 检测到Actor后,通过标签或类判断是否为目标对象,获取它的名称。
- 如果击中目标,显示UMG Widget并将文本设置为Actor名称;未击中则隐藏Widget。
C++代码示例
void AMyPlayerCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); // 获取相机位置和向前向量 FVector Start = GetCameraComponent()->GetComponentLocation(); FVector End = Start + GetCameraComponent()->GetForwardVector() * 1000.0f; FCollisionQueryParams QueryParams; QueryParams.AddIgnoredActor(this); // 忽略玩家自身 FHitResult HitResult; if (GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, QueryParams)) { AActor* HitActor = HitResult.GetActor(); if (HitActor && HitActor->ActorHasTag("Interactable")) { if (NameDisplayWidget) { NameDisplayWidget->SetText(FText::FromString(HitActor->GetName())); NameDisplayWidget->SetVisibility(ESlateVisibility::Visible); } } else { HideNameWidget(); } } else { HideNameWidget(); } } void AMyPlayerCharacter::HideNameWidget() { if (NameDisplayWidget) { NameDisplayWidget->SetVisibility(ESlateVisibility::Hidden); } }
三、关键注意事项
- 射线长度要合理,太长会检测到远处无关对象,太短会漏检近距离目标。
- 必须忽略玩家自身,避免射线检测到角色模型导致误触发。
- UMG Widget的渲染层级要设置为最上层,防止被其他UI元素遮挡。
- 如果需要只显示特定类型Actor的名称,可通过判断Actor类(比如
Cast<ACubeActor>(HitActor))替代标签检测。
内容的提问来源于stack exchange,提问作者Gorshipisk
相关产品推荐
相关产品推荐

