fix:代码提交
This commit is contained in:
261
Assets/Scripts/App/CameraRover.cs
Normal file
261
Assets/Scripts/App/CameraRover.cs
Normal file
@@ -0,0 +1,261 @@
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user