我正在尝试使instance
的变换位置移动到场景中游戏对象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
,结果是一样的。
将transform.position
替换为instance.transform.position
instance.transform.position = Vector3.MoveTowards
(transform.position, PointCopy.transform.position, 5f * Time.deltaTime);
您正在做的是使用SpawntoLerp
的transform
,因此您永远不会远离该位置,然后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;
}
}
}