Vector3 UIToWorldMapDistance(UIObject ui)//UI元件的3維坐標,z表示此元件在屏幕上的位置到世界地圖上的距離 { float cameraHeight = Camera.main.transform.position.y;//攝像機到世界地圖的距離 Vector3 screenPos = (ui的屏幕坐標);
bool highThanCenter = screenPos.y>Screen.height*0.5f; float ratio = Mathf.Abs((screenPos.y - Screen.height * 0.5f) / (Screen.height * 0.5f));//算出ui在屏幕上的比例關系 float centerLineLength = cameraHeight / Mathf.Cos(Mathf.Deg2Rad * (90 - Camera.main.transform.eulerAngles.x)); float bottomLength = centerLineLength * Mathf.Tan(Mathf.Deg2Rad * Camera.main.fieldOfView * 0.5f); float acturalLength = bottomLength * ratio; float requireAngle = Mathf.Atan(acturalLength / centerLineLength); float bevelLength = cameraHeight / Mathf.Cos(Mathf.Deg2Rad * (90 - Camera.main.transform.eulerAngles.x) + (highThanCenter? requireAngle:-requireAngle)); float finalLength = bevelLength * Mathf.Cos(requireAngle);//表示此元件在屏幕上的位置到世界地圖上的距離
screenPos.z=finalLength;
return screenPos; }
然后用Camera.main.ScreenToWorldPoint(ui的screenPos)進行 轉換即可。
原理就是根據ui在屏幕上的位置,算出比例,然后利用投影中的相似三角形原理算出准確的距離,三維的原理圖比較難畫,就不畫了,大家可以按照這個思路自己研究一下。
上述代碼中的攝像機是經過Y軸和X軸旋轉的,如果攝像機的位置和旋轉變化沒有很多,計算應該會更加方便。
