Ejemplo n.º 1
0
        void MoveInBoundaries()
        {
            _cameraMoveInColliderBoundaries.CameraSize = ProCamera2D.ScreenSizeInWorldCoordinates;

            // Remove the delta movement
            _transform.Translate(-ProCamera2D.DeltaMovement, Space.World);

            // Apply movement considering the collider boundaries
            _transform.Translate(_cameraMoveInColliderBoundaries.Move(ProCamera2D.DeltaMovement), Space.World);
        }
        public Vector3 AdjustDelta(float deltaTime, Vector3 originalDelta)
        {
            if (!enabled)
            {
                return(originalDelta);
            }

            _cameraMoveInColliderBoundaries.CameraSize = ProCamera2D.ScreenSizeInWorldCoordinates;

            // Apply movement considering the collider boundaries
            return(_cameraMoveInColliderBoundaries.Move(originalDelta));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Move the camera to the average position of all the targets.
        /// This method is automatically called every frame on LateUpdate/FixedUpdate.
        /// Use only if you want to manually control the update frequency.
        /// </summary>
        public void Move()
        {
            // Delta time
            var deltaTime = UpdateType == UpdateType.LateUpdate ? Time.deltaTime : Time.fixedDeltaTime;

            if (deltaTime < .0001f)
            {
                return;
            }

            // Calculate targets mid point
            _previousTargetsMidPoint = _targetsMidPoint;
            _targetsMidPoint         = GetTargetsWeightedMidPoint(CameraTargets);
            _cameraTargetPosition    = _targetsMidPoint;

            // Calculate influences
            _influencesSum         = Utils.GetVectorsSum(_influences);
            _cameraTargetPosition += _influencesSum;
            _influences.Clear();

            // Follow only on selected axis
            var cameraTargetPositionX = FollowHorizontal ? Vector3H(_cameraTargetPosition) : Vector3H(_transform.localPosition);
            var cameraTargetPositionY = FollowVertical ? Vector3V(_cameraTargetPosition) : Vector3V(_transform.localPosition);

            _cameraTargetPosition = VectorHV(cameraTargetPositionX, cameraTargetPositionY);

            // Ignore targets and influences if exclusive position is set
            if (ExclusiveTargetPosition.HasValue)
            {
                CameraTargetPositionDuringExclusive = _cameraTargetPosition;
                _cameraTargetPosition   = ExclusiveTargetPosition.Value;
                ExclusiveTargetPosition = null;
            }

            // Add offset
            _cameraTargetPosition += VectorHV(FollowHorizontal ? OverallOffset.x : 0, FollowVertical ? OverallOffset.y : 0);

            // Tween camera final position
            _cameraTargetHorizontalPositionSmoothed         = Utils.SmoothApproach(_cameraTargetHorizontalPositionSmoothed, _previousCameraTargetHorizontalPositionSmoothed, Vector3H(_cameraTargetPosition), 1f / HorizontalFollowSmoothness, deltaTime);
            _previousCameraTargetHorizontalPositionSmoothed = Vector3H(_cameraTargetPosition);

            _cameraTargetVerticalPositionSmoothed         = Utils.SmoothApproach(_cameraTargetVerticalPositionSmoothed, _previousCameraTargetVerticalPositionSmoothed, Vector3V(_cameraTargetPosition), 1f / VerticalFollowSmoothness, deltaTime);
            _previousCameraTargetVerticalPositionSmoothed = Vector3V(_cameraTargetPosition);

            // Limit camera distance to target
            if (LimitHorizontalCameraDistance)
            {
                var horizontalCompensation = Vector3H(_cameraTargetPosition) - Vector3H(_transform.localPosition) - (ScreenSizeInWorldCoordinates.x / 2) * MaxHorizontalTargetDistance;
                if (horizontalCompensation > 0)
                {
                    _cameraTargetHorizontalPositionSmoothed        += horizontalCompensation;
                    _previousCameraTargetHorizontalPositionSmoothed = _cameraTargetHorizontalPositionSmoothed;
                }
                else if (horizontalCompensation < -ScreenSizeInWorldCoordinates.x * MaxHorizontalTargetDistance)
                {
                    _cameraTargetHorizontalPositionSmoothed        += horizontalCompensation + ScreenSizeInWorldCoordinates.x * MaxHorizontalTargetDistance;
                    _previousCameraTargetHorizontalPositionSmoothed = _cameraTargetHorizontalPositionSmoothed;
                }
            }
            if (LimitVerticalCameraDistance)
            {
                var verticalCompensation = Vector3V(_cameraTargetPosition) - Vector3V(_transform.localPosition) - (ScreenSizeInWorldCoordinates.y / 2) * MaxVerticalTargetDistance;
                if (verticalCompensation > 0)
                {
                    _cameraTargetVerticalPositionSmoothed        += verticalCompensation;
                    _previousCameraTargetVerticalPositionSmoothed = _cameraTargetVerticalPositionSmoothed;
                }
                else if (verticalCompensation < -ScreenSizeInWorldCoordinates.y * MaxVerticalTargetDistance)
                {
                    _cameraTargetVerticalPositionSmoothed        += verticalCompensation + ScreenSizeInWorldCoordinates.y * MaxVerticalTargetDistance;
                    _previousCameraTargetVerticalPositionSmoothed = _cameraTargetVerticalPositionSmoothed;
                }
            }

            // If camera final horizontal position outside camera window rect
            var horizontalDeltaMovement = 0f;

            if (_cameraTargetHorizontalPositionSmoothed >= _cameraWindowRectInWorldCoords.x + _cameraWindowRectInWorldCoords.width)
            {
                horizontalDeltaMovement = _cameraTargetHorizontalPositionSmoothed - (Vector3H(_transform.localPosition) + _cameraWindowRectInWorldCoords.width / 2 + CameraWindowRect.x);
            }
            else if (_cameraTargetHorizontalPositionSmoothed <= _cameraWindowRectInWorldCoords.x)
            {
                horizontalDeltaMovement = _cameraTargetHorizontalPositionSmoothed - (Vector3H(_transform.localPosition) - _cameraWindowRectInWorldCoords.width / 2 + CameraWindowRect.x);
            }

            // If camera final vertical position outside camera window rect
            var verticalDeltaMovement = 0f;

            if (_cameraTargetVerticalPositionSmoothed >= _cameraWindowRectInWorldCoords.y + _cameraWindowRectInWorldCoords.height)
            {
                verticalDeltaMovement = _cameraTargetVerticalPositionSmoothed - (Vector3V(_transform.localPosition) + _cameraWindowRectInWorldCoords.height / 2 + CameraWindowRect.y);
            }
            else if (_cameraTargetVerticalPositionSmoothed <= _cameraWindowRectInWorldCoords.y)
            {
                verticalDeltaMovement = _cameraTargetVerticalPositionSmoothed - (Vector3V(_transform.localPosition) - _cameraWindowRectInWorldCoords.height / 2 + CameraWindowRect.y);
            }

            // Limit max speed
            if (LimitMaxHorizontalSpeed)
            {
                horizontalDeltaMovement = Mathf.Clamp(horizontalDeltaMovement, -MaxHorizontalSpeed, MaxHorizontalSpeed);
            }

            if (LimitMaxVerticalSpeed)
            {
                verticalDeltaMovement = Mathf.Clamp(verticalDeltaMovement, -MaxVerticalSpeed, MaxVerticalSpeed);
            }

            var deltaMovement = VectorHV(horizontalDeltaMovement, verticalDeltaMovement);

            // Apply movement considering the collider boundaries
            if (UseGeometryBoundaries && BoundariesLayerMask.value != 0)
            {
                _transform.Translate(_cameraMoveInColliderBoundaries.Move(deltaMovement), Space.World);
            }
            // Apply movement without boundaries
            else
            {
                _transform.Translate(deltaMovement, Space.World);
            }
            // Limit position to boundaries
            if (UseNumericBoundaries)
            {
                LimitSizeAndPositionToNumericBoundaries();
            }

            // Update camera window rect
            _cameraWindowRectInWorldCoords = GetRectAroundTransf(CameraWindowRect, ScreenSizeInWorldCoordinates, _transform);
        }