
參考博客:GolDHeaven
Unity中的4個坐標系
世界坐標系
平時根據transform.position等。 獲取到的物體位置、旋轉、縮放信息,都是根據世界坐標系獲得的。
觀察坐標系
把攝像機當做原點,基於攝像機的一個坐標系。
屏幕坐標系
屏幕坐標和分辨率有關,屏幕的左下角為(0,0),右上角為(screen.width,screen.height)。比如游戲的分辨率為500*600,則screen.width=500;screen.height=600。
視口坐標系
視口坐標系類似於屏幕坐標系,其左下角為(0,0),右上角為(1,1),我們在設計分屏游戲的時候就可以通過設置攝像機所占據的視口空間比例來控制。
4個坐標系中常用的變換函數可以在參考博客中查看。
世界坐標轉換為UI坐標
類似於:SLG游戲中我們點擊一個世界場景中的建築,然后在建築的周圍彈出UI顯示建築的一些信息。
把建築的世界坐標轉換為屏幕坐標。
//Camera.main為游戲場景中的主攝像機。
Vector3 screenPos = Camera.main.WorldToScreenPoint(buildPos);
把屏幕坐標轉換為UI的坐標。
這里介紹兩種方法。(因為之前用的都是第一種方法,沒見過第二種。然后公司項目用的是第二種,第一次看到那些代碼的時候,搞了半天才搞懂是啥意思。。。)
1、常用的方法,簡單好用
//canvas即為UI所在的Canvas。
Vector2 uiPos = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform,screenPos,null,out uiPos);
//img的錨點需要在屏幕中間,此時就可正確的設置其坐標了。
img.rectTransform.anchoredPosition = uiPos;
2、不是很常用的方法,但也可以用
//當游戲中Canvas的渲染模式為 Screen Space - Camera時,設置渲染Camera的攝像機為UICamera。
//用UICamera把屏幕坐標轉換為UI物體的世界坐標,
Vector3 uiWorldPos = UICamera.ScreenToWorldPoint(screenPos);
//然后賦值給UI的3D坐標。
img.transform.position = uiWorldPos;