Unity3d 使用光线投射检测对象会执行两次

Unity3d 使用光线投射检测对象会执行两次,unity3d,raycasting,Unity3d,Raycasting,我的场景中有两个游戏对象,我将此脚本分配给它们。当我点击其中任何一个时,If语句中与每一个相关的代码都会执行两次,如果我禁用其中一个,它会像应该的那样执行一次。 无效更新 { 如果Input.GetMouseButtonDown0 { 雷卡斯特击中; 光线=Camera.main.screenpointorayinput.mousePosition; 如果是物理,Raycastray,出局 { 如果hit.transform.name==对象A { Debug.LogObject A已单击;/

我的场景中有两个游戏对象,我将此脚本分配给它们。当我点击其中任何一个时,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.仅将脚本附加到一个游戏对象。通常,一个空的游戏对象。当点击时,它应该用碰撞器检测任何游戏对象


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,您不会触发另一个对象记录它。但这仍然不是一个理想的解决方案,因为所有对象都会发送光线并检查光线是否击中它们


更好的方法是从一个中央脚本发送光线,让该脚本告诉对象它被光线击中。

谢谢你的回答。谢谢你的回答。