就像移动游戏对象一样,您可以使用Mathf.PingPong
将游戏对象来回旋转。这就是它的用途。它将返回介于0和1之间的值。您可以将该值传递给Vector3.Lerp
并生成所需执行旋转的eulerAngle。
这也可以用协程完成,但如果您不需要知道何时到达目标,则应使用Mathf.PingPong
。如果您想知道何时到达旋转目标,则应使用协程。
public float speed = 0.36f;
Vector3 pointA;
Vector3 pointB;
void Start()
{
pointA = transform.eulerAngles + new Vector3(0f, 90f, 0f);
pointB = transform.eulerAngles + new Vector3(0f, -90f, 0f);
}
void Update()
{
float time = Mathf.PingPong(Time.time * speed, 1);
transform.eulerAngles = Vector3.Lerp(pointA, pointB, time);
}
编辑:
使用协程方法,您可以确定每个轮换的结束。
public GameObject objectToRotate;
public float speed = 0.36f;
Vector3 pointA;
Vector3 pointB;
void Start()
{
pointA = transform.eulerAngles + new Vector3(0f, 90f, 0f);
pointB = transform.eulerAngles + new Vector3(0f, -90f, 0f);
objectToRotate = this.gameObject;
StartCoroutine(rotate());
}
IEnumerator rotate()
{
while (true)
{
yield return rotateObject(objectToRotate, pointA, 3f);
yield return rotateObject(objectToRotate, pointB, 3f);
}
}
bool rotating = false;
IEnumerator rotateObject(GameObject gameObjectToMove, Vector3 eulerAngles, float duration)
{
if (rotating)
{
yield break;
}
rotating = true;
Vector3 newRot = gameObjectToMove.transform.eulerAngles + eulerAngles;
Vector3 currentRot = gameObjectToMove.transform.eulerAngles;
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
gameObjectToMove.transform.eulerAngles = Vector3.Lerp(currentRot, newRot, counter / duration);
yield return null;
}
rotating = false;
}
>= 270
,所以继续旋转,使旋转为0,然后您的代码说:现在它是<= 90
,所以向后旋转,使其再次变为360,依此类推。 - Hristo