Unity 3D中Raycast无法检测全部障碍物及AI避障咨询
对手AI障碍物检测问题排查&避障实现方案
嘿,我来帮你捋捋这个问题的原因,再给你说说怎么实现避障移动~
一、Raycast仅识别特定立方体的原因
结合你提供的截图信息,大概率是这几个点出了问题:
- 碰撞体缺失:那些没被检测到的障碍物(比如obstacle2的cube01)很可能没添加
Collider组件。Raycast完全依赖物理碰撞体来识别障碍物,没有的话物理引擎根本不会把它当成可检测对象。 - 层级过滤遗漏:你的Raycast代码没指定检测层级,默认是检测所有层级,但如果其他障碍物被放在了Raycast忽略的层级里,就会直接被跳过。看看层级面板,确认下未被检测的障碍物是不是在某个没被包含的层级中。
- 触发器设置冲突:如果障碍物的碰撞体勾选了
isTrigger,Raycast默认会忽略这类触发器碰撞体。除非你在Raycast参数里明确加上QueryTriggerInteraction.Collide,否则不会检测到它们。
修正后的Raycast代码示例
你可以试试修改代码,加上层级过滤或者触发器检测:
void FixedUpdate() { transform.Translate(Vector3.forward * Time.deltaTime * speed); // 可选:只检测名为"Obstacle"的层级,避免误检测其他对象 int obstacleLayer = LayerMask.GetMask("Obstacle"); // 检测前方,包含触发器,指定检测层级 if (Physics.Raycast(transform.position, transform.forward, 100.0f, obstacleLayer, QueryTriggerInteraction.Collide)) print("There is something in front of the object!"); }
二、检测到障碍物后的左右避障实现
要让AI避开障碍,可以按照这个思路来做:先检测前方有障碍,再检查左右两侧的空间,最后选择可行的方向移动。
避障代码示例
public float speed = 5f; public float forwardCheckDistance = 3f; // 前方障碍物检测距离 public float sideCheckDistance = 2f; // 左右空间检测距离 void FixedUpdate() { // 基础向前移动 transform.Translate(Vector3.forward * Time.deltaTime * speed); RaycastHit hit; // 检测前方是否有障碍物 if (Physics.Raycast(transform.position, transform.forward, out hit, forwardCheckDistance)) { print("前方有障碍,准备避让!"); // 检查左侧是否有可用空间 bool leftIsClear = !Physics.Raycast(transform.position, transform.left, sideCheckDistance); // 检查右侧是否有可用空间 bool rightIsClear = !Physics.Raycast(transform.position, transform.right, sideCheckDistance); // 根据检测结果选择移动方向 if (leftIsClear) { // 向左平移避让(也可以用Rotate实现转向,看你想要的控制效果) transform.Translate(Vector3.left * Time.deltaTime * speed); } else if (rightIsClear) { transform.Translate(Vector3.right * Time.deltaTime * speed); } else { // 左右都被挡住了,这里示例减速,你也可以改成掉头等逻辑 speed = 2f; } } else { // 没有障碍,恢复正常速度 speed = 5f; } }
额外优化建议
- 调整
forwardCheckDistance和sideCheckDistance的数值,适配你的游戏场景大小。 - 如果障碍物是不规则模型,建议用
BoxCast或SphereCast代替Raycast,因为Raycast是一条线,容易漏掉一些体积大但射线没命中的障碍。 - 给所有障碍物统一设置一个
Obstacle层级,这样Raycast只检测这个层级,能避免误检测到玩家或其他无关对象。
内容的提问来源于stack exchange,提问作者Maria Kodel
相关产品推荐
相关产品推荐

