鼠標(biāo)點(diǎn)擊發(fā)射射線丰包,做3D游戲常用饶唤,但是點(diǎn)擊UI時(shí)也會(huì)點(diǎn)擊到場景中的物體肄程,觸發(fā)其他綁定事件睦擂,因此得湘,需要點(diǎn)擊UI時(shí)場景不觸發(fā)射線檢測EventSystem.current.IsPointerOverGameObject(),unity給出了解決方法顿仇。有一點(diǎn)要注意淘正,UI上背景層和panel也都有射線檢測摆马,所以你會(huì)發(fā)現(xiàn)點(diǎn)擊不了場景中的物體了,需要勾掉背景層的Raycast Target復(fù)選框鸿吆。
if (EventSystem.current.IsPointerOverGameObject())
{
Debug.Log("點(diǎn)擊到了UI");
return;
}
else
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
//int layerMask = 1 << 10;
//layerMask = ~layerMask;
if (Physics.Raycast(ray, out hitInfo))
{
Debug.DrawLine(ray.origin, hitInfo.point, Color.red);
go = hitInfo.collider.gameObject;
Debug.Log("碰到了:" + go.name);
}
}
}
當(dāng)我把游戲打成包在手機(jī)端測試時(shí)囤采,發(fā)現(xiàn)還是不行,這個(gè)方法在移動(dòng)端不適用惩淳,于是給他加了一個(gè)判斷
public bool IsPointerOverUIObject(int fingerID)
{
#if UNITY_EDITOR//如果是主機(jī)端蕉毯,用unity的判斷
return EventSystem.current.IsPointerOverGameObject();
#elif UNITY_ANDROID//如果是安卓端,用下面的判斷
return EventSystem.current.IsPointerOverGameObject(fingerID);
#endif
}
在update中檢測
void Update()
{
if (Input.touchCount > 0)//如果屏幕上的手指數(shù)大于0
{
//Debug.Log();
if (Input.GetMouseButtonDown(0) && isTouchMove && !IsPointerOverUIObject(Input.GetTouch(0).fingerId))
{
CheckPointer(Input.mousePosition);//沒有點(diǎn)擊到UI
}
}
else//如果屏幕上沒有手指點(diǎn)擊思犁,用unity自帶的判斷條件
{
if (Input.GetMouseButtonDown(0) && isTouchMove && !EventSystem.current.IsPointerOverGameObject())
{
CheckPointer(Input.mousePosition);//沒有點(diǎn)擊到UI
}
}
}