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

Unity中实现碰撞仅对单个对象应用物理效果的方法

实现Player单向推动Coin的物理方案

方法1:自定义碰撞响应(推荐)

  • 给Player设置运动学刚体(Kinematic Rigidbody),让Player不受任何物理力影响,保持自身移动速度与方向。
  • 保留Coin的普通刚体和碰撞体,确保引擎默认启用Coin之间的物理碰撞(自动处理Coin互相推动)。
  • 在Player的碰撞回调中,检测碰撞到的Coin,根据Player的移动状态给Coin施加冲量/力:
// Player脚本示例(Unity)
void OnCollisionStay(Collision collision)
{
    if (!collision.gameObject.CompareTag("Coin")) return;
    
    Rigidbody coinRb = collision.gameObject.GetComponent<Rigidbody>();
    // 以Player前进方向为推力方向,大小关联当前速度
    Vector3 pushForce = transform.forward * (GetComponent<Rigidbody>().velocity.magnitude * 3f);
    coinRb.AddForce(pushForce, ForceMode.Impulse);
}

方法2:触发器驱动的推力逻辑

  • 将Player的碰撞体设为触发器(Trigger),同时给Player用运动学刚体关闭物理受力。
  • 在Player的OnTriggerStay回调中,对进入范围的Coin施加推力:
void OnTriggerStay(Collider other)
{
    if (!other.CompareTag("Coin")) return;
    
    Rigidbody coinRb = other.GetComponent<Rigidbody>();
    // 计算Player与Coin的相对方向,避免反向推
    Vector3 pushDir = (other.transform.position - transform.position).normalized;
    coinRb.AddForce(pushDir * 10f, ForceMode.Force);
}
  • 适合需要“范围推动”的场景,且完全不影响Player移动。

方法3:修正物理层碰撞设置

  • 若之前用碰撞矩阵失败,调整逻辑:
    • 给Player和Coin分别分配独立物理层(如Player和Coin)。
    • 在物理设置的碰撞矩阵中,允许Player层与Coin层碰撞,但确保Player的刚体是运动学的(不会被碰撞力影响)。
    • 开启Coin层与自身的碰撞,保证Coin之间能互相推动。

关键提示

  • 先单独验证Coin之间的碰撞是否正常,再接入Player的推动逻辑,逐步排查问题。
  • 2D物理场景下,替换为Rigidbody2D和对应的2D碰撞回调(如OnCollisionEnter2D)即可,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:37:35