예제 #1
0
    ////////////////////////////////////////////////////////////////

    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);
        }
    }
예제 #2
0
    ////////////////////////////////////////////////////////////////

    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);
    }
예제 #3
0
    ////////////////////////////////////////////////////////////////

    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();
        }
    }
예제 #4
0
    ////////////////////////////////////////////////////////////////

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