using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Cinemachine; using Games.Events; using UnityEngine.Playables; public class ControlMove : MonoBehaviour { public float speed; public CinemachineSmoothPath m_paths; public bool UseMainCameraPos = false; public bool NeedBackMainCamera = false; //是否需要回到主摄像机 public GameObject LinkCamera; public CinemachineBrain Brain; public bool UpdateLookAt = true; private CinemachineDollyCart _dolly; private MovieEventSend _EventSend; private void Awake() { _EventSend = GetComponent(); } private void CopyMainCameraData() { if (LinkCamera == null) return; CinemachineVirtualCamera Virtualcamera = LinkCamera.GetComponent(); if (Virtualcamera == null) return; Camera mainCamera = Games.Scene.SceneLogic.CameraController != null ? Games.Scene.SceneLogic.CameraController.MainCamera : Camera.main; if (mainCamera == null) return; if(Brain!=null) { Brain.transform.position = mainCamera.transform.position; Brain.transform.rotation = mainCamera.transform.rotation; Brain.OutputCamera.cullingMask = mainCamera.cullingMask; Brain.OutputCamera.depth = mainCamera.depth + 1; } LinkCamera.transform.position = mainCamera.transform.position; LinkCamera.transform.rotation = mainCamera.transform.rotation; Virtualcamera.m_Lens.FieldOfView = mainCamera.fieldOfView; Virtualcamera.m_Lens.NearClipPlane = mainCamera.nearClipPlane; Virtualcamera.m_Lens.FarClipPlane = mainCamera.farClipPlane; } private void Start() { if (m_paths == null) { m_paths = GetComponent(); } if (m_paths == null || m_paths.m_Waypoints.Length <= 0) return; List points = new List(m_paths.m_Waypoints); CinemachineSmoothPath.Waypoint point = new CinemachineSmoothPath.Waypoint(); if (LinkCamera == null) return; Camera camera = LinkCamera.GetComponent(); Camera mainCamera = Games.Scene.SceneLogic.CameraController != null ? Games.Scene.SceneLogic.CameraController.MainCamera : null; if (camera != null && mainCamera != null) { camera.depth = mainCamera.depth + 1; } if (UseMainCameraPos) { if (mainCamera == null) return; CopyMainCameraData(); point.position = m_paths.transform.InverseTransformPoint(mainCamera.transform.position); } else point.position = m_paths.transform.InverseTransformPoint(LinkCamera.transform.position); points.Insert(0, point); if (NeedBackMainCamera) points.Add(point); m_paths.m_Waypoints = points.ToArray(); _dolly = LinkCamera.gameObject.EnsureComponent(); if (_dolly == null) { return; } _dolly.m_Path = m_paths; _dolly.UpdateLookAt = UpdateLookAt; _dolly.m_Speed = speed; float Time = _dolly.m_Path.PathLength / speed; StopCoroutine(SendEvent(0)); StartCoroutine(SendEvent(Time)); if(transform.parent!=null) { SceneMovie scenMovie = transform.parent.GetComponent(); if (scenMovie != null) scenMovie.AddDurTime(Time); } } IEnumerator SendEvent(float Time) { yield return new WaitForSeconds(Time); if (_EventSend == null) yield break ; _EventSend.Send(true); } }