对象未正确向其他对象位置移动 - Vector3.MoveTowards



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

问题:此代码的作用是轻拂instancePointCopy一瞬间,然后返回到其原始位置。如何让它顺利地将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,结果是一样的。

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);
}
}

关于效率的更好解决方案是改用协程,因为一旦达到位置,您就不想再移动了:

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;
}
}
}

最新更新