常见的移动跟随代码

354 阅读1分钟

摄像机跟随两个物体中心点移动


    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;
    }