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