如何实现角色向前行走至碰壁后180°转向并重复该动作?
碰壁检测与180°转向实现方案
要实现角色碰壁后转向的逻辑,Unity里有两种实用的实现方式,结合你现有的代码修改即可:
方案一:碰撞器触发转向
这种方式依赖Unity的物理碰撞系统,步骤如下:
- 给角色添加Collider(比如胶囊碰撞器
CapsuleCollider)和Rigidbody,记得勾选Rigidbody的「Is Kinematic」,避免物理引擎干扰自定义移动逻辑 - 给墙体添加Collider(比如盒子碰撞器
BoxCollider),不需要勾选Is Trigger - 给墙体设置标签
Wall(在Inspector的Tag下拉框里选择「Add Tag」创建)
修改你的Enemy脚本:
public class Enemy : MonoBehaviour { public float speed = 5; public Vector3 userDirection = Vector3.forward; void Update() { transform.position += userDirection * speed * Time.deltaTime; } // 碰撞触发时调用 void OnCollisionEnter(Collision collision) { // 只响应墙体碰撞 if (collision.gameObject.CompareTag("Wall")) { // 反转移动方向 userDirection = -userDirection; // 同步旋转角色朝向 transform.rotation = Quaternion.LookRotation(userDirection); // 想要旋转动画的话,可以换成transform.Rotate(0, 180, 0); 或者用Lerp做平滑旋转 } } }
方案二:射线检测(提前预判碰撞)
如果担心碰撞检测有延迟,或者不想依赖物理组件,可以用射线主动检测前方障碍物:
public class Enemy : MonoBehaviour { public float speed = 5; public Vector3 userDirection = Vector3.forward; public float detectDistance = 1f; // 检测距离,根据角色尺寸调整,比如角色半径+0.1 void Update() { transform.position += userDirection * speed * Time.deltaTime; // 从角色位置向前发射射线 Ray ray = new Ray(transform.position, userDirection); if (Physics.Raycast(ray, out RaycastHit hit, detectDistance)) { // 命中墙体时转向 if (hit.collider.gameObject.CompareTag("Wall")) { userDirection = -userDirection; transform.rotation = Quaternion.LookRotation(userDirection); } } // 调试用:在Scene视图显示射线(发布时可以删掉) Debug.DrawRay(transform.position, userDirection * detectDistance, Color.red); } }
两种方案都能实现需求,选哪种看你的场景:碰撞器方式适合物理交互多的场景,射线检测更轻量化,适合简单的巡逻逻辑。
内容的提问来源于stack exchange,提问作者Daugirdas Pelanis
相关产品推荐
相关产品推荐

