我的场景中有两个游戏对象,我将这个脚本分配给它们。当我点击它们中的任何一个时,If语句中与每个相关的代码会被执行两次,如果我禁用其中一个,它会按原样执行一次。
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
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
}
}
}
}
问题是,为什么代码只需单击即可执行两次?!
它记录了两次,因为当您单击鼠标左键时,两个对象都会发送光线。然后他们都使用鼠标位置从相机发送光线。然后这两种光线都会撞击和反对;
可能的解决方法:
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”,您不会触发另一个对象来记录它。但是这仍然不是一个理想的解决方案,因为所有对象都会发射光线并检查光线是否会撞击它们。
更好的方法是从一个中心脚本发送光线,并让该脚本告诉对象它已被光线击中。