예제 #1
0
    private void Update()
    {
        Camera  cam          = CameraControllerStack.Instance.Camera;
        Vector3 focusCenter  = Vector3.zero;
        float   zoomDelta    = 0;
        bool    anyOffscreen = false;

        for (int i = 0; i < CameraFocusPoint.Instances.Count; ++i)
        {
            CameraFocusPoint focusPoint = CameraFocusPoint.Instances[i];
            focusCenter += focusPoint.transform.position;

            // Get centered viewport pos
            Vector3 viewportPos = cam.WorldToViewportPoint(focusPoint.transform.position);
            viewportPos -= Vector3.one * 0.5f;
            viewportPos *= 2;

            // Increase amount of desired zoom by how much player is off screen
            // If any players are offscreen we will never zoom in regardless
            float maxViewPos = Mathf.Max(Mathf.Abs(viewportPos.x), Mathf.Abs(viewportPos.y));
            float delta      = Mathf.Clamp((maxViewPos + ViewportBorder) - 1, -1, 1) * ZoomSensitivity;
            if (delta > 0 || anyOffscreen)
            {
                anyOffscreen = true;
                zoomDelta    = Mathf.Max(zoomDelta + delta, 0);
            }
            else
            {
                zoomDelta += delta;
            }
        }

        if (CameraFocusPoint.Instances.Count > 0)
        {
            focusCenter /= CameraFocusPoint.Instances.Count;
        }

        Debug.DrawLine(MountPoint.position, focusCenter);

        float desiredZoom = ZoomRange.Clamp(MountPoint.position.y + zoomDelta);

        _zoom = Mathfx.Damp(_zoom, desiredZoom, 0.25f, Time.deltaTime * 2);
        Vector3 desiredPos   = focusCenter.WithY(_zoom);
        Vector3 toDesiredPos = MountPoint.position - desiredPos;

        if (toDesiredPos.sqrMagnitude > 0.1f)
        {
            MountPoint.position = Mathfx.Damp(MountPoint.position, desiredPos, 0.5f, Time.deltaTime * 2);
        }
        else
        {
            MountPoint.position = desiredPos;
        }
    }
예제 #2
0
 public void UnregisterFocusPoint(CameraFocusPoint point)
 {
     focusPoints.Remove(point);
 }
예제 #3
0
 public void RegisterFocusPoint(CameraFocusPoint point)
 {
     focusPoints.Add(point);
 }