(轉)Unity UGUI獲取鼠標在屏幕的準確點擊位置

轉至https://www.cnblogs.com/yanghui0702/p/yanghui20180521.html

想要獲取鼠標在屏幕的準確點擊位置,千萬不要胡亂寫,什麼轉化座標系,什麼Ray射線檢測都是浮雲。

1,轉化座標系只是相對而言,並不能準確實現當前鼠標點擊在屏幕的位置;

2,Ray檢測,hit是需要碰撞的,沒碰撞,獲取的是什麼??(0,0,0)。

所以,請看如下正解。

第一種:

我用座標系轉化時發現值並沒有什麼變化,網上亂七八糟的都有。

其實很簡單,Input.mousePosition本身就是屏幕座標(二維),

不能直接使用是因爲,屏幕空間以像素定義。屏幕的左下爲(0,0);右上是(pixelWidth,pixelHeight),

或者說以屏幕的左下角爲(0,0)點,右上角爲(Screen.width,Screen.height)

而屏幕的基準點在屏幕中心(Screen.width/2,Screen.height/2),需要減掉二分之一座標值,也就是減去二分之一屏幕的寬、高。

將基準點放置屏幕的左下角,即基準點爲(0,0).

此時m_panel的屏幕座標就對應到tranPos的x、y值。

Transform(RectTransform)  m_panel;

float X = Input.mousePosition.x - Screen.width / 2f;
float Y = Input.mousePosition.y - Screen.height / 2f;
Vector2 tranPos = new Vector2(X,Y);
m_panel.localPosition = tranPos;

注意:需要考慮m_panel的錨點,舉例說明:可以這麼說,錨點對應座標中心點。

第二種:使用 RectTransformUtility.ScreenPointToLocalPointInRectangle 方法。

我這裏的UICamera是單獨檢測UI層的相機,可以是MainCamera,如果沒有攝像機(即Canvas   --Overlay),則相機爲null。

public Vector2 CurrMousePosition(Transform thisTrans)
{
Vector2 vecMouse;
RectTransform parentRectTrans = thisTrans.parent.GetComponent<RectTransform>();
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTrans, Input.mousePosition, UICamera, out vecMouse);
return vecMouse;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章