You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用玩家下方可拾取物体的拾取功能?

修复方案:禁止拾取玩家下方的可拾取物体

原代码问题分析

  1. Layer判断错误:你硬编码检测Layer为0(默认层),但明确说明可拾取物体和玩家处于不同Layer,导致所有可拾取物体都无法触发lookObject赋值,自然无法拾取。
  2. 缺少下方物体判断逻辑:原代码完全没实现“禁止拾取玩家下方物体”的核心需求。

修改步骤与代码

1. 准备工作

  • 给所有可拾取物体设置单独的Layer(比如命名为Pickable)。
  • 在脚本中添加两个公共变量,用于关联玩家Transform和可拾取Layer:
public Transform playerTransform; // 拖入玩家对象
public LayerMask pickableLayer; // 在Inspector中选择Pickable层

2. 修改核心逻辑

替换原有的Raycast与拾取判断代码为:

if (Physics.Raycast(raycastPos, mainCamera.transform.forward, out RaycastHit hit, maxDistance, pickableLayer))
{
    // 判断物体是否在玩家下方(留0.1f缓冲避免微小高度差误判)
    bool isObjectBelowPlayer = hit.transform.position.y < playerTransform.position.y - 0.1f;

    if (!isObjectBelowPlayer)
    {
        lookObject = hit.collider.gameObject;
        reticle.color = new Color(1, 0, 0, 0.75f);
    }
    else
    {
        lookObject = null;
        reticle.color = new Color(1, 1, 1, 0.75f);
    }
}
else
{
    lookObject = null;
    reticle.color = new Color(1, 1, 1, 0.75f);
}

if (PickingUp && currentlyPickedUpObject == null && lookObject != null)
{
    PickUpObject();
}

3. 关键修改说明

  • 精准Layer检测:用LayerMask替代硬编码的Layer索引,只检测可拾取物体所在层,避免误判其他物体。
  • 下方物体判断:通过比较玩家与物体的Y坐标(若你的游戏高度轴不是Y,替换为对应轴即可),排除玩家下方的物体。
  • 简化拾取逻辑:合并多重null判断,让代码更简洁高效。

注意事项

  • 确保playerTransform正确关联玩家对象,若相机是玩家的子物体,也可以用Camera.main.transform.parent替代。
  • 调整0.1f的缓冲值,适配你的游戏角色高度与物体尺寸,避免误判。

内容的提问来源于stack exchange,提问作者Okashi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:24:26