对象没有正确地移向其他对象位置 - Vector3.MoveTowards
Object not moving towards other object position correctly - Vector3.MoveTowards
我正在尝试使 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);
}
}
关于效率的更好解决方案是使用 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;
}
}
}
我正在尝试使 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);
}
}
关于效率的更好解决方案是使用 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;
}
}
}