1. 将屏幕坐标转换成世界坐标
Camera.main.ScreenToWorldPoint(Input.mousePosition); X //将鼠标点击的坐标转换成世界坐标
注意:该输出为一个固定坐标,转换失败。因为mousePosition是屏幕坐标(x,y,0),z轴是点与相机的距离。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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场景相机跟随(角色被挡住,相机滑动到能看到角色位置)
案例3. 添加小地图
1.将相机看到的内容渲染到一张图上(小地图同步)
1)新建一个材质Render Texture
2)将材质放在相机Target Texture上
3)新建一个UI-->Raw Image
4)将材质放在Raw Image --> Texture上
5)在Scene视角里调整好小窗口的位置
6)复制一个相机,去掉Target Texture里的材质
最终实现效果: