Files
3d-bianpo/Assets/Scripts/App/CameraRover.cs
2026-03-03 11:30:53 +08:00

262 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<CameraControl>();
cameraCtrl = GetComponent<ControlMove>();
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<List<Transform>> allCameraLists = new List<List<Transform>>
{
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);
}
}