public void ApplyCMDofParam(MotionType type, Vector3 followOffset, Vector3 trackedObjectOffset, float cmFieldOfView, float pitchDamping, float yawDamping, float rollDamping, float screenY) { CMType cmType = CMType.Notset; if (type == MotionType.Dof4) { cmType = CMType.Jet; } else if (type == MotionType.Dof6) { cmType = CMType.JetSpeedUp; } if (cmType != CMType.Notset) { CinemachineVirtualCamera cm = GetCM_VirtualCamera(cmType); CinemachineTransposer bodyComponent = cm.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineTransposer; bodyComponent.m_FollowOffset = followOffset; bodyComponent.m_PitchDamping = pitchDamping; bodyComponent.m_YawDamping = yawDamping; bodyComponent.m_RollDamping = rollDamping; cm.m_Lens.FieldOfView = cmFieldOfView; CinemachineComposer aimComponent = cm.GetCinemachineComponent(CinemachineCore.Stage.Aim) as CinemachineComposer; aimComponent.m_TrackedObjectOffset = trackedObjectOffset; aimComponent.m_ScreenY = screenY; } }
public void SetTrackedObjectOffset(CMType cmType, Vector3 trackedObjectOffset) { CinemachineVirtualCamera cm = GetCM_VirtualCamera(cmType); CinemachineComposer aimComponent = cm.GetCinemachineComponent(CinemachineCore.Stage.Aim) as CinemachineComposer; aimComponent.m_TrackedObjectOffset = trackedObjectOffset; }
private void ApplyCMAxisSetting(CMType cmType , CMAxisSetting.CM axisSetting) { CinemachineFreeLook cm = GetCM_FreeLook(cmType); cm.m_XAxis.m_MaxSpeed = axisSetting.X.MaxSpeed; cm.m_YAxis.m_MaxSpeed = axisSetting.Y.MaxSpeed; }
/// <summary> /// 不是及时生效的,目的是: /// 避免出现同时三个相机在插值 /// 让上一次插值完成后再切换下一个相机 /// </summary> public void RequestChangeCM(CMType cmType) { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Request Change CM {0}" , cmType)); m_ChangingCMs.Enqueue(cmType); }
/// <summary> /// <see cref="RequestChangeCM(CMType)"/> /// </summary> private void DoLateUpdate_ChangeCM(float deltaTime) { m_ChangingCMBlendReaminTime = Mathf.Max(0.0f, m_ChangingCMBlendReaminTime - deltaTime); if (m_ChangingCMBlendReaminTime > 0 || m_ChangingCMs.Count == 0 || CinemachineCore.Instance.BrainCount > 1) { return; } CMType cmType = m_ChangingCMs.Dequeue(); if (m_LastCMType == cmType) { Leyoutech.Utility.DebugUtility.LogWarning(CameraManager.LOG_TAG, "Repeat change CM to " + cmType); return; } if (!m_MainCMBrain.enabled) { m_MainCMBrain.enabled = true; } CinemachineBlendDefinition cinemachineBlendDefinition = m_MainCMBrain.m_CustomBlends.GetBlendForVirtualCameras(m_LastCMType.ToString(), cmType.ToString(), m_MainCMBrain.m_DefaultBlend); Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Change CM form {0} to {1} use blend definition Style:{2} Time:{3}" , m_LastCMType , cmType , cinemachineBlendDefinition.m_Style , cinemachineBlendDefinition.m_Time)); try { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG, "Begin invoke CM Changed"); _OnCMChanged?.Invoke(m_LastCMType, cmType); Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG, "End invoke CM Changed"); } catch (Exception e) { Leyoutech.Utility.DebugUtility.LogError(CameraManager.LOG_TAG, "Invoke CM Changed Exception:\n" + e.ToString()); } m_ChangingCMBlendReaminTime = cinemachineBlendDefinition.m_Time; TransitionBlendDefinition transitionBlendDefinition = m_MainCameraTransitionBlenderSettings.FindBlend(m_LastCMType.ToString(), cmType.ToString()); m_CMs[(int)cmType].ApplyTransitionBlendDefinition(transitionBlendDefinition); m_CMs[(int)cmType].SetEnable(true); if (m_LastCMType != CMType.Notset) { m_CMs[(int)m_LastCMType].SetEnable(false); } m_LastCMType = cmType; }
/// <summary> /// 强制切换机位 /// 某些特殊情况下使用,可能会出现莫名其妙的问题 /// </summary> public void ForceChangeCM(CMType cmType) { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Force Change CM {0}" , cmType)); m_ChangingCMs.Clear(); m_ChangingCMs.Enqueue(cmType); m_ChangingCMBlendReaminTime = 0.0f; DoLateUpdate_ChangeCM(1.0f / 60.0f); }
/// <summary> /// 只有这个<see cref="CinemachineFreeLook"/>能用 /// </summary> public void SetCMFreeLookAxisMaxSpeed(CMType cmType, float maxSpeedX, float maxSpeedY) { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Set CM({0}) AxisMaxSpeed:({1:F2}, {2:F2})" , cmType , maxSpeedX , maxSpeedY)); CinemachineFreeLook cm = GetCM_FreeLook(cmType); cm.m_XAxis.m_MaxSpeed = maxSpeedX; cm.m_YAxis.m_MaxSpeed = maxSpeedY; }
/// <summary> /// 只有这个<see cref="CinemachineFreeLook"/>能用 /// </summary> public void SetCMFreeLookAxisValue(CMType cmType, float valueX, float valueY) { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Set CM({0}) AxisValue:({1:F2}, {2:F2})" , cmType , valueX , valueY)); CinemachineFreeLook cm = GetCM_FreeLook(cmType); cm.m_XAxis.Value = valueX; cm.m_YAxis.Value = valueY; }
public void SetLookAt(CMType cmType, Transform lookAt) { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Set CM({0}) LookAt:({1})" , cmType , lookAt != null ? lookAt.name : "None")); CinemachineVirtualCameraBase cm = GetCM_VirtualCameraBase(cmType); cm.LookAt = lookAt; }
/// <summary> /// 应用VirtualCamera的相机参数 /// TODO 目前所有<see cref="CinemachineVirtualCamera"/>的<see cref="CinemachineCore.Stage.Body"/>都是<see cref="CinemachineTransposer"/>。如果以后不是这样,就要修改这里的逻辑 /// </summary> private void ApplyCMParame_VirtualCamera(CMType cmType , float cmBodyFollowOffsetX , float cmBodyFollowOffsetY , float cmBodyFollowOffsetZ , float cmFieldOfView) { CinemachineVirtualCamera cm = GetCM_VirtualCamera(cmType); CinemachineTransposer bodyComponent = cm.GetCinemachineComponent(CinemachineCore.Stage.Body) as CinemachineTransposer; bodyComponent.m_FollowOffset = new Vector3(cmBodyFollowOffsetX , cmBodyFollowOffsetY , cmBodyFollowOffsetZ); cm.m_Lens.FieldOfView = cmFieldOfView; }
/// <summary> /// 应用FreeLook的相机参数 /// </summary> private void ApplyCMParame_FreeLook(CMType cmType , float cmTopRigHeight , float cmTopRigRadius , float cmMiddleRigHeight , float cmMiddleRigRadius , float cmBottomRigHeight , float cmBottomRigRadius , float cmFieldOfView) { CinemachineFreeLook cm = GetCM_FreeLook(cmType); cm.m_Orbits[0] = new CinemachineFreeLook.Orbit(cmTopRigHeight, cmTopRigRadius); cm.m_Orbits[1] = new CinemachineFreeLook.Orbit(cmMiddleRigHeight, cmMiddleRigRadius); cm.m_Orbits[2] = new CinemachineFreeLook.Orbit(cmBottomRigHeight, cmBottomRigRadius); cm.m_Lens.FieldOfView = cmFieldOfView; }
public override void Initialize() { base.Initialize(); m_UpdateProperties = UpdatePropertyFlag.HalfTanFov | UpdatePropertyFlag.Transform; m_MainCMBrain = gameObject.GetComponent <CinemachineBrain>(); m_PostProcessLayer = gameObject.GetComponent <PostProcessLayer>(); m_HXVCamera = gameObject.GetComponent <HxVolumetricCamera>(); m_LastCMType = CMType.Notset; m_CMs = new CMData[(int)CMType.Count]; Transform cmRoot = transform.parent; for (int iCM = 0; iCM < m_CMs.Length; iCM++) { CMData cmData = new CMData(cmRoot.Find(CM_GAMEOBJECT_NAME_STARTWITHS + ((CMType)iCM).ToString()) .GetComponent <CinemachineVirtualCameraBase>() , (CMType)iCM); m_CMs[iCM] = cmData; } #if UNITY_EDITOR // 预览场景时,不需要读表里的相机参数,也不需要切换手柄鼠标 if (!CameraManager._s_IsRoaming) #endif { GamingConfig gamingConfig = ((CfgEternityProxy)GameFacade.Instance.RetrieveProxy(ProxyName.CfgEternityProxy)).GetGamingConfig(1).Value; m_CM_Character_AxisSetting = new CMAxisSetting(new CMAxisSetting.CM(new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.XaxisMaxSpeedMouse) , new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.YaxisMaxSpeedMouse)) , new CMAxisSetting.CM(new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.XaxisMaxSpeedGamepad) , new CMAxisSetting.Axis(gamingConfig.CmCharacter.Value.YaxisMaxSpeedGamepad))); InputManager.Instance.OnInputDeviceChanged += OnInputDeviceChanged; } m_ChangingCMs = new Queue <CMType>(); m_ChangingCMBlendReaminTime = 0; m_CameraRenderer = new CRenderer.MainCameraRenderer(); m_CameraRenderer.Initialize(GetCameraName(), m_Camera, m_CameraRendererResource); _ForDebug.GUIEnable = new bool[(int)GUIType.Count]; TrackCaptureManager.GetInstance().InitializeCapturer("Main Camera", this).StartCapture(); }
public void SetFarClipPlane(CMType cmType, float far) { CMData cm = m_CMs[(int)cmType]; switch (cm.GetCMCameraType()) { case CMCameraType.FreeLook: cm.GetCM_FreeLook().m_Lens.FarClipPlane = far; break; case CMCameraType.VirtualCamera: cm.GetCM_VirtualCamera().m_Lens.FarClipPlane = far; break; default: Leyoutech.Utility.DebugUtility.Assert(false, CameraManager.LOG_TAG, $"Not support CameraType({cm.GetCMCameraType()})"); break; } }
/// <summary> /// 只有这个<see cref="CinemachineFreeLook"/>能用 /// </summary> public void SetFollowAndLookAtCMFreeLookAxisValue(CMType cmType, Transform follow, Transform lookAt, float valueX, float valueY) { Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Set CM({0}) Follow:({1}) LookAt:({2}) AxisValue:({3:F2}, {4:F2})" , cmType , follow != null ? follow.name : "None" , lookAt != null ? lookAt.name : "None" , valueX , valueY)); CinemachineFreeLook cm = GetCM_FreeLook(cmType); cm.Follow = follow; cm.LookAt = lookAt; cm.m_XAxis.Value = valueX; cm.m_YAxis.Value = valueY; }
public CMData(CinemachineVirtualCameraBase cm, CMType cmType) { m_CM_VirtualCameraBase = cm; m_CMType = cmType; m_CM_VirtualCamera = null; m_CM_FreeLook = null; if (m_CM_VirtualCameraBase is CinemachineVirtualCamera) { m_CMCameraType = CMCameraType.VirtualCamera; m_CM_VirtualCamera = m_CM_VirtualCameraBase as CinemachineVirtualCamera; } else if (m_CM_VirtualCameraBase is CinemachineFreeLook) { m_CMCameraType = CMCameraType.FreeLook; m_CM_FreeLook = m_CM_VirtualCameraBase as CinemachineFreeLook; } else { m_CMCameraType = CMCameraType.Unknown; Leyoutech.Utility.DebugUtility.Assert(false , CameraManager.LOG_TAG , string.Format("Not support CMCameraType({0}) in CMType({1})" , m_CM_VirtualCameraBase.GetType() , m_CMType) , cm); } Leyoutech.Utility.DebugUtility.Log(CameraManager.LOG_TAG , string.Format("Initialized CM CMType({0}) CMCameraType({1})" , m_CMType , m_CMCameraType) , cm); SetEnable(false); }
private void DoGUICM(Config config) { config.BeginToolbarHorizontal(); if (config.ToolbarButton(m_MainCMBrain.enabled, "Brain")) { m_MainCMBrain.enabled = !m_MainCMBrain.enabled; } for (int iCM = 0; iCM < m_CMs.Length; iCM++) { CMType cmType = (CMType)iCM; if (config.ToolbarButton(m_CMs[iCM].IsLive(), cmType.ToString())) { RequestChangeCM(cmType); } } config.EndHorizontal(); if (!_ForDebug.DisplayDetail) { return; } for (int iCM = 0; iCM < m_CMs.Length; iCM++) { if (!m_CMs[iCM].IsLive()) { continue; } CinemachineVirtualCameraBase iterCM = m_CMs[iCM].GetCM_VirtualCameraBase(); GUILayout.Label(((CMType)iCM).ToString() , (int)m_LastCMType == iCM ? config.ImportantLabelStyle : config.LabelStyle); GUILayout.Box(string.Format("Priority:{0} Follow:({1}) LookAt:({2})" , iterCM.Priority , iterCM.Follow != null ? iterCM.Follow.name : "None" , iterCM.LookAt != null ? iterCM.LookAt.name : "None") , config.BoxStyle); TransitionBlendDefinition transitionBlendDefinition = m_CMs[iCM].GetTransitionBlendDefinition(); GUILayout.Box(string.Format("Transition: BlendHint({0}) InheritPosition({1})" , transitionBlendDefinition.BlendHint , transitionBlendDefinition.InheritPosition) , config.BoxStyle); if (iterCM.Follow) { Vector3 cameraToFollow = iterCM.Follow.position - GetCamera().transform.position; GUILayout.Box(string.Format("To Follow Distance:{0:F2} - Height:{1:F2} - Horizontal:{2:F2}" , cameraToFollow.magnitude , cameraToFollow.y , new Vector2(cameraToFollow.x, cameraToFollow.z).magnitude) , config.BoxStyle); } if (iterCM is CinemachineFreeLook) { CinemachineFreeLook iterFreeLookCM = iterCM as CinemachineFreeLook; GUILayout.Box(string.Format("Axis: Value({0}) MaxSpeed({1})" , new Vector2(iterFreeLookCM.m_XAxis.Value, iterFreeLookCM.m_YAxis.Value) , new Vector2(iterFreeLookCM.m_XAxis.m_MaxSpeed, iterFreeLookCM.m_YAxis.m_MaxSpeed)) , config.BoxStyle); } } }
public CommunicateReturnVO(CMType type) : base(type) { }
public CinemachineFreeLook GetCM_FreeLook(CMType cmType) { return(m_CMs[(int)cmType].GetCM_FreeLook()); }
public CinemachineVirtualCamera GetCM_VirtualCamera(CMType cmType) { return(m_CMs[(int)cmType].GetCM_VirtualCamera()); }
public CommunicateVO(CMType cmType) { this.cmType = cmType; this.uuid = Guid.NewGuid().ToString(); }
/// <summary> /// 只有这个<see cref="CinemachineFreeLook"/>能用 /// </summary> public Vector2 GetCMFreeLookAxisMaxSpeed(CMType cmType) { CinemachineFreeLook cm = GetCM_FreeLook(cmType); return(new Vector2(cm.m_XAxis.m_MaxSpeed, cm.m_YAxis.m_MaxSpeed)); }
public CommunicateVO(CMType cmType) { this.cmType = cmType; }
/// <summary> /// cmType是否再请求切换的队列里 /// </summary> public bool HasInChanngingCMs(CMType cmType) { return(m_ChangingCMs.Contains(cmType)); }