- 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
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                