Объект не движется к другой позиции объекта правильно - Vector3.MoveTowards - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь заставить положение преобразования instance перемещаться в сторону положения преобразования объекта gamebeject PointCopy, который находится в сцене.

Проблема: этот код выполняет щелчок instance в PointCopy на доли секунды, а затем вернитесь в исходное положение.Как заставить его плавно перемещаться instance в направлении PointCopy и оставаться там на месте после того, как он завершит движение?

Вот код, который порождает 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 вверху, результат будет таким же.

1 Ответ

0 голосов
/ 03 июля 2019

Заменить transform.position на instance.transform.position в

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

То, что вы делаете, использует transform из SpawntoLerp, так что вы никогда не будете двигаться дальше от этой позиции, тогда 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;
        }
    }
}
...