我创建了一个脚本,其中对象在循环中的两点 (A) 和 (B) 之间移动。但是点(A)也不断地改变它的transform.position()。如何在读取新点 (A) 值时使对象循环移动?
public float speed = 0.1f;
public Transform PointA;
public Transform PointB;
private Vector3 origin;
private bool backToOrigin;
private bool GoForIt = true;
public float BeginTime = 0;
public int NumberOfCounts = 1000;
private float Counter = 0;
public void Start()
{
transform.position = PointA.transform.position;
origin = transform.position;
}
void Update()
{
if (GoForIt == true && Counter < NumberOfCounts)
{
transform.position = Vector3.MoveTowards(transform.position, backToOrigin ? origin : PointB.transform.position, speed * Time.deltaTime);
if (transform.position == PointB.transform.position || transform.position == origin)
{
backToOrigin = !backToOrigin;
Counter+=0.5f;
}
}
if(Counter>=NumberOfCounts)
{
GoForIt = false;
}
}
Run Code Online (Sandbox Code Playgroud)
您根本不应该使用origin,而是应该使用
...
transform.position = Vector3.MoveTowards(transform.position, backToOrigin ? PointA.transform.position: PointB.transform.position, speed * Time.deltaTime);
if (transform.position == PointB.transform.position || transform.position == PointA.transform.position)
{
...
Run Code Online (Sandbox Code Playgroud)
可能正是 Vector3.Lerp
在两点之间线性插值。
其中第三个参数factor是0和之间的值1
返回的值将在 0 和长度之间来回移动。
public class Example : MonoBehaviour
{
public Transform PointA;
public Transform PointB;
void Update()
{
// Set the position to loop between PointA and PointB
transform.position = Vector3.Lerp(PointA, PointB, Mathf.PingPong(Time.time / speed, 1));
}
}
Run Code Online (Sandbox Code Playgroud)