Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by PixelShiftMember2 · Jun 12, 2017 at 09:10 AM · c#transformif-statementswhile-loop

Why is this script I made crashing unity

I'm simply making a gameobject move at a certain speed then stop and go the other way. But it keeps crashing my unity on compile. So any advice on how to make these of waits and move codes loop in a better fashion.

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class MovingBackground : MonoBehaviour 
 {
     int Set = 1;
 
     void Update() 
     {
         while(Set == 0)
         {
             StartCoroutine(TimerSet1());    
         }
         while(Set == 1)
         {
             StartCoroutine(TimerSet2());
         }
     }
 
     IEnumerator TimerSet1()
     {
         transform.Translate(-1, 0, 0);
         yield return new WaitForSeconds(18);
         Set = 1;
     }
     IEnumerator TimerSet2()
     {
         transform.Translate(+1, 1, 0);
         yield return new WaitForSeconds(15);
         transform.Translate(1, -1, 0);
         yield return new WaitForSeconds(18);
         transform.Translate(-1, -1, 0);
         Set = 0;
     }
 }
 
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

3 Replies

· Add your reply
  • Sort: 
avatar image
2
Best Answer

Answer by ThePunisher · Jun 12, 2017 at 10:32 PM

There's so many things wrong with that setup you have. You'll definitely not want a while loop of any kind in your Update loop. This is just a recipe for disaster. Anything happens to that code that doesn't give the expected result and you will be stuck there indefinitely. You'll also always want to make sure you're not starting coroutines from something that is called in a loop. This is also a recipe for disaster.

It looks to me that you simply want to kick off two different sets of movement that alternate? So TimerSet2 would do its movement thing, then TimerSet1 would do its thing, then back to TimerSet2, right? If so why don't you just start up a coroutine in your Start method that does the following:

 public class MovingBackground : MonoBehaviour
 {
 
     bool m_moveBackground = true;
 
     void Start()
     {
         StartCoroutine(MovementRoutine());
     }
 
     IEnumerator MovementRoutine()
     {
         while (m_moveBackground)
         {
             transform.Translate(-1, 0, 0);
             yield return new WaitForSeconds(18);
             transform.Translate(+1, 1, 0);
             yield return new WaitForSeconds(15);
             transform.Translate(1, -1, 0);
             yield return new WaitForSeconds(18);
             transform.Translate(-1, -1, 0);
             yield return new WaitForSeconds(15);
         }
     }
 }

I don't know exactly what behavior you are looking for, but use this as a template and modify it as you please.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
1

Answer by aguskos · Jun 12, 2017 at 06:34 PM

This happens because Coroutines are async. You can set your "Set" to -1 for example, at the start of your courutins or you can do it like so.

   void Start()
 
     {
         StartCoroutine(TimerSet1());
     }
 
     IEnumerator TimerSet1()
     {
         yield return new WaitForSeconds(1);
         StartCoroutine(TimerSet2());
     }
     IEnumerator TimerSet2()
     {
 
         yield return new WaitForSeconds(1);
         StartCoroutine(TimerSet1());
     }

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
1

Answer by Raimi · Jun 12, 2017 at 07:59 PM

while loops need to yield and return...

 while(true)
 {
      //do something
 
      yield return null;
 
 }

use..

        if(Set == 0)
          {
              StartCoroutine(DoStuff1());    
          }
          else if(Set == 1)
          {
              StartCoroutine(DoStuff2());
          }
 
 IEnumerator DoStuff1()
 {
      //Do stuff
      yield return new WaitForSeconds(3);
      //Do stuff
      yield break;
 }
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

8 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Quaternions acting up 1 Answer

Distribute terrain in zones 3 Answers

Multiple Cars not working 1 Answer

If gameobject moves do this 1 Answer

Change size of an object up to a limit 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges