前言
- 本來想用FGUI寫一個黃金礦工的遊戲
- 到最後實現的時候,沒有辦法給UI添加碰撞體和LineRender
- 只是實現了最簡單的爪子旋轉移動的邏輯
- 中間踩了一些·FGUI座標轉換的坑
座標空間
- 當UI發生縮放的時候,邏輯屏幕座標和屏幕座標是不一樣的。邏輯座標是指在GRoot下面的座標
aObject.LocalToRoot(localPos);
GRoot.Inst.GlobalToLocal(screenPos);
- 注意localPos指的是將物體瞄點作爲座標原點空間座標
aObject.LocalToGlobal(Vector2.zero);
aObject.LocalToGlobal(new Vector2(0,1))
- 在UI沒有縮放的情況下 LocalToGlobal 和LocalToRoot是相等的
- 但是發生縮放的時候,獲取UI座標要用LocalToRoot
- 世界座標的轉換
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也是屏幕空間的座標
- 不過我很好奇,邏輯空間的座標有什麼用?