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
相关产品推荐
相关产品推荐

