Unity相机巡检工具
1.第一人称巡检工具
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move2 : MonoSingleton <Move2> { public Transform[] points; public float moveSpeed = 2f; public float rotateSpeed = 5f; private Coroutine moveCor; public void StartMove() { if (points == null || points.Length < 2) return; if (moveCor != null) StopCoroutine(moveCor); moveCor = StartCoroutine(MoveLoop()); } public void StopMove() { if (moveCor != null) { StopCoroutine(moveCor); moveCor = null; } } private IEnumerator MoveLoop() { GamerManager.Instance.cameramain.eulerAngles = points[0].eulerAngles; int index = 0; while (true) { Transform from = points[index]; Transform to = points[(index + 1) % points.Length]; float distance = Vector3.Distance(from.position, to.position); float elapsed = 0f; while (elapsed < 1f) { elapsed += Time.deltaTime * moveSpeed / distance; GamerManager.Instance.cameramain.position = Vector3.Lerp(from.position, to.position, elapsed); Quaternion targetRot = Quaternion.LookRotation(to.position - GamerManager.Instance.cameramain.position); GamerManager.Instance.cameramain.rotation = Quaternion.Slerp(GamerManager.Instance.cameramain.rotation, targetRot, Time.deltaTime * rotateSpeed); yield return null; } GamerManager.Instance.cameramain.position = to.position; index = (index + 1) % points.Length; } } }
第三人称巡检工具
脚本挂载到物体上,相机是物体的子物体并调好第三人称的位置(跟随效果)
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class CameraPathRover : MonoSingleton <CameraPathRover> { [Header("路径设置")] public Transform[] pathPoints; // 路径点数组 public float moveSpeed = 5f; // 移动速度 public float rotationSpeed = 2f; // 旋转速度 [Header("状态")] public bool isMoving = true; // 是否正在移动 public Transform lujingPosTrans; //路径点的父物体 private int currentPointIndex = 0; // 当前目标路径点索引 private bool isPaused = false; // 是否暂停 private string loudongPos; void Start() { // 验证路径点 if (pathPoints == null || pathPoints.Length == 0) { //Debug.LogError("没有设置路径点!"); isMoving = false; return; } } /// <summary> /// 自动播放路径点 /// </summary> /// <param name="listspos"></param> public void GetPositionAuto(string name) { this.transform.position = GameManager.Instance.cameraMain.transform.position; GameManager.Instance.CameraAutoManYou(false); loudongPos = name.Split('_')[0].ToString(); Transform tran1 = ToolManager.Instance.GetTransform_(name, lujingPosTrans); if (tran1 == null) return; List<Transform> listspos = new List<Transform>(); for (int i = 0; i < tran1.childCount; i++) { listspos.Add(tran1.GetChild(i)); } pathPoints =listspos.ToArray (); // 将摄像机放置在第一个路径点 transform.localEulerAngles = Vector3.zero; transform.DOMove(pathPoints[0].position, 0.5f).OnComplete(() => { transform.LookAt(pathPoints[1]); }); //transform.position = pathPoints[0].position; //transform.eulerAngles = Vector3.zero; // 如果有下一个点,看向下一个点 if (pathPoints.Length > 1) { transform.LookAt(pathPoints[1]); currentPointIndex = 1; isMoving = true; isPaused = false; } else { isMoving = false; } } void Update() { if (!isMoving || isPaused) return; // 移动到当前目标点 MoveToPoint(pathPoints[currentPointIndex]); // 始终面向当前目标点 LookAtTarget(pathPoints[currentPointIndex]); // 检查是否到达当前目标点 if (HasReachedPoint(pathPoints[currentPointIndex])) { // 移动到下一个点 currentPointIndex++; // 检查是否到达最后一个点 if (currentPointIndex >= pathPoints.Length) { isMoving = false; GameManager.Instance.GetReturnCamera(loudongPos); GameManager.Instance.CameraAutoManYou(true); Debug.Log("已完成所有路径点漫游"); } } } // 移动到指定路径点 void MoveToPoint(Transform targetPoint) { // 移动位置 transform.position = Vector3.MoveTowards( transform.position, targetPoint.position, moveSpeed * Time.deltaTime ); } // 看向目标点 void LookAtTarget(Transform targetPoint) { // 计算朝向目标点的方向 Vector3 direction = targetPoint.position - transform.position; // 只有当方向不为零时才计算旋转 if (direction != Vector3.zero) { // 计算目标旋转 Quaternion targetRotation = Quaternion.LookRotation(direction); // 平滑旋转到目标方向 transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, rotationSpeed * Time.deltaTime ); } } // 检查是否到达指定路径点 bool HasReachedPoint(Transform point) { float distanceThreshold = 0.1f; // 只检查位置距离 return Vector3.Distance(transform.position, point.position) <= distanceThreshold; } // 暂停漫游 public void PauseRover() { isPaused = true; //Debug.Log("漫游已暂停"); } // 继续漫游 public void ResumeRover() { if (isMoving && currentPointIndex < pathPoints.Length) { isPaused = false; //Debug.Log("漫游继续"); } else { //Debug.Log("漫游已完成或未开始,无法继续"); } } // 重新开始漫游 public void RestartRover() { currentPointIndex = 0; transform.position = pathPoints[0].position; if (pathPoints.Length > 1) { transform.LookAt(pathPoints[1]); currentPointIndex = 1; isMoving = true; isPaused = false; } Debug.Log("漫游已重新开始"); } // 在Scene视图中绘制路径(仅在编辑器中使用) void OnDrawGizmos() { if (pathPoints == null || pathPoints.Length == 0) return; // 绘制路径点和连线 Gizmos.color = Color.blue; for (int i = 0; i < pathPoints.Length; i++) { if (pathPoints[i] != null) { // 绘制路径点 Gizmos.DrawSphere(pathPoints[i].position, 0.1f); // 绘制方向指示器 Gizmos.color = Color.red; Gizmos.DrawLine( pathPoints[i].position, pathPoints[i].position + pathPoints[i].forward ); Gizmos.color = Color.blue; // 绘制连线 if (i < pathPoints.Length - 1 && pathPoints[i + 1] != null) { Gizmos.DrawLine(pathPoints[i].position, pathPoints[i + 1].position); } } } } }
有需要会继续补充

浙公网安备 33010602011771号