本文主要總結(jié)一下unity中最常用的幾種坐標系。世界坐標系田炭、局部坐標系师抄、屏幕坐標系、視口坐標系教硫。以及它們之間的相互轉(zhuǎn)換叨吮。
1.世界坐標系
unity是使用的左手坐標系,
顧名思義瞬矩,世界坐標系就是物體在整個世界坐標系中的位置茶鉴,在unity中transform.position代表的就是該物體的世界坐標,transform.localPosition就是該物體的局部坐標景用,局部坐標是以該節(jié)點的父節(jié)點為基準的一個位置涵叮。
2.屏幕坐標系
屏幕坐標系就是把屏幕看作一個坐標系,從左下角開始計算,也就是(0,0)割粮,而右上角則是(Screen.widht,Screen.height)盾碗,所以又叫做像素坐標系。Screen.currentResolution指的是設備分辨率舀瓢,比如:電腦上指的就是電腦的屏幕分辨率廷雅,手機上指的就是手機的屏幕分辨率。Screen.width,Screen.height - 指的是使用該值的窗口的寬高京髓,比如:在Scene窗口使用指的就是Scene窗口的寬高航缀,在Game窗口使用,即運行編輯器時使用朵锣,指的就是Game窗口的寬高谬盐,在自定義的Window使用指的就是自定義的Window的寬高。理論上在手機上這兩個值是相同的诚些,但是為了保險起見還是統(tǒng)一使用Screen.width,Screen.height 飞傀。(Screen.currentResolution在一些編輯器自定義窗口時可能會用到)
void Start()
{
Debug.Log("當前窗口的分辨率為:" + Screen.width + "X" + Screen.height);
Debug.Log("當前屏幕的分辨率為:" + Screen.currentResolution);
}
鼠標位置坐標Input.mousePosition就是屬于屏幕坐標系,通過屏幕坐標和世界坐標互轉(zhuǎn)诬烹,可得到鼠標在Unity3D中的實際交互位置砸烦,然后就可以通過邏輯做出反饋。
3.視口坐標系
該坐標系計算方式和屏幕坐標系類似绞吁,只不過把其參數(shù)標準化了幢痘,更加適用于比例計算。左下角為(0,0) 右上角為(1,1)家破。比如需要把屏幕劃分成等份的時候颜说,就可以統(tǒng)一轉(zhuǎn)換為視口坐標系再來進行操作。
這里不管是視口坐標還是屏幕坐標汰聋,其z值還是有的门粪,是表示深度的。
3.GUI坐標系
該坐標是從左上角開始計算的烹困,左上角(0,0)玄妈,右下角為(Screen.width,Screen.height);
坐標系的相互轉(zhuǎn)換
1.世界坐標和屏幕坐標的相互轉(zhuǎn)換
屏幕坐標轉(zhuǎn)世界坐標
Camera.ScreenToWorldPoint(Vector3 Pos);
世界坐標轉(zhuǎn)屏幕坐標
Camera.WorldToScreenPoint(Vector3 Pos);
關于應用:
這些轉(zhuǎn)換一般應用于想要通過鼠標來操作世界物體,比如物體跟隨鼠標移動
所以我們要通過巧妙的方式彌補這個Bug髓梅,代碼如下拟蜻。(這個寫法是網(wǎng)上查到的,我找不到出處了)
void Update()
{
// 首先將要操縱的物體的世界坐標轉(zhuǎn)為屏幕坐標
Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
// 然后獲取鼠標的屏幕坐標
Vector3 mousePos = Input.mousePosition;
// 然后將已經(jīng)轉(zhuǎn)換好的物體的屏幕坐標的Z值賦給缺失z值的鼠標屏幕坐標
mousePos.z = screenPos.z;
// 然后將已經(jīng)完整的鼠標屏幕坐標轉(zhuǎn)成世界坐標
Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
// 最后每幀修改物體世界坐標位置
transform.position = worldPos;
}
2.世界坐標和視口坐標的相互轉(zhuǎn)換
世界坐標轉(zhuǎn)視口坐標
Camera.WorldToViewportPoint(Vector3 Pos)
視口坐標轉(zhuǎn)世界坐標
Camera.ViewportToWorldPoint(Vector3 Pos);
3.屏幕坐標和視口坐標的相互轉(zhuǎn)換
屏幕坐標轉(zhuǎn)視口坐標
Camera.ScreenToViewportPoint(Vector3 Pos)
視口坐標轉(zhuǎn)屏幕坐標
Camera.ViewportToScreenPoint(Vector3 Pos);
參考:https://blog.csdn.net/weixin_43147385/article/details/124230124