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