一、静态变量

静态变量

描述

main

第一个带有“MainCamera”标签的摄像机

二、变量

静态变量

描述

fieldOfView

“透视”摄像机的视野

orthographicSize

“正交”摄像机的大小

ViewPort

摄像机效果显示在界面上的哪个位置,占多大

三、静态方法

静态变量

描述

ScreenPointToRay(Vector3)

从相机通过屏幕点的射线

ViewportToWorldPoint

视口坐标转换世界坐标

ScreenToViewportPoint

屏幕坐标转换视口坐标

ScreenToWorldPoint

屏幕坐标转换世界坐标

WorldToScreenPoint

世界坐标转换屏幕坐标

(保留一位小数,四舍五入)

四、关于世界坐标、屏幕坐标与视口坐标
  1. 世界坐标为世界空间下物体的坐标,相对于世界坐标原点。
  2. 屏幕坐标为 Game 窗口下的坐标。左下角为 (0,0) 点
  3. 视口坐标将 Game 窗口坐标单位化,左下角 (0,0),右上角 (1,1)。
  4. 在正交相机下,世界坐标可与屏幕坐标直接转换,在摄像机参考系下,最接近摄像机平面的位置。
  5. 在透视坐标系下,世界坐标与屏幕坐标直接转换只能得到摄像机原点,因此需要视口坐标辅助转换。
    将屏幕坐标转换视口坐标时,默认其z轴为0,世界坐标转换视口坐标时,z轴为世界坐标到摄像机屏平面的距离。
    延长其z轴到目的平面,再将视口坐标转换为世界坐标,即可精确获得世界坐标的某一点。
五、拖拽案例
private Vector3 offset = Vector3.zero;
private float z;
private Vector3 mouse;
private void OnMouseDown()
{
    //z = Vector3.Dot(transform.position - Camera.main.transform.position, Camera.main.transform.forward);
    z = Camera.main.WorldToScreenPoint(transform.position).z;
    mouse = Input.mousePosition;
    //也可以是z= Camera.main.WorldToScreenPoint(transform.position).z;
    //debug一下就知道这两个z是一样的
    //保持鼠标的屏幕坐标的z值与被拖拽物体的屏幕坐标的z保持一致
    // Vector3 v3 = new Vector3(Input.mousePosition.x, Input.mousePosition.y, z);
    //得到鼠标点击位置与物体中心位置的差值
    // offset = transform.position - Camera.main.ScreenToWorldPoint(v3);
}
private void OnMouseDrag()
{
    if (mouse != Input.mousePosition)
    {
        //时刻保持鼠标的屏幕坐标的z值与被拖拽物体的屏幕坐标保持一致
        Vector3 v3 = new Vector3(Input.mousePosition.x, Input.mousePosition.y, z);
        //鼠标的屏幕坐标转换为世界坐标+偏移量=物体的位置
        transform.position = Camera.main.ScreenToWorldPoint(v3); // + offset;
        Debug.Log(v3);
    }
}
Vector3 targetPos;
    Vector3 lastPos;

    //当鼠标按下物体
    void OnMouseDown()
    {
        lastPos = Camera.main.ScreenToViewportPoint(Input.mousePosition) - Camera.main.WorldToViewportPoint(transform.position);
    }
    //当鼠标拖拽物体
    void OnMouseDrag()
    {
        targetPos = Camera.main.ViewportToWorldPoint(Camera.main.ScreenToViewportPoint(Input.mousePosition) - lastPos);
        transform.position = new Vector3(targetPos.x, targetPos.y, targetPos.z);
    }