FGUI與黃金礦工

前言

  • 本來想用FGUI寫一個黃金礦工的遊戲
  • 到最後實現的時候,沒有辦法給UI添加碰撞體和LineRender
  • 只是實現了最簡單的爪子旋轉移動的邏輯
  • 中間踩了一些·FGUI座標轉換的坑

座標空間

  • 當UI發生縮放的時候,邏輯屏幕座標和屏幕座標是不一樣的。邏輯座標是指在GRoot下面的座標
//轉換局部
aObject.LocalToRoot(localPos);
//轉換屏幕座標
GRoot.Inst.GlobalToLocal(screenPos);
  • 注意localPos指的是將物體瞄點作爲座標原點空間座標
//獲取某個物體的UI座標
aObject.LocalToGlobal(Vector2.zero);
//獲得物體的front 這裏等於UGUI transform.front
aObject.LocalToGlobal(new Vector2(0,1))
  • 在UI沒有縮放的情況下 LocalToGlobal 和LocalToRoot是相等的
  • 但是發生縮放的時候,獲取UI座標要用LocalToRoot
  • 世界座標的轉換
//世界到UI座標
Vector3 pos = Camera.main.WorldToScreenPos(worldPos);
GRoot.Inst.GlobalToRoot(pos);
//局部到世界
Vector3 pos2 = aObject.LocalToRoot(Vector2.zero);
Camera.main.ScreenPosToWorld(pos2);
  • FGUI的座標空間是以左上角爲原點,向下爲y軸正方向,向右爲x軸正方向
  • 所以上面的所有轉換都缺少了一個y軸的轉換
Unity-y = Screen.Height -Fgui-y 
  • 另外詳細調查了一下
  • GRoot是掛在Stage下面的
  • 當屏幕的分辨率是1600-900時,如果我們的UI分辨率是1920-1080,那麼GRoot就會發生大約0.83的縮放
  • 所以這個時候LocalToGRoot獲取的就是邏輯UI座標,屬於1920-1080的,但是LocalToGlobal就是屏幕座標1600-900的
  • Screen.Width和Screen.Height所顯示的也是設備的分辨率
  • Input.mousePosition也是屏幕空間的座標
  • 不過我很好奇,邏輯空間的座標有什麼用?在這裏插入圖片描述
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章