fix:代码提交

This commit is contained in:
zhangjiajia
2026-03-03 11:30:53 +08:00
parent adf60cc8df
commit 21ebd4c951
2520 changed files with 178964 additions and 0 deletions

View 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);
}
}