Unity:Camra相机

1. 将屏幕坐标转换成世界坐标

Camera.main.ScreenToWorldPoint(Input.mousePosition);   X    //将鼠标点击的坐标转换成世界坐标

注意:该输出为一个固定坐标,转换失败。因为mousePosition是屏幕坐标(x,y,0),z轴是点与相机的距离。

 1 public class Move : MonoBehaviour
 2 {
 3     private Vector3 offset;  //加一个偏移量,操作更丝滑
 4     private void OnMouseDown()
 5     {
 6         float sreenZ = Camera.main.WorldToScreenPoint(transform.position).z;
 7         offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, sreenZ));
 8     }
 9     private void OnMouseDrag()
10     {
11         Vector3 screenPos = Input.mousePosition;
12         float screenZ = Camera.main.WorldToScreenPoint(transform.position).z;
13         transform.position = Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, screenZ)) + offset;
14     }
15 }
用鼠标拖拽一个物体

2. 将屏幕坐标转换成射线

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition)  //使用主相机创建一条射线,射线方向是鼠标点击的位置

案例1. 2D场景相机跟随(相机会跟随人物上下左右移动)

 1     //相机跟随的速度
 2     private float speedX = 2;  
 3     private float speedY = 5;
 4     //人物与相机距离多少时开始移动
 5     private float distance = 1; 
 6     //移动边界限制
 7     private float minPosX = -2.5f;  
 8     private float maxPosX = 2.5f;
 9     private float minPosY = -2.5f;
10     private float maxPosY = 2.5f;
11     private void Update()
12     {
13         float disX = player.position.x - transform.position.x;
14         float disY = player.position.y - transform.position.y;
15         if (disX > distance)
16         {
17             transform.position = new Vector3(transform.position.x + speedX * Time.deltaTime, transform.position.y, transform.position.z);
18         }
19         if (disX < -distance)
20         {
21             transform.position = new Vector3(transform.position.x - speedX * Time.deltaTime, transform.position.y, transform.position.z);
22         }
23         //限制移动区域
24         float realPosX = Mathf.Clamp(transform.position.x, minPosX, maxPosX);
25         if (disY > distance)
26         {
27             transform.position = new Vector3(realPosX, transform.position.y + speedY * Time.deltaTime, transform.position.z);
28         }
29         if (disY < -distance)
30         {
31             transform.position = new Vector3(realPosX, transform.position.y - speedY * Time.deltaTime, transform.position.z);
32         }
33         float realPosY = Mathf.Clamp(transform.position.y, minPosY, maxPosY);
34         transform.position = new Vector3(realPosX, realPosY, transform.position.z);
35     }

案例2. 3D场景相机跟随(角色被挡住,相机滑动到能看到角色位置)

通过代码设置观察点,找到能看见目标的观察点

通过Cinemachine制作

直接把相机移到遮挡处遮挡物变透明

案例3. 添加小地图

1.将相机看到的内容渲染到一张图上(小地图同步)

1)新建一个材质Render Texture

2)将材质放在相机Target Texture上

3)新建一个UI-->Raw Image

4)将材质放在Raw Image --> Texture上

5)在Scene视角里调整好小窗口的位置

6)复制一个相机,去掉Target Texture里的材质

最终实现效果:

原文地址:https://www.cnblogs.com/tomatokely/p/15332832.html