一.屏幕坐标系
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
2.在Project视图中创建3个文件夹, Scene文件夹、Resources文件夹和Script文件夹
3.将当前场景保存为GameScene
4.创建ScreenPosition游戏脚本
5.在Hierarchy视图中创建一个空的GameObject, 命名为GameManager,并把ScreenPosition绑定在该对象上
6.更改屏幕分辨率为480 * 800
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
2.在Project视图中创建3个文件夹, Scene文件夹、Resources文件夹和Script文件夹
3.将当前场景保存为GameScene
4.创建ScreenPosition游戏脚本
5.在Hierarchy视图中创建一个空的GameObject, 命名为GameManager,并把ScreenPosition绑定在该对象上
6.更改屏幕分辨率为480 * 800
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.摄像机的前面有一个长方形的小框子, 那个即为视口。
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)+"]");
}
}
}