对象没有正确地移向其他对象位置 - Vector3.MoveTowards

Object not moving towards other object position correctly - Vector3.MoveTowards

我正在尝试使 instance 的变换位置移向场景中游戏对象 PointCopy 的变换位置。

问题:这段代码的作用是瞬间将 instance 轻弹到 PointCopy,然后回到原来的位置。如何让它平稳地移动 instancePointCopy 位置并在完成移动后留在原地?

这是生成 instance 的代码。它被放置在名为 'SpawnToLerp'.

的场景中的一个空游戏对象上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawntoLerp : MonoBehaviour
{
    public GameObject CubePrefab;
    public GameObject instance;
    public PointCopy PointCopy; //i want to move instance position to PointCopy position


    void Start()
    {
      instance = Instantiate(CubePrefab, transform.position, transform.rotation) as GameObject;
    }


    void Update()
    {
        instance.transform.position = Vector3.MoveTowards
        (transform.position, PointCopy.transform.position, 5f * Time.deltaTime);
    }
}

PointCopy 的代码为空白或默认。 我发现如果我把代码public Transform transform;放在最上面的PointCopy.cs里面,结果是一样的

中将transform.position替换为instance.transform.position
 instance.transform.position = Vector3.MoveTowards
    (transform.position, PointCopy.transform.position, 5f * Time.deltaTime);

你正在做的是使用 SpawntoLerptransform 所以你永远不会离开那个位置然后 5f * Time.deltaTime.

相反,您想从 instance

的当前位置继续前进
instance.transform.position = Vector3.MoveTowards
    (instance.transform.position, PointCopy.transform.position, 5f * Time.deltaTime);

然后你可以再次使用一个简单的 public Transform 比如

public class SpawntoLerp : MonoBehaviour
{
    // you can use any Component as field
    // and Unity will automatically take the according reference
    // from the GameObject you drag in
    public Transform CubePrefab;
    public Transform instance;

    // Do not call it transform as this property already exists in MonoBehaviour
    public Transform PointCopy;

    private void Start()
    {
        // instantiate automatically returns the same type
        // as the given prefab
        instance = Instantiate(CubePrefab, transform.position, transform.rotation);
    }

    private void Update()
    {
        instance.position = Vector3.MoveTowards(instance.position, PointCopy.position, 5f * Time.deltaTime);
    }
}

关于效率的更好解决方案是使用 Coroutine 代替,因为一旦到达该位置,您就不想再移动了:

public class SpawntoLerp : MonoBehaviour
{
    public Transform CubePrefab;
    public Transform PointCopy;

    private void Start()
    {
        StartCoroutine(SpawnAndMove(CubePrefab, PointCopy.position));
    }

    private IEnumerator SpawnAndMove(GameObject prefab, Vector3 targetPosition)
    {
        Transform instance = Instantiate(CubePrefab, transform.position, transform.rotation);

        while(Vector3.Distance(instance.position, targetPosition) > 0)
        {
            instance.position = Vector3.MoveTowards(instance.position, targetPosition, 5f * Time.deltaTime);

            // "Pause" the routine, render this frame and 
            // continue from here in the next frame
            yield return null;
        }
    }
}