首页 > 其他分享 >实现平滑移动——路径点法

实现平滑移动——路径点法

时间:2024-09-29 21:22:27浏览次数:3  
标签:index 平滑 路径 transform wayPoints wayPoint position using 点法

想要实现某个对象沿着某条路径进行平滑的移动,可以采用路径点法,大概就是使用transform.translate不断朝着下一个点进行移动,然后营造出平滑的效果。

第一种:在前进的路上放置许多的路标,并且将他们存储在数组里面,然后到达某个点再将下一个点拿出来,然后不断朝着点移动。

接下来是具体例子:

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="4tp9wz8i-1727616343966" src="https://live.csdn.net/v/embed/427537"></iframe>

路径点法

接下来讲解具体的实现方法


在一个父物体下面放了许多的路径点,然后通过代码将他们都放在一个数组里面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WayPoint : MonoBehaviour
{
    public Transform[] wayPoints;
    private void Awake()
    {
        wayPoints = new Transform[transform.childCount];
        for (int i = 0; i < transform.childCount; i++)
        {
            wayPoints[i] = transform.GetChild(i);
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

这个脚本是挂载在WayPoints这个物体上面,然后通过一个for循环将数组都放进去,注意顺序,因为放进去的顺序是从下面第一个子物体开始放入一直到最后一个子物体。

然后,我们设置了一个character,也就是那个大球。

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.Collections;
using UnityEngine;

public class Character : MonoBehaviour
{
    public WayPoint wayPoint;
    private int index=0;
    private float speed = 5f;
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Move();
    }
    private void Move()
    {
        if(index >wayPoint .wayPoints.Length-1 )
        {
            return;
        }
        transform.Translate((wayPoint.wayPoints[index].transform.position - transform.position).normalized * Time.deltaTime * speed);
        if(Vector2 .Distance (wayPoint.wayPoints[index].transform.position , transform.position)<=0.2f)
        {
            index++;
        }
    }    
}

注意是要将脚本在unity的面板上面绑好WayPoint这个脚本,接下来讲解代码,第一个index >wayPoint .wayPoints.Length-1 ,防止超出了数组的范围导致报错。

transform.Translate((wayPoint.wayPoints[index].transform.position - transform.position).normalized * Time.deltaTime * speed);
if(Vector2 .Distance (wayPoint.wayPoints[index].transform.position , transform.position)<=0.2f)
{
    index++;
}

这个就具体讲解了移动的方式,并且在到达下一个点的时候索引增加,这里是计算距离很小的时候就认为已经到达,Vector2 .Distance函数是求两个点的距离。关于translate的移动在之前的文章已经讲解过,不明白可以去查看。

最后就能够实现上面的效果,看起来很简单吧,所以动手试一下吧。

但是看起来感觉不太平滑,所以我们引入更加细致的方法——贝塞尔曲线。大家可以去搜一搜,这个讲解的很多,这里就暂时不做介绍,究其根本就是路径变得特别多,然后显得比较平滑。

标签:index,平滑,路径,transform,wayPoints,wayPoint,position,using,点法
From: https://blog.csdn.net/dailinhan123/article/details/142642826

相关文章

  • 大语言模型实战学习路径:从基础到精通,从入门到精通非常详细
    大语言模型学习路线:从入门到实战在人工智能领域,大语言模型(LargeLanguageModels,LLMs)正迅速成为一个热点话题。本学习路线旨在为有基本Python编程和深度学习基础的学习者提供一个清晰、系统的大模型学习指南,帮助你在这一领域快速成长。本学习路线更新至2024年02月,后期......
  • 如何修改Nuget包的缓存路径
    默认Nuget包的缓存路径是%userprofile%\.nuget\packages,例如C:\Users\Administrator\.nuget\packages。因为这个路径是在C盘下的,所以在使用久了以后,会导致C盘容量骤减。 正常在VisualStudio中引入Nuget包时,会先在缓存文件夹判断,如果存在,就直接复制到项目文件夹下,不存到,就到Nu......
  • 代码随想录算法训练营Day16 | 513.找树左下角的值、112.路径总和、113.路径总和Ⅱ、10
    目录513.找树左下角的值112.路径总和113.路径总和Ⅱ106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历序列构造二叉树513.找树左下角的值题目513.找树左下角的值-力扣(LeetCode)给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假......
  • 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现
    【翻译】实现BlockedFloyd-Warshall用于解决所有对最短路径问题C#实现2024-09-2911:13  沉睡的木木夕 阅读(0) 评论(0)  编辑  收藏  举报介绍在之前的帖子中,我们实现了Floyd-Warshall(弗洛伊德-沃沙尔算法)(四种变体)以及路由重建算法。在这些帖子中,我们探讨......
  • 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现
    介绍在之前的帖子中,我们实现了Floyd-Warshall(弗洛伊德-沃沙尔算法)(四种变体)以及路由重建算法。在这些帖子中,我们探讨了所有对最短路径问题的基本概念、内存中的数据表示、并行性、向量化以及如何将算法调整为适应数据特性。在本帖中,我们将继续我们的旅程,探索一种更高效的方法来解......
  • 【Python脚本】路径管理之pathlib
    在Python的pathlib模块中,Path类和PurePath类是用于处理文件和目录路径的两个主要类.它们具有不同的目的和功能,以下是它们的主要异同点:类的继承关系:Path类继承自PurePath,因此Path类拥有PurePath的所有方法.不同点:PurePath类:纯路径对象:PurePath类及其子类(如Pure......
  • 开题报告-毕设如何选题-计算机视觉项目大集合(图像分类+目标检测+目标跟踪+姿态识别+
    #毕设选题-开题报告-计算机视觉项目大集合计算机视觉项目大集合yolo系列及创新点和应用(测距测速等):改进的yolo目标检测-测距测速图像去雨去雾+目标检测+测距项目交通标志识别项目yolo系列-重磅yolov9界面-最新的yoloyolov8双目测距-yolov8+sgbm(原理+代码)yolov5......
  • Leetcode面试经典150题-64.最小路径和
    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。示例2:输入:grid=[[1......
  • 实数完备性公理的六个推论及证明路径
    在本文中,我尝试利用实数的完备性公理,按照一定路径证明六个经典而深刻的命题,分别是单调有界定理、柯西收敛原理、确界原理、闭区间套定理、极限点原理、和有限覆盖定理,以作为我这个月数分学习的总结。也许未必值得指出,我们学校现行数分教材编排体系出现了一定程度的混乱,其根本原因......
  • GetDeltaSeconds平滑移动避免帧率影响
    使用GetWorld()->GetDeltaSeconds()可以让游戏逻辑与帧率无关,因为它能够动态调整每一帧的计算结果,使其与帧时间成比例。具体来说,DeltaSeconds表示当前帧与上一帧之间经过的时间(以秒为单位),使用它可以让游戏逻辑根据每帧的时间变化而调整,从而保证在不同帧率下效果一致。以下是......