- Home /
Coroutine crashes game
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.
I am not 100% sure, but it would be more save to use = ins$$anonymous$$d of == Second thing I see is that you probably end up in an enless loop if target.rotation is not left.rotation and not right.rotation. this might cause the freeze. just a guess.
best, Andre
Answer by corewise · Jan 18, 2016 at 10:00 PM
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);
}
}
}
Answer by Jessespike · Jan 18, 2016 at 09:57 PM
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);
}
Your answer
Follow this Question
Related Questions
Make a laser flickering. 1 Answer
Multiple Cars not working 1 Answer
c# Using an IEnumerator yield WaitForSeconds to temporarily pause a While loop 3 Answers
Distribute terrain in zones 3 Answers
Why Won't My Coroutine Yield? 2 Answers