262 lines
6.3 KiB
C#
262 lines
6.3 KiB
C#
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);
|
||
}
|
||
|
||
|
||
}
|
||
|