Unity3d 使用光线投射检测对象会执行两次
我的场景中有两个游戏对象,我将此脚本分配给它们。当我点击其中任何一个时,If语句中与每一个相关的代码都会执行两次,如果我禁用其中一个,它会像应该的那样执行一次。 无效更新 { 如果Input.GetMouseButtonDown0 { 雷卡斯特击中; 光线=Camera.main.screenpointorayinput.mousePosition; 如果是物理,Raycastray,出局 { 如果hit.transform.name==对象A { Debug.LogObject A已单击;//记录两次 } 如果hit.transform.name==对象B { Debug.LogObject B已单击;//记录两次 } } } } 问题是,为什么一次单击代码就会执行两次 问题是,为什么代码会在同一时间执行两次 点击一下 因为每个脚本中的每个更新函数都在每个帧中调用。Input.GetMouseButtonDown0将在更新函数中包含它的每个脚本的每个帧中为真 如果希望它检测一次,可以选择两个选项: 1.仅将脚本附加到一个游戏对象。通常,一个空的游戏对象。当点击时,它应该用碰撞器检测任何游戏对象Unity3d 使用光线投射检测对象会执行两次,unity3d,raycasting,Unity3d,Raycasting,我的场景中有两个游戏对象,我将此脚本分配给它们。当我点击其中任何一个时,If语句中与每一个相关的代码都会执行两次,如果我禁用其中一个,它会像应该的那样执行一次。 无效更新 { 如果Input.GetMouseButtonDown0 { 雷卡斯特击中; 光线=Camera.main.screenpointorayinput.mousePosition; 如果是物理,Raycastray,出局 { 如果hit.transform.name==对象A { Debug.LogObject A已单击;/
2.使用IPInterDownHandler及其OnPointerDown函数。你可以将其附加到你想要检测的每个游戏对象上。选中6中的2d/精灵。对于3D对象,请选中6。这将执行两次,因为当您单击目标时,它会执行此操作
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
这行代码将为您提供一个对象,因为您有两个对象中的脚本,它将运行两次完全相同的操作。两个对象将接收相同的光线。记录了两次,因为当您单击鼠标左键时,两个对象都发送光线。然后,它们都使用鼠标位置从相机发送光线。然后这两条射线击中物体与否 如果命中,则记录相同命中对象的名称 如果他们没有击中任何东西,他们什么也不做。 一个可能的解决方案:
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit) && hit.transform == transform)
{
if (hit.transform.name == "Object A")
{
Debug.Log("Object A Clicked"); // log twice
}
if (hit.transform.name == "Object B")
{
Debug.Log("Object B Clicked"); // log twice
}
}
}
}
通过在if条件中添加hit.transform==transform,您不会触发另一个对象记录它。但这仍然不是一个理想的解决方案,因为所有对象都会发送光线并检查光线是否击中它们
更好的方法是从一个中央脚本发送光线,让该脚本告诉对象它被光线击中。谢谢你的回答。谢谢你的回答。