You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity新手求助:刚体碰撞后无法停止移动怎么办?

解决Unity角色碰到墙体仍持续移动的问题

嘿,兄弟,我刚看了你的问题——碰到墙还能继续移动确实挺烦的,我当初刚学Unity的时候也踩过类似的坑!咱们一步步来排查问题,找到根源:

最常见的原因:错误的移动方式

如果你是用transform.Translate()来实现玩家移动,那问题就出在这了!这个方法是直接修改物体的位置坐标,完全绕过了Unity的物理引擎,哪怕你给玩家加了Rigidbody和Collider,物理碰撞也起不了作用,自然碰到墙也停不住。

正确的做法:通过Rigidbody控制移动

物理相关的操作一定要交给Rigidbody来处理,这样碰撞体的阻挡效果才会生效。推荐两种方式:

方式1:直接修改Rigidbody.velocity(适合稳定的匀速移动)

private Rigidbody rb;
public float moveSpeed = 5f;

void Start()
{
    // 获取玩家的Rigidbody组件
    rb = GetComponent<Rigidbody>();
}

// 物理操作要放在FixedUpdate里,保证和物理帧同步
void FixedUpdate()
{
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");
    
    // 计算移动方向,normalized防止斜向移动速度过快
    Vector3 moveDir = new Vector3(horizontal, 0, vertical).normalized;
    
    // 只修改X和Z轴的速度,保留Y轴的速度(比如跳跃时的重力)
    rb.velocity = new Vector3(moveDir.x * moveSpeed, rb.velocity.y, moveDir.z * moveSpeed);
}

方式2:使用Rigidbody.AddForce(适合有加速度的移动)

private Rigidbody rb;
public float moveForce = 20f;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");
    
    Vector3 moveForce = new Vector3(horizontal, 0, vertical) * moveForce;
    rb.AddForce(moveForce);
}

其他可能的排查点

  • Rigidbody的Is Kinematic是否开启?
    如果勾选了这个选项,玩家的Rigidbody会被设置为“运动学”,物理引擎不会处理它的碰撞和受力,导致碰撞无效。一定要把这个选项取消勾选

  • Collider的Is Trigger是否开启?
    不管是玩家还是墙体的BoxCollider,如果勾选了Is Trigger,碰撞只会触发OnTriggerEnter这类事件,不会有物理上的阻挡效果。确保两个物体的Collider都关闭这个选项。

  • 碰撞层级设置是否正确?
    Edit > Project Settings > Physics里查看Layer Collision Matrix,确认玩家和墙体所在的层级是互相勾选的状态。如果层级之间被设置为不碰撞,墙体自然挡不住玩家。

按照上面的步骤排查,应该就能解决你的问题啦!

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

火山引擎 最新活动