NohanG
1
I have a coroutine set up to rotate a security camera. When I first load up the game everything is fine ,but when the camera comes into view the game freezes. Here’s the script:
using UnityEngine;
using System.Collections;
public class StealthCameras : MonoBehaviour
{
public Transform target;
public Transform right;
public Transform left;
void OnTriggerEnter()
{
Player.player.debugLogsText = "You lost a life! Don't enter the camera's view!";
//Player.player.LostLife();
}
void Start()
{
StartCoroutine(CameraRotation(target, right, left, 0.1f));
}
IEnumerator CameraRotation(Transform target, Transform left, Transform right, float speed)
{
target.rotation = left.rotation;
while (true)
{
if(target.rotation == left.rotation)
{
yield return new WaitForSeconds(5);
target.rotation = Quaternion.Lerp(left.rotation, right.rotation, Time.time * speed);
}
else if(target.rotation == right.rotation)
{
yield return new WaitForSeconds(5);
target.rotation = Quaternion.Lerp(right.rotation, left.rotation, Time.time * speed);
}
}
}
}
Thanks for any help in advance.
You get stuck in an infinite loop as soon as target.rotation != left.rotation and target.rotation != right.rotation. I would do something like this (assuming you want to stop for 5 seconds each time it is about to switch direction):
IEnumerator CameraRotation(Transform target, Transform left, Transform right, float speed)
{
bool wasTurningRight = false;
bool turnRight = true;
target.rotation = left.rotation;
while (true)
{
yield return new WaitForSeconds(0.05f);
if (target.rotation == left.rotation && !turnRight)
{
turnRight = true;
}
else if (target.rotation == right.rotation && turnRight)
{
turnRight = false;
}
if (turnRight)
{
if (!wasTurningRight)
{
wasTurningRight = true;
yield return new WaitForSeconds(5);
}
target.rotation = Quaternion.Lerp(left.rotation, right.rotation, Time.time * speed);
} else {
if (wasTurningRight)
{
wasTurningRight = false;
yield return new WaitForSeconds(5);
}
target.rotation = Quaternion.Lerp(right.rotation, left.rotation, Time.time * speed);
}
}
}
What happens if target.rotation is not equals to left or right? Try adding an else statement to handle that:
else
{
yield return new WaitForSeconds(1);
}