摄像机跟随两个物体中心点移动
private void Move()
{
FindNextZoomSize();
transform.position = Vector3.SmoothDamp(transform.position, findNextPosition, ref currentVelocity, smoothTime);
}
复制代码
private void FinidNextPosition()
{
int num = 0;
Vector3 tempPosition = new Vector3();
//遍历所有物体,过滤掉未激活的坦克
for (int i = 0; i < targets.Length; i++)
{
//然后存储每个坦克的位置
if (!targets[i].gameObject.activeSelf)
{
continue;
}
tempPosition += targets[i].position;
num++;
}
//除以坦克的数量,返回多个坦克的中心位置
if (num > 0)
{
tempPosition /= num;
}
tempPosition.y = transform.position.y;
findNextPosition = tempPosition;
}
复制代码
摄像机随着两个物体的移动,放大或者缩小镜头
private void Zoom()
{
FinidNextPosition();
camera.orthographicSize = Mathf.SmoothDamp(camera.orthographicSize, findNextSize,ref currentZoomVelocity,smoothTime);
}
复制代码
private void FindNextZoomSize()
{
//根据中心点和坦克的距离 + 固定的边距 ,就是摄像机的size高度
//把当前中心点世界坐标转换成本地坐标,用于后面的计算其他坦克对于这个中心点的偏移量
Vector3 centerPosition = transform.InverseTransformPoint(findNextPosition);
float size = 0;
for (int i = 0; i < targets.Length; i++)
{
if (!targets[i].gameObject.activeSelf)
{
continue;
}
//返回坦克对于中心的本地坐标
Vector3 targetPosition = transform.InverseTransformPoint(targets[i].position);
//用坦克的本地坐标 - 中心点的本地坐标,返回偏移量
Vector3 distancePosition = targetPosition - centerPosition;
//返回最大的size, size 和 偏移量的y,y就是他们的间距
size = Mathf.Max(size, Mathf.Abs(distancePosition.y));
//返回最大的size, 偏移量的x是他们宽的间距,宽 / 宽高比例倍数,就是他们的高,返回倍数高和正常的size哪个大
size = Mathf.Max(size, Mathf.Abs(distancePosition.x / camera.aspect));
}
//加入固定边框
size += bordarWidth;
//过滤地狱最小size的值
size = Mathf.Max(size, minWidth);
findNextSize = size;
}
复制代码