using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.SceneManagement; using UnityEngine.EventSystems; using UnityEngine.AI; using System.Linq; public class CameraRover : ActionBase { private CameraControl cameraCtr2; private ControlMove cameraCtrl; private Vector3 targetPos = Vector3.zero; //视角坐标 private bool isLookAt = false; //视角是否朝向目标 private string currentAnim = ""; // 私有变量,用于存储飞行完成状态 private bool _isFlightCompleted = false; // 公共属性,用于获取飞行完成状态 public bool isFlightCompleted { get { return _isFlightCompleted; } } // 公共方法,用于修改飞行完成状态 public void SetFlightCompleted(bool value) { _isFlightCompleted = value; } public LayerMask obstacleLayer; // 障碍物层 public override void Init() { cameraCtr2 = GetComponent(); cameraCtrl = GetComponent(); currentAnim = ""; isLookAt = false; } public override void RegisterAction() { GameEvent.OpenPage += OpenPage; GameEvent.StartCameraControl += StartCameraCtrl; GameEvent.StopCameraControl += StopCameraCtrl; } public override void RemoveAction() { GameEvent.OpenPage -= OpenPage; GameEvent.StartCameraControl -= StartCameraCtrl; GameEvent.StopCameraControl -= StopCameraCtrl; } void LateUpdate() { if (isLookAt) { transform.LookAt(targetPos); } } void OpenPage(PageType type) { switch (type) { case PageType.Camera1: CameraBreak(); StartCoroutine("CameraAnim_1"); break; case PageType.Camera2: CameraBreak(); StartCoroutine("CameraAnim_2"); break; } } void StartCameraCtrl() { cameraCtr2.StartCameraControl(); } void StopCameraCtrl() { cameraCtr2.StopCameraControl(); } public void SetTargetPosition(Vector3 position) { cameraCtrl.GetInScriptCore(position); } //打断当前相机操作 void CameraBreak() { StopCoroutine(currentAnim); isLookAt = false; transform.DOKill(); } //相机点位-1 IEnumerator CameraAnim_1() { currentAnim = "CameraAnim_1"; StopCameraCtrl(); cameraCtrl.GetInScriptCore(); yield return new WaitForEndOfFrame(); transform.DOMove(new Vector3(1828.729f, 158.0276f, 635.7281f), 2f); transform.DORotate(new Vector3(29.401f, -22.4f, 0f), 2f); yield return new WaitForSeconds(2f); StartCameraCtrl(); } //相机点位-2 IEnumerator CameraAnim_2() { currentAnim = "CameraAnim_2"; StopCameraCtrl(); cameraCtrl.GetInScriptCore(new Vector3(1520.754f, 39.87501f, 1493.384f)); yield return new WaitForEndOfFrame(); transform.DOMove(new Vector3(1522.37f, 61f, 1520f), 2f); transform.DORotate(new Vector3(30f, -179f, 0f), 2f); yield return new WaitForSeconds(2f); StartCameraCtrl(); } Vector3[] GetRoundPath(Vector3 pos, Vector3 pivot) { Vector3[] path = new Vector3[10]; Vector3 dir = pos - pivot; for (int i = 0; i < 10; i++) { Vector3 rotatedDir = Quaternion.AngleAxis(40f * i, Vector3.up) * dir; path[i] = pivot + rotatedDir; } return path; } // 暴露给 JavaScript 的静态方法 public void CallOpenPage(int typeIndex) { PageType pageType = (PageType)typeIndex; ActionCenter.Instance.DoAction(GameEvent.OpenPage, pageType); } public void WebCallOpenItem(string objectName) { Debug.Log("WebCallOpenItem: " + objectName); // 定义要搜索的所有相机图标列表 List> allCameraLists = new List> { AppCache.iconCameraList01, AppCache.iconCameraList02, AppCache.iconCameraList03, AppCache.iconCameraList04 }; // 在所有列表中查找具有指定名称的 Transform Transform foundTransform = null; foreach (var cameraList in allCameraLists) { if (cameraList == null) continue; // 查找匹配名称的 Transform foundTransform = cameraList.Find(transform => transform != null && transform.name == objectName); if (foundTransform != null) break; } // 如果找到对应的 Transform,则执行飞行逻辑 if (foundTransform != null) { StartCoroutine(flyItem(foundTransform)); } else { Debug.LogWarning($"未找到名称为 '{objectName}' 的相机图标!"); } } // 公共协程方法 - 处理相机移动的核心逻辑(带自动避障) private IEnumerator MoveCameraCore(Transform targetTransform, string animName) { currentAnim = animName; StopCameraCtrl(); yield return new WaitForEndOfFrame(); Vector3 targetPosition = targetTransform.position; Vector3 targetRotation = targetTransform.eulerAngles; float distance = Vector3.Distance(transform.position, targetPosition); float speed = 5f; float flightTime = distance / speed; float maxFlightTime = 2f; flightTime = Mathf.Max(flightTime, 0.1f); flightTime = Mathf.Min(flightTime, maxFlightTime); RaycastHit hit; // 射线检测是否有障碍物 if (Physics.Raycast(transform.position, targetPosition - transform.position, out hit, distance, obstacleLayer)) { // 有障碍物 Debug.Log("有障碍物,使用绕行路径"); Vector3 stopPosition = hit.point - (targetPosition - transform.position).normalized * 0.1f; float stopDistance = Vector3.Distance(transform.position, stopPosition); float stopFlightTime = stopDistance / speed; stopFlightTime = Mathf.Max(stopFlightTime, 0.1f); stopFlightTime = Mathf.Min(stopFlightTime, maxFlightTime); transform.DOMove(stopPosition, stopFlightTime); transform.DORotate(Quaternion.LookRotation(targetPosition - transform.position).eulerAngles, stopFlightTime); yield return new WaitForSeconds(stopFlightTime); transform.position = targetPosition; transform.DORotate(targetRotation, stopFlightTime); transform.DOMove(targetPosition, flightTime); transform.DORotate(targetRotation, flightTime); } else { // 无障碍物 transform.DOMove(targetPosition, flightTime); transform.DORotate(targetRotation, flightTime); } yield return new WaitForSeconds(flightTime); StartCameraCtrl(); } public IEnumerator flyItem(Transform targetTransform) { return MoveCameraCore(targetTransform, "CameraAnim_4"); } public IEnumerator CallOpenItem(Transform targetTransform) { SetFlightCompleted(false); // 执行公共相机移动逻辑 yield return StartCoroutine(MoveCameraCore(targetTransform, "CameraAnim_3")); SetFlightCompleted(true); } }