在点之间来回移动 3d 对象

Posted

技术标签:

【中文标题】在点之间来回移动 3d 对象【英文标题】:Moving a 3d object back and forth between points 【发布时间】:2015-07-02 06:10:15 【问题描述】:

我试图制作一个脚本,在两点之间来回移动一个对象。但它只是在无限中飞翔。我整个晚上都试图找出问题所在,但我不知道。 这是代码:

using UnityEngine;

public class MovementBetweenPoints : MonoBehaviour 
    public Transform[] keyPoints;
    public float speed;
    private int currentKeyPoint;


    // Use this for initialization
    void Start () 
    
        transform.position = keyPoints[0].position;
        currentKeyPoint = 1;
    

    // Update is called once per frame
    void Update () 
    

        if (transform.position == keyPoints[currentKeyPoint].position)
        
            currentKeyPoint++;
        

        if (currentKeyPoint >= keyPoints.Length)
        
            currentKeyPoint = 0;
        

        transform.position = Vector3.MoveTowards(transform.position, keyPoints[currentKeyPoint].position, speed * Time.deltaTime);
    

【问题讨论】:

尝试使用Debug.Log 来查看它是否会成为您的keyPoints 之一。 currentKeyPoint 的值会改变吗? 它适用于我的统一,我只是将其插入,确保您在检查器中设置了变换和速度 不要使用相等运算符比较浮点数。使用范围或一些 eplison 值,因为取决于帧速率、速度等,transform.position 永远不会等于当前关键点。 @Heisenbug 这不完全正确,Vector3.MoveTowards 将说明这一点。根据文档,If the target is closer than maxDistanceDelta/ then the returned value will be equal to targetdocs.unity3d.com/ScriptReference/Vector3.MoveTowards.html 但是是的,通常我会同意你的看法。 【参考方案1】:

您的脚本可以正常工作。您需要确保在检查器中将速度设置为大于 0 的值,并且关键点数组也包含检查器中的一些游戏对象,您可以开始了

【讨论】:

【参考方案2】:

我确定问题出在这部分代码中,您可以在其中检查对象的位置在某个航点是否相等。而不是:

if (transform.position == keyPoints[currentKeyPoint].position)

     currentKeyPoint++;

尝试做一些不那么激进的事情,并留出一点余地,例如:

if (Vector3.Distance(transform.position - keyPoints[currentKeyPoint].position) <= min_Distance)

     currentKeyPoint++;

因为速度不同的两个物体几乎不可能在同一点匹配。取而代之的是,您将使用 min_Distance 来检查它。

【讨论】:

以上是关于在点之间来回移动 3d 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Flex 中,如何在 MXML 应用程序文件和 MXML 组件文件之间来回传递 var 对象

使用对象来回旋转 raycast2D

将相机位置移动限制在特定 3D 对象的区域

带有 Unity 3D 的 C#:当用户移动鼠标时,如何使相机围绕对象移动

AR 对象不应随 AR 相机 Vuforia Unity3d 移动

如何通过触摸在屏幕上拖动手指来移动 3D 对象