得到鼠标指向的物品

获取鼠标指向物品的实体ID

下面这个方法返回一个在当前鼠标指向的物品的EntityId。在使用这个方法之前,确保你的代码中的鼠标是显示的。


EntityId GetMouseEntityID()
{
    static ray_hit hit;
    float x, y, xMouse, yMouse, zMouse = 0.0f;
 
    if(!gEnv->pHardwareMouse || !gEnv->pRenderer || !gEnv->p3DEngine || !gEnv->pSystem 
       || !gEnv->pEntitySystem || !g_pGame->GetIGameFramework())
        return 0;
 	
    //得到当前的玩家句柄
    IActor *pClientActor = g_pGame->GetIGameFramework()->GetClientActor();
 
    if (!pClientActor)
        return 0;
 
    //得到当前的鼠标位置(相对于客户区坐标)
    gEnv->pHardwareMouse->GetHardwareMouseClientPosition(&x,&y);
    y = gEnv->pRenderer->GetHeight() - y;
 
    //反式投影 由(x, y, 0) 得到 (xMouse, yMouse, zMouse),也就是鼠标位置在3D世界中的位置
    gEnv->pRenderer->UnProjectFromScreen(x, y, 0.0f,&xMouse,&yMouse,&zMouse);
 
    static const unsigned int flags = rwi_stop_at_pierceable|rwi_colltype_any;
 
    //再得到照相机在3D世界中的位置,和视线的深度
    //这样由鼠标位置和照相机的位置组成方向,在视线深度上进行射线测试
    //注意下面的第三行的代码,表示的是相机位置到鼠标位置的方向
    float  fRange = gEnv->p3DEngine->GetMaxViewDistance();
    Vec3   vCamPos = gEnv->pSystem->GetViewCamera().GetPosition();
    Vec3   vDir = (Vec3(xMouse,yMouse,zMouse) - vCamPos).GetNormalizedSafe();
 
    IPhysicalEntity *pPhysicalEnt = pClientActor->GetEntity() ? 
                                        pClientActor->GetEntity()->GetPhysics() : NULL;
 
    if(!pPhysicalEnt)
        return 0;
 
    if (gEnv->pPhysicalWorld && 
        gEnv->pPhysicalWorld->RayWorldIntersection(vCamPos, vDir * fRange, ent_all, 
                                                       flags, &hit, 1, pPhysicalEnt))
    {
        if (gEnv->p3DEngine->RefineRayHit(&hit, vDir * fRange))
        {	
            if (IEntity *pEntity = gEnv->pEntitySystem->GetEntityFromPhysics(hit.pCollider))
            {
                return pEntity->GetId();
            }
        }	
    }	
    return 0;
}




### Unreal Engine 鼠标交互的实现方式 在 Unreal Engine 中,鼠标交互可以通过多种方式进行实现,主要依赖于蓝图系统和 C++ 编程。以下是关于如何实现鼠标交互的一些核心概念和技术细节。 #### 1. **拾取射线 (Picking Ray)** 为了检测鼠标指向的对象,通常需要使用射线投射技术来获取世界中的对象。这可以通过 `Line Trace` 或 `Sweep` 函数完成。具体来说,在玩家控制器或摄像机组件上设置一条从屏幕中心出发的射线,并检测其碰撞目标。 ```cpp FHitResult Hit; FCollisionQueryParams TraceParams(FName(TEXT("")), false, GetOwner()); bool bHit = GetWorld()->LineTraceSingleByChannel(Hit, StartLocation, EndLocation, ECC_Visibility, TraceParams); if (bHit) { AActor* HitActor = Hit.GetActor(); } ``` 上述代码片段展示了如何通过 C++ 使用 `LineTraceSingleByChannel` 来执行一次单次射线追踪操作[^4]。如果希望用蓝图实现,则可以在 Event Graph 中调用 `Get Mouse Position` 和 `Screen Space to World Space` 节点组合,从而计算出射线起点与终点的位置。 --- #### 2. **UI 元素上的鼠标交互** 对于 UI 界面内的鼠标交互,Unreal 提供了一个完整的 Widget Blueprint 工具集支持。开发者可以直接拖拽并放置按钮、滑动条或其他控件至 Canvas 上,并绑定相应的点击事件处理逻辑。 - 在 Slate 架构下,每个小部件都具备独立的状态管理和生命周期回调函数。 - 若要捕获特定区域内的鼠标移动轨迹或者双击行为,需启用 Advanced Input Settings 下的相关选项[^3]。 示例代码如下所示: ```blueprint // 设置 OnClicked 事件响应 Event Reply -> Set User Focus When Clicked ``` --- #### 3. **角色控制下的鼠标互动** 当涉及到第三人称视角或第一人称射击类游戏中常见的物品拾取功能时,除了基本的射线测试外还需要考虑更多因素比如距离衰减权重曲线等参数调整以获得更自然流畅的游戏体验感受[^1]。 例如下面这段伪代码描述了一种简单的装备机制流程: ```pseudo If(MouseOverObject is PickupItem){ AddToInventory(PickupItem); Destroy(PickupItem); } ``` 实际开发过程中可能还会涉及网络同步等问题因此建议阅读官方文档深入了解相关内容[^2]。 --- ### 总结 综上所述,无论是针对三维空间还是二维界面层面上的操作需求,Unreal Engine 均提供了灵活多样的解决方案可供选择。根据项目的具体情况选取合适的方案即可满足大部分应用场景的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值