//////////////////////////////////////////////////////////////// public void OnPlayerLeftAnchorZone(CameraAnchorZone anchorZone) { //Debug.Log("Exit Anchor Zone"); AssetDataCamera assetDataCamera = AssetManager.GetAssetData <AssetDataCamera>(); m_PreviousScaleFactor = m_ZoomFactor; m_DesiredScaleFactor = 1.0f; m_ZoomTimeRemaining = assetDataCamera.ZoomTime; if (m_CurrentAnchorZone != anchorZone) { // Valid Case: If two zones are close by, it can happen that we first enter the new zone, then leave the old zone. Unity Events I guess. return; } //////////////////////////////////////////////////////////////// m_CurrentAnchorZone?.SetCameraCollidersActive(false); m_CurrentAnchorZone = null; if (m_CameraMode != CameraModes.LockOnPlayer) { SetCameraMode(CameraModes.TransitionToFocusPlayer); } }
//////////////////////////////////////////////////////////////// public void OnPlayerEnteredAnchorZone(CameraAnchorZone anchorZone) { //Debug.Log("Enter Anchor Zone"); m_CurrentAnchorZone?.SetCameraCollidersActive(false); m_CurrentAnchorZone = anchorZone; SetCameraMode(CameraModes.TransitionToAnchorZone); AssetDataCamera assetDataCamera = AssetManager.GetAssetData <AssetDataCamera>(); m_PreviousScaleFactor = m_ZoomFactor; m_DesiredScaleFactor = anchorZone.CameraZoom; m_ZoomTimeRemaining = assetDataCamera.ZoomTime; anchorZone.SetCameraCollidersActive(true); }
//////////////////////////////////////////////////////////////// public override void Initialize() { JSDK.Events.EventManager.Get().AddListener <PlayerResetEvent>(OnPlayerReset); JSDK.Events.EventManager.Get().AddListener <PlayerDeathEvent>(OnPlayerDeath); m_CameraMode = CameraModes.FocusPlayer; m_CurrentAnchorZone = null; AssetDataCamera assetDataCamera = AssetManager.GetAssetData <AssetDataCamera>(); { SceneContext context = SceneContext.MetaContext(); m_Camera = Camera.main; m_CameraHolder = m_Camera.transform.parent.gameObject; m_BaseSizeY = assetDataCamera.SizeY / 2.0f; m_BaseSizeX = m_BaseSizeY * Screen.width / (float)Screen.height; SetCameraZoom(1.0f); m_ScreenEffectRenderer = m_CameraHolder.GetComponentInChildren <MeshRenderer>(); m_ScreenEffectRenderer.transform.position = m_ScreenEffectRenderer.transform.position.xy().To3D_Z(); context.Unset(); } }
//////////////////////////////////////////////////////////////// void OnPlayerReset(PlayerResetEvent e) { if (!m_DoCameraLogic) { return; } PlayerController player = PlayerManager.Get().GetPlayerController(); m_DesiredScaleFactor = 1.0f; SetCameraZoom(m_DesiredScaleFactor); m_ZoomTimeRemaining = 0.0f; Vector2 newCameraPosition; //////////////////////////////////////////////////////////////// CameraAnchorZone anchorZone = GetCameraAnchorZoneIfAny(player.transform.position.xy(), player.Collider != null ? player.Collider.radius + 0.1f : 0.1f); if (anchorZone) { // Prio 1: We focus the the newly entered camera anchor zone. if (anchorZone != m_CurrentAnchorZone) { OnPlayerEnteredAnchorZone(anchorZone); //return; } else { SetCameraMode(CameraModes.TransitionToAnchorZone); } FocusCameraOn(anchorZone.GetTargetCameraPosition(GetCameraColliderSize(), player.transform.position)); m_DesiredScaleFactor = m_CurrentAnchorZone.CameraZoom; SetCameraZoom(m_DesiredScaleFactor); m_ZoomTimeRemaining = 0.0f; newCameraPosition = m_CameraHolder.transform.position; } else { if (m_CurrentAnchorZone != null) { m_CurrentAnchorZone.SetCameraCollidersActive(false); m_CurrentAnchorZone = null; } SetCameraMode(CameraModes.FocusPlayer); // Prio 2: We focus the player newCameraPosition = player.transform.position.xy(); } /////////////////////////////////////////////////////////////// // Collision Checks float paddingY = m_BaseSizeY * 1.0f / m_ZoomFactor; float paddignX = m_BaseSizeX * 1.0f / m_ZoomFactor; // Check Top m_RaycastHitCount = Physics2D.RaycastNonAlloc(newCameraPosition, Vector2.down, m_RaycastHits, paddingY, (int)CommonLayerMasks.Camera); int?colliderIndex = GetFirstNonTriggerCollider(m_RaycastHits, m_RaycastHitCount, false); if (colliderIndex.HasValue) { newCameraPosition.y = m_RaycastHits[colliderIndex.Value].point.y + paddingY; } // Check Sides m_RaycastHitCount = Physics2D.RaycastNonAlloc(newCameraPosition, Vector2.right, m_RaycastHits, paddignX, (int)CommonLayerMasks.Camera); colliderIndex = GetFirstNonTriggerCollider(m_RaycastHits, m_RaycastHitCount, false); if (colliderIndex.HasValue) { float directionFactor = ((m_RaycastHits[colliderIndex.Value].point.x < newCameraPosition.x) ? 1.0f : -1.0f); newCameraPosition.x = m_RaycastHits[colliderIndex.Value].point.x + directionFactor * paddignX; } m_RaycastHitCount = Physics2D.RaycastNonAlloc(newCameraPosition, Vector2.left, m_RaycastHits, paddignX, (int)CommonLayerMasks.Camera); colliderIndex = GetFirstNonTriggerCollider(m_RaycastHits, m_RaycastHitCount, false); if (colliderIndex.HasValue) { float directionFactor = ((m_RaycastHits[colliderIndex.Value].point.x < newCameraPosition.x) ? 1.0f : -1.0f); newCameraPosition.x = m_RaycastHits[colliderIndex.Value].point.x + directionFactor * paddignX; } FocusCameraOn(newCameraPosition); }