Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 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 /
  • Help Room /
avatar image
0
Question by Bradx · Oct 02, 2021 at 12:50 PM · c#loopfor-loopiterate

,Code in loop simultaneously executing on members of array rather than iterating one at a time

I'm making a little boxing game. I designed a function to accept a whole slew of arguments and then cause the enemy boxer to make attacks based on the data fed into the function. I have another class which sets a bunch of variables and then I read those values, assign them to local variables, and then run my function. Thing is that the code in my loop is executing on all members of the array instead of iterating over them one at a time, resulting in the enemy throwing many attacks at once that were intended to be thrown in sequence.

I'm going nuts, tried all the different types of iterators and got nowhere. I'm new to C#, no idea what I've done wrong here. The function that sets the variables in the other script is at the bottom of the code block.

 using UnityEngine;
 using System.Text.RegularExpressions;
 
 public class overdrivePiano : MonoBehaviour
 {
     private GameObject enemyBoxer;
     private pianoRoll theRoll;
     private string theCoordMod;
     private string[] thePatterns;
     private int howMany;
     private float thePunchDelay, thePatternDelay, theCoordModAmount, punchDelayTimer, patternDelayTimer;
     private Vector2[] theCoords;
 
     void Start()
     {
         enemyBoxer= GameObject.Find("enemyBoxer");
         theRoll = gameObject.GetComponent<pianoRoll>();
         punchDelayTimer = 0;
     }
 
     private void readRoll()
     {
         thePatterns = theRoll.patterns;
         thePunchDelay = theRoll.punchDelay;
         thePatternDelay = theRoll.patternDelay;
         theCoords = theRoll.coords;
         theCoordMod = theRoll.coordMod;
         theCoordModAmount = theRoll.modAmount;
     }
 
     public void onSwitch()
     {
         theRoll.SendMessage("firstVerse");
         readRoll();
         attackOverdrive(thePatterns, thePunchDelay, thePatternDelay, theCoords);
     }
 
     public void attackOverdrive(string[] patterns, float punchDelay, float patternDelay, Vector2[] coords, string coordMod = "none", float modAmount = 0)
     {
         for(int i = 0; i < patterns.Length; i++)
         {
             if (patterns[i] == "triangle")
             {
                 int j = 0;
                 Vector2[] triangleVectors = new Vector2[] {new Vector2(coords[i].x, coords[i].y + 0.75f), new Vector2(coords[i].x - 0.75f, coords[i].y - 0.75f), new Vector2(coords[i].x + 0.75f, coords[i].y - 0.75f)};
                 do
                 {
                     if (punchDelayTimer <= punchDelay)
                     {
                         punchDelayTimer += Time.deltaTime;
                     }
                     else
                     {
                         enemyBoxer.SendMessage("createAttack", triangleVectors[j]);
                         punchDelayTimer = 0;
                         j += 1;
                     }
                 } while (j < 3);
             }
             else if (patterns[i] == "square")
             {
                 
             }
             else if (patterns[i] == "circle")
             {
                 
             }
             else if ("verticalLine".CompareTo(patterns[i]) == -1)
             {
                
                 var result = Regex.Match(patterns[i], @"\d+$", RegexOptions.RightToLeft);
                 if (result.Success) 
                 { 
                     //Debug.Log(result.Value);
                 } 
             }
         }
     }
 }


 private void firstVerse()
     {
         patterns = new string[] {"triangle", "triangle", "triangle", "singleRandom", "singleRandom", "verticalLine5"};
         coords = new Vector2[] {new Vector2(-1.3f, 2.5f), new Vector2(0f, -2.5f), new Vector2(1.3f, 2.5f), new Vector2(0,0), new Vector2(0,0), new Vector2(0, 4f)};
         punchDelay = 0.5f;
         patternDelay = 0.5f;
     }

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

1 Reply

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

Answer by rage_co · Oct 01, 2021 at 11:20 AM

The loop is iterating through the array normally and one by one.....its just that all of this happens in a single frame....and since you are using a float based timer, it requires more than a single frame to work and the function will have to be called over and over, resetting the loop.....and creating new instances etc...it can be tackled with a while loop in a coroutine...or simply a waitforseconds command using coroutines

  using UnityEngine;
  using System.Text.RegularExpressions;
  
  public class overdrivePiano : MonoBehaviour
  {
      private GameObject enemyBoxer;
      private pianoRoll theRoll;
      private string theCoordMod;
      private string[] thePatterns;
      private int howMany;
      private float triangleTime = 2f;
      private float squareTime = 2f;
      private float circleTime = 2f;
      private float thePunchDelay, thePatternDelay, theCoordModAmount, punchDelayTimer, patternDelayTimer;
      private Vector2[] theCoords;
  
      void Start()
      {
          enemyBoxer= GameObject.Find("enemyBoxer");
          theRoll = gameObject.GetComponent<pianoRoll>();
          punchDelayTimer = 0;
      }
  
      private void readRoll()
      {
          thePatterns = theRoll.patterns;
          thePunchDelay = theRoll.punchDelay;
          thePatternDelay = theRoll.patternDelay;
          theCoords = theRoll.coords;
          theCoordMod = theRoll.coordMod;
          theCoordModAmount = theRoll.modAmount;
      }
  
      public void onSwitch()
      {
          theRoll.SendMessage("firstVerse");
          readRoll();
          StartCoroutine(attackOverdrive(thePatterns, thePunchDelay, thePatternDelay, theCoords)):
      }
  
      public IEnumerator attackOverdrive(string[] patterns, float punchDelay, float patternDelay, Vector2[] coords, string coordMod = "none", float modAmount = 0)
      {
          for(int i = 0; i < patterns.Length; i++)
          {
              if (patterns[i] == "triangle")
              {
                  int j = 0;
                  Vector2[] triangleVectors = new Vector2[] {new Vector2(coords[i].x, coords[i].y + 0.75f), new Vector2(coords[i].x - 0.75f, coords[i].y - 0.75f), new Vector2(coords[i].x + 0.75f, coords[i].y - 0.75f)};
                  do
                  {
                        yield return new WaitForSeconds(triangleTime):
                        enemyBoxer.SendMessage("createAttack", triangleVectors[j]);
                        punchDelayTimer = 0;
                        j += 1;
                  }
              }
              else if (patterns[i] == "square")
              {
                  
              }
              else if (patterns[i] == "circle")
              {
                  
              }
              else if ("verticalLine".CompareTo(patterns[i]) == -1)
              {
                 
                  var result = Regex.Match(patterns[i], @"\d+$", RegexOptions.RightToLeft);
                  if (result.Success) 
                  { 
                      //Debug.Log(result.Value);
                  } 
              }
          }
      }
  }
  private void firstVerse()
      {
          patterns = new string[] {"triangle", "triangle", "triangle", "singleRandom", "singleRandom", "verticalLine5"};
          coords = new Vector2[] {new Vector2(-1.3f, 2.5f), new Vector2(0f, -2.5f), new Vector2(1.3f, 2.5f), new Vector2(0,0), new Vector2(0,0), new Vector2(0, 4f)};
          punchDelay = 0.5f;
          patternDelay = 0.5f;
      }

Maybe this will work....hope this helps

Comment
Add comment · Show 5 · 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 Bradx · Oct 01, 2021 at 04:34 PM 0
Share

Thanks so much! I'll give this a try when I get home later today. I've had success using float based timers in other scripts - but I guess none of them were able to turn themselves on and off so it didn't create problems.

avatar image rage_co Bradx · Oct 02, 2021 at 01:55 PM 0
Share

i think the major problem is that a function is only called once, so a float based timer will only work in update method, or in a while loop with a one frame wait

avatar image Bradx · Oct 01, 2021 at 10:40 PM 0
Share

It worked! Thanks so much, my humanity has been restored!

avatar image rage_co Bradx · Oct 02, 2021 at 01:48 PM 1
Share

glad this worked, id also suggest using while loops with the simple TIme.deltaTime trick with the wait for 1 frame command (yield return 0) if you're planning to work with pause menus as coroutines obviously won't pause when the game does...so in that case, id recommend using a while loop inside an IEnumerator coroutine.....like this...

 activeWaitTime = 0f;
 while(activeWaitTime < waitTime0)
 {
   if(!gamePaused)
   {
     activeWaitTime += Time.deltaTime;
   }
   yield return 0;
 }
 activeWaitTime = 0f;

just replace the yield return new WaitForSeconds(); line with the given lines of code (be sure to swap the given variables (waitTime0 float and gamePaused bool) for what's applicable in your code...and remember to add this line at the very beginning of the coroutine

 float activeWaitTime = 0f;

it might sound overwhel$$anonymous$$g, but its really simple and is gonna be a quality improvement as most probably you'll have a pause menu and you wouldn't want the coroutine to mess things up

avatar image Bradx rage_co · Oct 04, 2021 at 09:19 PM 0
Share

Oh cool, thanks! This was the first time I've used a coroutine and I'm sure I would've had to implement some kind of pause function eventually, so this is a nice little freebie =]

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

770 People are following this question.

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

Related Questions

if ALL items in array are something 1 Answer

Nested For loop Grouping 0 Answers

Can someone explain what IEnumerators and for statements are? 1 Answer

Checking if all objects of an array are active at the same time 0 Answers

loop for perimeter of game board 0 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