private void UpdateRigCache()
        {
            if (mIsDestroyed)
            {
                return;
            }

            bool isPrefab = false;

#if UNITY_EDITOR
            // Special condition: Did we just get copy/pasted?
            if (m_Rigs != null && m_Rigs.Length == 3 &&
                m_Rigs[0] != null && m_Rigs[0].transform.parent != transform)
            {
                isPrefab = gameObject.scene.name == null; // causes a small GC alloc
                if (!isPrefab)                            // can't paste to a prefab
                {
                    var copyFrom = m_Rigs;
                    DestroyRigs();
                    m_Rigs = CreateRigs(copyFrom);
                }
            }
            for (int i = 0; m_Rigs != null && i < 3; ++i)
            {
                if (m_Rigs[i] != null)
                {
                    CinemachineVirtualCamera.SetFlagsForHiddenChild(m_Rigs[i].gameObject);
                }
            }
#endif

            // Early out if we're up to date
            if (mOrbitals != null && mOrbitals.Length == 3)
            {
                return;
            }

            // Locate existing rigs, and recreate them if any are missing
            isPrefab = gameObject.scene.name == null; // causes a small GC alloc
            if (LocateExistingRigs(RigNames, false) != 3 && !isPrefab)
            {
                DestroyRigs();
                m_Rigs = CreateRigs(null);
                LocateExistingRigs(RigNames, true);
            }

            foreach (var rig in m_Rigs)
            {
                // Configure the UI
                rig.m_ExcludedPropertiesInInspector = m_CommonLens
                    ? new string[] { "m_Script", "Header", "Extensions", "m_Priority", "m_Transitions", "m_Follow", "m_StandbyUpdate", "m_Lens" }
                    : new string[] { "m_Script", "Header", "Extensions", "m_Priority", "m_Transitions", "m_Follow", "m_StandbyUpdate" };
                rig.m_LockStageInInspector = new CinemachineCore.Stage[] { CinemachineCore.Stage.Body };
            }

            // Create the blend objects
            mBlendA = new CinemachineBlend(m_Rigs[1], m_Rigs[0], AnimationCurve.Linear(0, 0, 1, 1), 1, 0);
            mBlendB = new CinemachineBlend(m_Rigs[2], m_Rigs[1], AnimationCurve.Linear(0, 0, 1, 1), 1, 0);
        }
Exemple #2
0
        void PushSettingsToRigs()
        {
            UpdateRigCache();
            for (int i = 0; i < m_Rigs.Length; ++i)
            {
                if (m_Rigs[i] == null)
                {
                    continue;
                }

                if (m_CommonLens)
                {
                    m_Rigs[i].m_Lens = m_Lens;
                }

                // If we just deserialized from a legacy version,
                // pull the orbits and targets from the rigs
                if (mUseLegacyRigDefinitions)
                {
                    mUseLegacyRigDefinitions = false;
                    m_Orbits[i].m_Height     = mOrbitals[i].m_FollowOffset.y;
                    m_Orbits[i].m_Radius     = -mOrbitals[i].m_FollowOffset.z;
                    if (m_Rigs[i].Follow != null)
                    {
                        Follow = m_Rigs[i].Follow;
                    }
                }
                m_Rigs[i].Follow          = null;
                m_Rigs[i].m_StandbyUpdate = m_StandbyUpdate;
                if (!PreviousStateIsValid)
                {
                    m_Rigs[i].PreviousStateIsValid = false;
                    m_Rigs[i].transform.position   = transform.position;
                    m_Rigs[i].transform.rotation   = transform.rotation;
                }
#if UNITY_EDITOR
                // Hide the rigs from prying eyes
                CinemachineVirtualCamera.SetFlagsForHiddenChild(m_Rigs[i].gameObject);
#endif
                if (mOrbitals[i] != null)
                {
                    mOrbitals[i].m_FollowOffset = GetLocalPositionForCameraFromInput(GetYAxisValue());
                    mOrbitals[i].m_BindingMode  = m_BindingMode;
                    mOrbitals[i].m_Heading      = m_Heading;
                    mOrbitals[i].m_XAxis.Value  = m_XAxis.Value;
                }

                // Hack to get SimpleFollow with heterogeneous dampings to work
                if (m_BindingMode == CinemachineTransposer.BindingMode.SimpleFollowWithWorldUp)
                {
                    m_Rigs[i].SetStateRawPosition(State.RawPosition);
                }
            }
        }
Exemple #3
0
        /// <summary>Enforce bounds for fields, when changed in inspector.</summary>
        protected override void OnValidate()
        {
            base.OnValidate();

            // Upgrade after a legacy deserialize
            if (m_LegacyHeadingBias != float.MaxValue)
            {
                m_Heading.m_Bias    = m_LegacyHeadingBias;
                m_LegacyHeadingBias = float.MaxValue;
                int heading = (int)m_Heading.m_Definition;
                if (m_RecenterToTargetHeading.LegacyUpgrade(ref heading, ref m_Heading.m_VelocityFilterStrength))
                {
                    m_Heading.m_Definition = (CinemachineOrbitalTransposer.Heading.HeadingDefinition)heading;
                }
                mUseLegacyRigDefinitions = true;
            }
            if (m_LegacyBlendHint != BlendHint.None)
            {
                m_Transitions.m_BlendHint = m_LegacyBlendHint;
                m_LegacyBlendHint         = BlendHint.None;
            }
            m_YAxis.Validate();
            m_XAxis.Validate();
            m_RecenterToTargetHeading.Validate();
            m_YAxisRecentering.Validate();
            m_Lens.Validate();

            InvalidateRigCache();

#if UNITY_EDITOR
            for (int i = 0; m_Rigs != null && i < 3 && i < m_Rigs.Length; ++i)
            {
                if (m_Rigs[i] != null)
                {
                    CinemachineVirtualCamera.SetFlagsForHiddenChild(m_Rigs[i].gameObject);
                }
            }
#endif
        }
        private int LocateExistingRigs(string[] rigNames, bool forceOrbital)
        {
            mOrbitals = new CinemachineOrbitalTransposer[rigNames.Length];
            m_Rigs    = new CinemachineVirtualCamera[rigNames.Length];
            int rigsFound = 0;

            foreach (Transform child in transform)
            {
                CinemachineVirtualCamera vcam = child.GetComponent <CinemachineVirtualCamera>();
                if (vcam != null)
                {
                    GameObject go = child.gameObject;
                    for (int i = 0; i < rigNames.Length; ++i)
                    {
                        if (mOrbitals[i] == null && go.name == rigNames[i])
                        {
                            // Must have an orbital transposer or it's no good
                            mOrbitals[i] = vcam.GetCinemachineComponent <CinemachineOrbitalTransposer>();
                            if (mOrbitals[i] == null && forceOrbital)
                            {
                                mOrbitals[i] = vcam.AddCinemachineComponent <CinemachineOrbitalTransposer>();
                            }
                            if (mOrbitals[i] != null)
                            {
                                mOrbitals[i].m_HeadingIsSlave = true;
                                if (i == 1)
                                {
                                    mOrbitals[i].HeadingUpdater
                                        = (CinemachineOrbitalTransposer orbital, float deltaTime, Vector3 up)
                                          => { return(orbital.UpdateHeading(deltaTime, up, ref m_XAxis)); }
                                }
                                ;
                                m_Rigs[i] = vcam;
                                m_Rigs[i].m_StandbyUpdate = m_StandbyUpdate;
                                ++rigsFound;
                            }
                        }
                    }
                }
            }
            return(rigsFound);
        }

        void PushSettingsToRigs()
        {
            UpdateRigCache();
            for (int i = 0; i < m_Rigs.Length; ++i)
            {
                if (m_Rigs[i] == null)
                {
                    continue;
                }

                if (m_CommonLens)
                {
                    m_Rigs[i].m_Lens = m_Lens;
                }

                // If we just deserialized from a legacy version,
                // pull the orbits and targets from the rigs
                if (mUseLegacyRigDefinitions)
                {
                    mUseLegacyRigDefinitions = false;
                    m_Orbits[i].m_Height     = mOrbitals[i].m_FollowOffset.y;
                    m_Orbits[i].m_Radius     = -mOrbitals[i].m_FollowOffset.z;
                    if (m_Rigs[i].Follow != null)
                    {
                        Follow = m_Rigs[i].Follow;
                    }
                }
                m_Rigs[i].Follow          = null;
                m_Rigs[i].m_StandbyUpdate = m_StandbyUpdate;
                if (!PreviousStateIsValid)
                {
                    m_Rigs[i].PreviousStateIsValid = false;
                    m_Rigs[i].transform.position   = transform.position;
                    m_Rigs[i].transform.rotation   = transform.rotation;
                }
                // Hide the rigs from prying eyes
                CinemachineVirtualCamera.SetFlagsForHiddenChild(m_Rigs[i].gameObject);

                mOrbitals[i].m_FollowOffset = GetLocalPositionForCameraFromInput(GetYAxisValue());
                mOrbitals[i].m_BindingMode  = m_BindingMode;
                mOrbitals[i].m_Heading      = m_Heading;
                mOrbitals[i].m_XAxis        = m_XAxis;
                mOrbitals[i].m_RecenterToTargetHeading.m_enabled         = (i == 1) ? m_RecenterToTargetHeading.m_enabled : false;
                mOrbitals[i].m_RecenterToTargetHeading.m_WaitTime        = m_RecenterToTargetHeading.m_WaitTime;
                mOrbitals[i].m_RecenterToTargetHeading.m_RecenteringTime = m_RecenterToTargetHeading.m_RecenteringTime;

                // Hack to get SimpleFollow with heterogeneous dampings to work
                if (m_BindingMode == CinemachineTransposer.BindingMode.SimpleFollowWithWorldUp)
                {
                    m_Rigs[i].SetStateRawPosition(State.RawPosition);
                }
            }
        }