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

 

有需要会继续补充

 

posted @ 2026-05-28 11:47  剑起苍穹  阅读(9)  评论(0)    收藏  举报
/*鼠标点击特效*/