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