Unity 设置固定移动路线

本文介绍了如何利用Unity的Cinemachine组件创建摄像机沿预设路径平滑移动的效果。首先,你需要导入Cinemachine包,并添加移动轨道。然后,在C#脚本`CinemachineMove`中设置移动逻辑,通过`FixedUpdate`或`Update`方法根据选择的更新方式调整摄像机位置。`SetCartPosition`方法用于根据给定的距离在路径上定位并设置摄像机的位置和旋转。此外,提供了两种不同的更新示例,分别基于时间或帧率进行摄像机的移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:Cinemachine是Unity推出的摄像机管理官方解决方案,致力于帮助开发者高效的实现游戏中的相机系统。而Cinemachine中的CinemachineSmoothPath可以用来设计固定路线移动方案。

一、导入Cinemachine包
在这里插入图片描述
可以导入Cinemachine的demo来学习一下
在这里插入图片描述

二、添加移动轨道
在这里插入图片描述
在这里插入图片描述

三、简单的移动逻辑(cube沿设计的路线移动)

using Cinemachine;
using UnityEngine;
using static Cinemachine.CinemachineBrain;
using static Cinemachine.CinemachinePathBase;
using static Cinemachine.CinemachineSmoothPath;

public class CinemachineMove : MonoBehaviour
{
    public GameObject track;
    public Waypoint[] point;

    public CinemachineSmoothPath m_Path;
    public PositionUnits m_type = PositionUnits.Distance;
    public UpdateMethod m_method = UpdateMethod.SmartUpdate;
    public float m_Speed = 5;
    float m_Position = 0;
    
    void Start()
    {
        point = m_Path.m_Waypoints;
    }

    void FixedUpdate()
    {
        if (m_method == UpdateMethod.FixedUpdate)
            SetCartPosition(m_Position + m_Speed * Time.deltaTime);
    }

    void Update()
    {
        float speed = Application.isPlaying ? m_Speed : 0;
        if (m_method == UpdateMethod.SmartUpdate)
            SetCartPosition(m_Position + speed * Time.deltaTime);
    }

    void LateUpdate()
    {
        if (!Application.isPlaying)
            SetCartPosition(m_Position);
        else if (m_method == UpdateMethod.LateUpdate)
            SetCartPosition(m_Position + m_Speed * Time.deltaTime);
    }

    void SetCartPosition(float distanceAlongPath)
    {
        m_Position = m_Path.StandardizeUnit(distanceAlongPath, m_type);
        transform.position = m_Path.EvaluatePositionAtUnit(m_Position, m_type);
        transform.rotation = m_Path.EvaluateOrientationAtUnit(m_Position, m_type);
    }

    //float pos = 0;
    //void Update()
    //{
        //pos += Time.deltaTime;
        if(pos > path.PathLength)
        //{
            //transform.position = m_Path.EvaluatePosition(pos);
            //transform.localEulerAngles = m_Path.EvaluateTangent(pos);
        //}
    //}

    //float time = 0;
    //void Update()
    //{
        //time += Time.deltaTime;
        //if(time >= point.Length)
        //{
        //    time = 0;
        //}

        //int index = Mathf.FloorToInt(time);
        //transform.position = point[index].position;
    //}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值