前言:这个也是我得一个朋友怎么做,朋友跟我说的方法,然后我就想记录下来,当个学习。
需求:相机固定视角(相机的高是15、x轴选转30、y轴旋转15),地图上有很多物体,点击后相机移动到指定物体(物体居中在屏幕中间)。
视频效果:
Unity 相机固定角度平移至指定物体_哔哩哔哩_bilibili
看到这个之后就想到了用三角函数做,下面直接上代码,就不啰嗦了。
public Camera mCamera;
private Vector3 mTargetPos;
private float mAngleX = 30;
private float mAngleY = 15;
void Start()
{
mAngleX = mCamera.transform.eulerAngles.x;
mAngleY = mCamera.transform.eulerAngles.y;
mTargetPos = mCamera.transform.position;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = mCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
if (hitInfo.collider.CompareTag("Player"))
{
//根据已知条件 求出 z 轴方向移动距离,根据x轴角度
float x_duiBian = mCamera.transform.position.y * Mathf.Tan((90 - mAngleX) * Mathf.Deg2Rad);
//抵消 y轴旋转造成的误差
x_duiBian *= Mathf.Cos(mAngleY * Mathf.Deg2Rad);
//根据已知条件 求出 x 轴方向移动距离,根据y轴角度
float y_duiBian = x_duiBian * Mathf.Tan(mAngleY * Mathf.Deg2Rad);
//根据上面计算的位置 赋值
mTargetPos.x = hitInfo.collider.transform.position.x - y_duiBian;
mTargetPos.z = hitInfo.collider.transform.position.z - (x_duiBian);
}
}
}
mCamera.transform.position = Vector3.MoveTowards(mCamera.transform.position, mTargetPos, 10f * Time.deltaTime);
}
这也是临时想到的解决方案,办法应该有很多种,这也是我发出来的原因。欢迎各位大佬交流,互相学习。