我正在开发一款AI,并希望为它提供玩家(汽车)与游戏中(墙壁、街道中心、其他汽车等)几乎所有元素之间的距离。我使用的是Physics.Raycast技术。但问题在于只有DistanceToRightSideOfMOTS(MOTS:街道中心)和DistanceToBackWall能够正常工作。以下是我的代码:
private void FixedUpdate()
{
RequestDecision();
RequestAction();
// Get the distances to the walls
// Get distance to left wall
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;
}
// Get distance to right wall
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;
}
// Get distance to front wall (it sees 2x farther because it's hard to turn on the corner)
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;
}
// Get distance to back wall
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;
}
//////////////////
// Get the distance to other cars
/////////////////
// Get distance to left car
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;
}
// Get distance to right car
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;
}
// Get distance to front car
if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, 50, 1 << 13))
{
DistanceToFrontCar = hit.distance / 50; // We divide the distance to normalize the input
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.green);
}
else
{
DistanceToFrontCar = 1;
}
// Get distance to back car
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;
}
//Get distances to the middle of the street
//Get distance from the left side
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;
}
//Get distance from the right side
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开始工作,只有当我距离另一辆车至少15米时,DistanceToBackCar才能工作。是否有其他替代方案?
编辑2:我在墙和街道中间使用了平面。当我查看物理调试可视化时,我从一侧看到了平面碰撞器,但从另一侧没有看到。我是Unity的新手,所以这可能是问题所在。
编辑3:我在街道中央添加了盒式碰撞器,DistanceToLeftSideOfMOTS开始工作了,但我试图使用墙来实现,但失败了。
编辑4:我将盒式碰撞器变大后就可以正常工作了。唯一的问题现在是汽车。
public LayerMask WallLayers;
。然后你可以在检查器中简单地选择相应的层,并像这样使用它:Physics.Raycast(transform.position, transform.TransformDirection(Vector3.left), out hit, 25, WallLayers)
。 - derHugo