一.屏幕坐标系

1.屏幕坐标系: 手机屏幕或者电脑屏幕的一个坐标系。

2.屏幕坐标是以像素来定义的, 屏幕左下角为原点(0,0), 右上角为(Screen.width,Screen.height), width是屏幕的宽度, height是屏幕的高度, Z值是摄像机世界坐标取反,并且以相机的世界单位来衡量的。

3.屏幕坐标和相机之间满足: Screen.width = Camera.main.pixelWidth和Screen.height = Camera.main.pixelHeight这两个条件。

4.鼠标的位置坐标属于屏幕坐标。通过Input.mousePosition获取鼠标的屏幕坐标。

二.创建工程

1.创建一个游戏工程, 命名为ScreenViewPort

屏幕坐标系 python_坐标转换


2.在Project视图中创建3个文件夹, Scene文件夹、Resources文件夹和Script文件夹

屏幕坐标系 python_宽高_02


3.将当前场景保存为GameScene

屏幕坐标系 python_屏幕坐标_03


4.创建ScreenPosition游戏脚本


屏幕坐标系 python_宽高_04


5.在Hierarchy视图中创建一个空的GameObject, 命名为GameManager,并把ScreenPosition绑定在该对象上

屏幕坐标系 python_坐标转换_05


6.更改屏幕分辨率为480 * 800

屏幕坐标系 python_屏幕坐标_06



7.编写代码

using UnityEngine;

public class ScreenPosition : MonoBehaviour
{
	void Update () 
	{
		if(Input.GetMouseButtonDown(0))
		{
			Debug.Log ("屏幕坐标:" + Input.mousePosition);
		}
	}
}

8.运行点击屏幕打印

屏幕坐标:(9.0, 33.0, 0.0)

屏幕坐标:(458.0, 22.0, 0.0)

屏幕坐标:(228.0, 410.0, 0.0)

屏幕坐标:(458.0, 795.0, 0.0)

三.视口坐标系

1.摄像机的前面有一个长方形的小框子, 那个即为视口。

屏幕坐标系 python_宽高_07

2.视口坐标是标准化后的屏幕坐标。视口坐标是以0到1间的数字来表示的, 它的范围是以左下角为(0,0), 右上角为(1,1)定义的这样一个矩形。视口坐标是一个3D坐标, Z轴是以相机的世界单位来衡量的。通过对比可以发现视口坐标和屏幕坐标特别的相似。

3.摄像机视口比例:public float aspect{get;set;},此属性用于获取或设置Camera视口的宽高比例值。

4.void ResetAspect();恢复长宽比为屏幕的长宽比。

5.代码

using UnityEngine;

public class CameraAspect : MonoBehaviour
{
	void Start () 
	{
		Debug.Log ("默认宽高比例:" + Camera.main.aspect);
	}

	void OnGUI () 
	{
		if(GUILayout.Button("摄像机宽高比例为1"))
		{
			Camera.main.ResetAspect ();
			Camera.main.aspect = 1;
		}

		if(GUILayout.Button("摄像机宽高比例为2"))
		{
			Camera.main.ResetAspect ();
			Camera.main.aspect = 2;
		}
	}
}

四.屏幕坐标和视口坐标的转换

1.从视口空间到屏幕空间的变换位置: Vector3 ViewportToScreenPoint(Vector3 position);

2.从屏幕空间到视窗空间的变换位置: Vector3 ScreenToViewportPoint(Vector3 position);

3.代码

using UnityEngine;

public class ScreenViewPortPosition : MonoBehaviour 
{
	void Start()
	{
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,0,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0.5,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0.5f,0,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,0.5,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,0.5f,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0.5,0.5,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0.5f,0.5f,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(1,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(1,0,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,1,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,1,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(1,1,0),"+Camera.main.ViewportToScreenPoint(new Vector3(1,1,0))+"]");
	}

	void Update () 
	{
		if(Input.GetMouseButtonDown(0))
		{
			Debug.Log ("摄像机屏幕坐标转换成视口坐标:["+Input.mousePosition+","+Camera.main.ScreenToViewportPoint(Input.mousePosition)+"]");
		}
	}
}