我在Unity 2017.4.0f1上遇到多个显示器的问题。我需要创建 3 个摄像机并在 3 个不同的显示器上显示它们的视口,这工作正常。但是,当我尝试单击连接到另一台相机的另一个显示器上的对象时,单击对象不起作用。单击似乎仅适用于具有MainCamera
标签的相机。
任何人都可以帮助我理解和解决问题吗?多谢。
编辑:这是点击代码:
Ray raycam;
RaycastHit hit;
Vector2 displayleft = new Vector2(-72, 0);
Vector2 displaycenter = new Vector2(1366, 0);
raycam = cam2.ScreenPointToRay(Input.mousePosition);
if (Input.mousePosition.x < displaycenter.x && Input.mousePosition.x > 0)
{
Debug.Log("1");
if (Input.GetKey(KeyCode.A))
{
instruction.text = "1";
}
raycam = cam1.ScreenPointToRay(Input.mousePosition);
}
else if (Input.mousePosition.x < displayleft.x)
{
if (Input.GetKey(KeyCode.A))
{
instruction.text = "2";
}
Debug.Log("2");
raycam = cam2.ScreenPointToRay(Input.mousePosition);
}
else if (Input.mousePosition.x > displaycenter.x)
{
if (Input.GetKey(KeyCode.A))
{
instruction.text = "3";
}
Debug.Log("3");
raycam = cam3.ScreenPointToRay(Input.mousePosition);
}
if (Input.GetMouseButtonDown(0))
{
if (Physics.Raycast(raycam, out hit))
{
hit.transform.root.GetComponent<Animator>().speed = 0f;
GameObject ChildGameObject1 = hit.transform.GetChild(0).gameObject;
GameObject ChildGameObject2 = ChildGameObject1.transform.GetChild(0).gameObject;
ChildGameObject2.GetComponent<Animator>().SetBool("prova", true);
StartCoroutine(Activation(hit));
}
}
这是我的配置
所以我研究了这个问题,你显然需要做的是检查鼠标当前在哪个显示器上,并根据它从不同的相机投射光线。
幸运的是,我找到了允许这样做的代码,它允许我们获取光标当前所在的显示。
请注意,此代码未经测试,可能无法正常工作。
首先,我们获取光标当前所在的显示器的索引。
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetCursorPos(out MousePosition lpMousePosition);
[StructLayout(LayoutKind.Sequential)]
public struct MousePosition
{
public int x;
public int y;
}
private static int GetHoveredDisplay ()
{
// Get the absolute mouse coordinates
MousePosition mp;
GetCursorPos(out mp);
// Get the relative mouse coordinates
Vector3 r = Display.RelativeMouseAt(new Vector3(mp.x, mp.y));
// Use the z coordinate
int displayIndex = (int)r.z;
return displayIndex;
}
现在,我们可以将此索引插入到您的代码中。
我们需要创建一个新数组,填充您的显示相机,按其显示索引排序。
public Camera[] cameras;
接下来,我们从光标当前所在的显示器的相机投射光线。
if (Input.GetMouseButtonDown(0))
{
int di = GetHoveredDisplay();
Camera currentDisplayCamera = cameras[di];
Ray ray = currentDisplayCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
// etc ...
}
}