Exemple #1
0
 private void OnEnable()
 {
     VirtualCamera = GetComponent <CinemachineVirtualCameraBase>();
     if (VirtualCamera == null)
     {
         Debug.LogError("CinemachineCollider requires a Cinemachine Virtual Camera component");
         enabled = false;
     }
     else
     {
         VirtualCamera.AddPostPipelineStageHook(PostPipelineStageCallback);
         enabled = true;
     }
     mExtraState = null;
 }
 static int AddPostPipelineStageHook(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 2);
         Cinemachine.CinemachineVirtualCameraBase obj = (Cinemachine.CinemachineVirtualCameraBase)ToLua.CheckObject <Cinemachine.CinemachineVirtualCameraBase>(L, 1);
         Cinemachine.CinemachineVirtualCameraBase.OnPostPipelineStageDelegate arg0 = (Cinemachine.CinemachineVirtualCameraBase.OnPostPipelineStageDelegate)ToLua.CheckDelegate <Cinemachine.CinemachineVirtualCameraBase.OnPostPipelineStageDelegate>(L, 2);
         obj.AddPostPipelineStageHook(arg0);
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
        /// <summary>Called by CinemachineCore at designated update time
        /// so the vcam can position itself and track its targets.  This implementation
        /// updates all the children, chooses the best one, and implements any required blending.</summary>
        /// <param name="worldUp">Default world Up, set by the CinemachineBrain</param>
        /// <param name="deltaTime">Delta time for time-based effects (ignore if less than or equal to 0)</param>
        public override void UpdateCameraState(Vector3 worldUp, float deltaTime)
        {
            //UnityEngine.Profiling.Profiler.BeginSample("CinemachineStateDrivenCamera.UpdateCameraState");
            if (!PreviousStateIsValid)
            {
                deltaTime = -1;
            }

            UpdateListOfChildren();
            CinemachineVirtualCameraBase best = ChooseCurrentCamera(deltaTime);

            if (m_ChildCameras != null)
            {
                for (int i = 0; i < m_ChildCameras.Length; ++i)
                {
                    CinemachineVirtualCameraBase vcam = m_ChildCameras[i];
                    if (vcam != null)
                    {
                        vcam.gameObject.SetActive(m_EnableAllChildCameras || vcam == best);
                        if (vcam.VirtualCameraGameObject.activeInHierarchy)
                        {
                            vcam.AddPostPipelineStageHook(OnPostPipelineStage);
                            CinemachineCore.Instance.UpdateVirtualCamera(vcam, worldUp, deltaTime);
                        }
                    }
                }
            }

            ICinemachineCamera previousCam = LiveChild;

            LiveChild = best;

            // Are we transitioning cameras?
            if (previousCam != null && LiveChild != null && previousCam != LiveChild)
            {
                // Create a blend (will be null if a cut)
                float          duration = 0;
                AnimationCurve curve    = LookupBlendCurve(previousCam, LiveChild, out duration);
                mActiveBlend = CreateBlend(
                    previousCam, LiveChild,
                    curve, duration, mActiveBlend, deltaTime);

                // Notify incoming camera of transition
                LiveChild.OnTransitionFromCamera(previousCam);

                // Generate Camera Activation event if live
                CinemachineCore.Instance.GenerateCameraActivationEvent(LiveChild);

                // If cutting, generate a camera cut event if live
                if (mActiveBlend == null)
                {
                    CinemachineCore.Instance.GenerateCameraCutEvent(LiveChild);
                }
            }

            // Advance the current blend (if any)
            if (mActiveBlend != null)
            {
                mActiveBlend.TimeInBlend += (deltaTime >= 0)
                    ? deltaTime : mActiveBlend.Duration;
                if (mActiveBlend.IsComplete)
                {
                    mActiveBlend = null;
                }
            }

            if (mActiveBlend != null)
            {
                mActiveBlend.UpdateCameraState(worldUp, deltaTime);
                m_State = mActiveBlend.State;
            }
            else if (LiveChild != null)
            {
                m_State = LiveChild.State;
            }

            // Push the raw position back to the game object's transform, so it
            // moves along with the camera.  Leave the orientation alone, because it
            // screws up camera dragging when there is a LookAt behaviour.
            if (Follow != null)
            {
                transform.position = State.RawPosition;
            }

            PreviousStateIsValid = true;
            //UnityEngine.Profiling.Profiler.EndSample();
        }
Exemple #4
0
        private ICinemachineCamera ChooseCurrentCamera(Vector3 worldUp, float deltaTime)
        {
            if (m_ChildCameras == null || m_ChildCameras.Length == 0)
            {
                mActivationTime = 0;
                return(null);
            }

            CinemachineVirtualCameraBase[] childCameras = m_ChildCameras;
            if (!m_RandomizeChoice)
            {
                m_RandomizedChilden = null;
            }
            else if (m_ChildCameras.Length > 1)
            {
                if (m_RandomizedChilden == null)
                {
                    m_RandomizedChilden = Randomize(m_ChildCameras);
                }
                childCameras = m_RandomizedChilden;
            }

            if (LiveChild != null && !LiveChild.VirtualCameraGameObject.activeSelf)
            {
                LiveChild = null;
            }
            ICinemachineCamera best = LiveChild;

            for (int i = 0; i < childCameras.Length; ++i)
            {
                CinemachineVirtualCameraBase vcam = childCameras[i];
                if (vcam != null && vcam.VirtualCameraGameObject.activeInHierarchy)
                {
                    vcam.AddPostPipelineStageHook(OnPostPipelineStage);

                    // Choose the first in the list that is better than the current
                    CinemachineCore.Instance.UpdateVirtualCamera(vcam, worldUp, deltaTime);
                    if (best == null || vcam.State.ShotQuality > best.State.ShotQuality ||
                        (vcam.State.ShotQuality == best.State.ShotQuality && vcam.Priority > best.Priority) ||
                        (m_RandomizeChoice && mRandomizeNow && (ICinemachineCamera)vcam != LiveChild &&
                         vcam.State.ShotQuality == best.State.ShotQuality &&
                         vcam.Priority == best.Priority))
                    {
                        best = vcam;
                    }
                }
            }
            mRandomizeNow = false;

            float now = Time.time;

            if (mActivationTime != 0)
            {
                // Is it active now?
                if (LiveChild == best)
                {
                    // Yes, cancel any pending
                    mPendingActivationTime = 0;
                    mPendingCamera         = null;
                    return(best);
                }

                // Is it pending?
                if (deltaTime > 0)
                {
                    if (mPendingActivationTime != 0 && mPendingCamera == best)
                    {
                        // Has it been pending long enough, and are we allowed to switch away
                        // from the active action?
                        if ((now - mPendingActivationTime) > m_ActivateAfter &&
                            ((now - mActivationTime) > m_MinDuration ||
                             best.Priority > LiveChild.Priority))
                        {
                            // Yes, activate it now
                            m_RandomizedChilden    = null; // reshuffle the children
                            mActivationTime        = now;
                            mPendingActivationTime = 0;
                            mPendingCamera         = null;
                            return(best);
                        }
                        return(LiveChild);
                    }
                }
            }
            // Neither active nor pending.
            mPendingActivationTime = 0; // cancel the pending, if any
            mPendingCamera         = null;

            // Can we activate it now?
            if (deltaTime > 0 && mActivationTime > 0)
            {
                if (m_ActivateAfter > 0 ||
                    ((now - mActivationTime) < m_MinDuration &&
                     best.Priority <= LiveChild.Priority))
                {
                    // Too early - make it pending
                    mPendingCamera         = best;
                    mPendingActivationTime = now;
                    return(LiveChild);
                }
            }
            // Activate now
            m_RandomizedChilden = null; // reshuffle the children
            mActivationTime     = now;
            return(best);
        }