之前写过小地图功能以及拖拽大小功能https://blog.csdn.net/qq_30300405/article/details/88660207
本以为没有问题,位置匹配什么的都没有问题,但是当摄像机还是旋转时,问题出现了,标识图片位置匹配的位置是摄像机的位置,当摄像机角度不是正交角度也就是x为90度的时候,摄像机看到的画面就和小地图上标识的位置不一致了(因为这件事挨批了心里十分怨念)。
那么在那样解决呢?
后来看到一个博客让我找到了思路。http://www.xuanyusong.com/archives/3036
既然我能获取到视口范围了,那么我也同样能获取到视口中心点了啊,沿着视口中心的方向发射一条射线碰到地面的坐标不就是我要的标识坐标了吗?
Vector3 CenterPos;
Ray ray = Camera.main.ScreenPointToRay(new Vector2(Screen.width / 2, Screen.height / 2));
RaycastHit hit;
Vector2 v = new Vector2(Screen.width / 2, Screen.height / 2); //屏幕中心点
if (Physics.Raycast(ray, out hit))
{
Debug.DrawLine(Camera.main.transform.position, hit.point, Color.green);
Vector3 pso = new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z);
//Debug.DrawLine(Camera.main.transform.position, pso, Color.red);
Distence = Vector3.Distance(Camera.main.transform.position, hit.point);
CenterPos = hit.point;
}
ImgPos = WorldPositionToMap(CenterPos);
NavImg.position = ImgPos;
那么问题来了,当我点击小地图时候怎么匹配摄像机的位置呢,毕竟这样根据之前的脚本返回的坐标也是视口中心点坐标,难道还要逆推回去获得摄像机的坐标?
这样太麻烦了,数学学得不好脑袋都被搞晕了。
我这里用了一个取巧的方法,获取摄像机视口中心点坐标和小地图上返回的坐标点xy的偏差值,将这个偏差值加在摄像机上即可,毕竟这也算是个平行四边形(谁还敢说我数学不好!)
/// <summary>
/// 点击小地图主摄像机移动
/// </summary>
public void MapClick1()
{
if (IsSizeDrag) return;
Vector2 point = Input.mousePosition;
Vector3 PointPos = MapToWorld(point);
//Vector3 Pos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0));
//根据视口中心点坐标偏差改变摄像机位置
//Vector3[] corners = GetCorners(Distence);
//Vector3 pos = (corners[3] + corners[0]) / 2;
Vector2 v = new Vector2(Screen.width / 2, Screen.height / 2); //屏幕中心点
float x = Camera.main.transform.position.x + PointPos.x - v.x;
float z = Camera.main.transform.position.z + PointPos.z - v.y;
Camera.main.transform.position = new Vector3(x, Camera.main.transform.position.y, z);
}
写到这里你以为功能就已经完成了吗?
在你使用摄像机开始旋转的时候还会发现一个问题,就是当你的摄像机视口的中心点没有物体给你碰撞检测的时候,位置再次不匹配了,这个我暂时还没找到合适的方式修改,只能在地面下面添加一个空物体添加一个非常大的Boxcolider以及将摄像机的可移动的范围坐上限制。