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

Unity中如何检测碰撞以停止玩家移动?新手已弃用代码问题咨询

解决Unity玩家碰到障碍物停止移动的问题(修复弃用代码)

嘿,作为Unity新手碰到这种代码弃用的问题太正常啦,我来帮你把原代码的问题捋清楚,再给你修复后的可用版本~

原代码的几个问题

  • 回调方法名错误:Unity的碰撞回调方法要求大写开头,你写的onCollisionEnter应该改成OnCollisionEnter,不然Unity根本识别不到这个碰撞触发逻辑。
  • 类名冲突:你的类名Collision和Unity内置的Collision结构体重名了,编译器会搞混,建议改成PlayerCollision这类不会重复的名字。
  • 弃用API:info.Collider(大写C)是旧版Unity的写法,现在已经被弃用,要换成小写的info.collider来获取碰撞体。

修复后的完整代码

// 重命名类避免和Unity内置类型冲突
public class PlayerCollision : MonoBehaviour
{
    // 引用玩家的移动脚本,记得在编辑器里赋值哦
    public PlayerMove move;

    // 正确的碰撞进入回调方法
    void OnCollisionEnter(Collision collisionInfo)
    {
        // 使用CompareTag比直接判断tag更高效,也避免拼写错误导致的问题
        if (collisionInfo.collider.CompareTag("Obstacle"))
        {
            // 禁用移动脚本,让玩家停止移动
            move.enabled = false;
        }
    }
}

额外小提示

  • 确保玩家对象上有Rigidbody组件(可根据需求勾选"Use Gravity"),同时玩家和障碍物都有碰撞体组件(比如BoxCollider),不然碰撞回调不会触发。
  • 如果不想直接禁用整个移动脚本,也可以在PlayerMove里加一个公共布尔变量public bool canMove = true;,然后在移动逻辑里加上if (!canMove) return;,碰撞时只需要设置move.canMove = false;,这样后续恢复移动会更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:06:03