我正在开发一个AI,希望它能测量玩家(一辆车)与游戏中其他几乎所有物体(墙壁、街道中间、其他车辆)之间的距离。我使用的是Physics.Raycast来实现这个功能。问题是只有DistanceToRightSideOfMOTS(MOTS:街道中间)和DistanceToBackWall能够正常工作。这是我的代码:
private void FixedUpdate(){ RequestDecision(); RequestAction(); // 获取到墙壁的距离 // 获取到左侧墙壁的距离 RaycastHit hit; if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.left), out hit, 25, 1 << 11)) { DistanceToLeftWall = hit.distance / 25; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.left) * hit.distance, Color.red); } else { DistanceToLeftWall = 1; } // 获取到右侧墙壁的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.right), out hit, 25, 1 << 12)) { DistanceToRightWall = hit.distance / 25; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.right) * hit.distance, Color.red); } else { DistanceToRightWall = 1; } // 获取到前方墙壁的距离(因为在拐角处转向困难,所以检测距离是两倍) if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, 50, (1 << 11) | (1 << 12))) { DistanceToFrontWall = hit.distance / 50; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.red); } else { DistanceToFrontWall = 1; } // 获取到后方墙壁的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.back), out hit, 50, (1 << 11) | (1 << 12))) { DistanceToBackWall = hit.distance / 50; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.back) * hit.distance, Color.red); } else { DistanceToBackWall = 1; } ////////////////// // 获取到其他车辆的距离 ///////////////// // 获取到左侧车辆的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.left), out hit, 25, 1 << 13)) { DistanceToLeftCar = hit.distance / 25; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.left) * hit.distance, Color.green); } else { DistanceToLeftCar = 1; } // 获取到右侧车辆的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.right), out hit, 25, 1 << 13)) { DistanceToRightCar = hit.distance / 25; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.right) * hit.distance, Color.green); } else { DistanceToRightCar = 1; } // 获取到前方车辆的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, 50, 1 << 13)) { DistanceToFrontCar = hit.distance / 50; // 我们将距离除以最大距离以标准化输入 Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.green); } else { DistanceToFrontCar = 1; } // 获取到后方车辆的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.back), out hit, 50, 1 << 13)) { DistanceToBackCar = hit.distance / 50; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.back) * hit.distance, Color.green); } else { DistanceToBackCar = 1; } //获取到街道中间的距离 //获取到左侧的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.left), out hit, 10, 1 << 14)) { DistanceToLeftSideOfMOTS = hit.distance / 10; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.left) * hit.distance, Color.blue); } else { DistanceToLeftSideOfMOTS = 1; } //获取到右侧的距离 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.right), out hit, 10, 1 << 14)) { DistanceToRightSideOfMOTS = hit.distance / 10; Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.right) * hit.distance, Color.blue); } else { DistanceToRightSideOfMOTS = 1; }}
其他距离总是返回1,即使不应该这样。为什么不工作,我该如何解决这个问题?
编辑1:我不知道为什么,当我把车非常靠近右侧墙壁时,DistanceToRightWall开始工作,而DistanceToBackCar只有在我距离车至少15米时才工作。有没有其他替代方案?
编辑2:我用平面来表示墙壁和街道中间。当我在物理调试可视化中查看时,我看到平面碰撞体从一侧可见,但从另一侧不可见。我是Unity的新手,所以这可能是问题所在。
编辑3:我在街道中间添加了一个盒形碰撞体,DistanceToLeftSideOfMOTS开始工作,但我尝试在墙壁上使用同样的方法却没有成功。
编辑4:我把盒形碰撞体做大了,问题解决了。现在唯一的问题是车辆。
回答: