unity 使物体跟随路径点自动移动位置

简介: 在Unity中,物体沿路径点自动移动的核心原理是通过预设路径点,控制物体依次移动。路径点可用空对象或三维向量数组定义,并按顺序存储。移动时,计算当前位置与下一个路径点的向量差以确定方向,使用`Vector3.MoveTowards`逐步靠近目标点。代码实现包括路径点设置、移动控制及插值计算,确保物体平滑移动和旋转。

在 Unity 中实现物体跟随路径点自动移动位置,其核心原理是依据预先设定好的路径点,控制物体按照一定的规则依次在这些点之间移动。下面从路径点设置、移动控制、插值计算等方面详细阐述其原理及实现要点。
路径点设置
定义路径点:需要在场景中确定一系列的路径点,这些点可以用空的游戏对象表示,也可以通过代码直接定义为三维向量数组。每个路径点代表物体移动过程中要经过的一个位置。
路径顺序:为路径点确定一个明确的顺序,物体将按照这个顺序依次移动到各个路径点。可以使用数组或列表来存储路径点,数组或列表的索引顺序即为路径点的顺序。
移动控制
移动方向:物体从当前位置移动到下一个路径点时,需要确定移动的方向。通过计算下一个路径点与当前位置的向量差,即可得到移动方向。例如,设当前位置为 currentPosition,下一个路径点为 nextPosition,则移动方向 direction 可通过以下公式计算:

Vector3 direction = (nextPosition - currentPosition).normalized;

代码如下:

private Transform[] ways1;//路径点的位置
    public Transform  tagret;//移动的物体
    private int index1;

 private void Start()
    {
        ways1 = JieLine.instance.LuJing;
        index1 = 0;
        tagret.transform.gameObject.SetActive(false);
    }
   public void MoveToway1()
    {
        if (index1 > ways1.Length - 1) { return; }
        tagret.localPosition = Vector3.MoveTowards(tagret.localPosition, ways1[index1].localPosition, speed * Time.deltaTime);
        if (Vector3.Distance(ways1[index1].localPosition, tagret.localPosition) < 0.01f)
        {
            index1++;

            if (index1 == ways1.Length)
            {
                tagret.localPosition = ways1[index1 - 1].localPosition;    

            }           
        }
    }

多个位置移动

代码如下:

//多个位置移动的方法
    public void MoveToway1(Transform obj,Transform []way,ref int index1,float speed)
    {
        if (index1 > ways1.Length - 1) { return; }
        obj.localPosition = Vector3.MoveTowards(obj.localPosition, ways1[index1].localPosition, speed * Time.deltaTime);
        if (Vector3.Distance(ways1[index1].localPosition, obj.localPosition) < 0.00001f)
        {
            index1++;

            if (index1 == ways1.Length)
            {
                obj.localPosition = ways1[index1 - 1].localPosition;

            }
        }
    }
    //单个位置移动的方法
    public void MoveToway1(Transform obj,Transform way,float speed)
    {               
        if (Vector3.Distance(way.localPosition, obj.localPosition) > 0.0001f)
        {
            obj.localPosition = Vector3.MoveTowards(obj.localPosition, way.localPosition, speed * Time.deltaTime);
        }
    }
    //物体平滑旋转的 方法
   public void MoveToway1(GameObject obj,Quaternion vector3,float speed)
    {
        obj.transform.localRotation = Quaternion.Slerp(huizhuangang.transform.localRotation,
                     vector3, speed * Time.deltaTime);
    }

最后自行测试即可

相关文章
|
1月前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
1月前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
1月前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
1月前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如&quot;JQR&quot;)以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
1月前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
7月前
|
图形学 C++
小功能⭐️Unity快捷键、路径及常用特性
小功能⭐️Unity快捷键、路径及常用特性
|
7月前
|
图形学
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
|
7月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
7月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
|
7月前
|
图形学
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改