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

如何仅禁用当前拾取对象与玩家的碰撞(不影响其他可拾取对象)

解决方案

问题根源是你用了层级全局碰撞忽略,这会让layer1和layer2下的所有对象都互相忽略碰撞,而非仅当前拾取的对象。要实现仅单个拾取对象与玩家忽略碰撞,应该使用针对具体碰撞体的Physics.IgnoreCollision方法,而非层级的Physics.IgnoreLayerCollision。

修改步骤:

  1. 在你的脚本中添加两个碰撞体引用,分别存储玩家自身的碰撞体和当前拾取对象的碰撞体:
private Collider _playerCollider;
private Collider _currentPickupCollider;
  1. 在脚本初始化时(比如Awake或Start方法)获取玩家的碰撞体:
void Awake()
{
    // 假设该脚本挂载在玩家对象上,直接获取自身的Collider
    _playerCollider = GetComponent<Collider>();
}
  1. 修改PickUpObject方法,替换层级忽略为单个对象的碰撞忽略:
public void PickUpObject()
{
    physicsObject = lookObject.GetComponentInChildren<PhysicsObjects>();
    currentlyPickedUpObject = lookObject;
    pickupRB = currentlyPickedUpObject.GetComponent<Rigidbody>();
    pickupRB.constraints = RigidbodyConstraints.FreezeRotation;
    physicsObject.playerInteractions = this;

    // 获取当前拾取对象的碰撞体
    _currentPickupCollider = currentlyPickedUpObject.GetComponent<Collider>();
    // 仅忽略当前拾取对象与玩家的碰撞
    if (_playerCollider != null && _currentPickupCollider != null)
    {
        Physics.IgnoreCollision(_playerCollider, _currentPickupCollider, true);
    }
}
  1. 修改BreakConnection方法,恢复当前拾取对象与玩家的碰撞:
public void BreakConnection()
{
    pickupRB.constraints = RigidbodyConstraints.None;
    // 恢复碰撞
    if (_playerCollider != null && _currentPickupCollider != null)
    {
        Physics.IgnoreCollision(_playerCollider, _currentPickupCollider, false);
        _currentPickupCollider = null;
    }

    currentlyPickedUpObject = null;
    lookObject = null;
    physicsObject.pickedUp = false;
    currentDist = 0;
}

注意事项:

  • 如果拾取对象包含多个子物体碰撞体(比如复杂模型的多个Collider),需要遍历所有子物体的Collider并逐个调用Physics.IgnoreCollision,示例代码如下:
// 在PickUpObject中替换获取单个Collider的代码
List<Collider> _currentPickupColliders = new List<Collider>();
Collider[] pickupColliders = currentlyPickedUpObject.GetComponentsInChildren<Collider>();
foreach (var collider in pickupColliders)
{
    Physics.IgnoreCollision(_playerCollider, collider, true);
    _currentPickupColliders.Add(collider);
}

// 在BreakConnection中逐个恢复碰撞
foreach (var collider in _currentPickupColliders)
{
    Physics.IgnoreCollision(_playerCollider, collider, false);
}
_currentPickupColliders.Clear();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:20