Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 RgClube · Aug 18, 2020 at 05:13 PM · randomspawningrandomizing

Advanced Wave Spawner (Spawn Waves in random order)

Hi, the point of what I want to do is aleready indicated in the title. I have an array of waves set that are spawned in a numerical order one by one. I want the waves to be selected and spawned randomly, and for example if there was selected wave number 2 it could only be selected again after all other waves have passed. Here's my WaveSpawner code:

  public class WaveSpawner : MonoBehaviour
     {
         public enum SpawnState {SPAWNING, WAITING, COUNTING};
         [System.Serializable]
         public class Wave
         {
             public string name;
             public Transform[] enemy;
             public int count;
             public float rate;
         }
         public Wave[] waves;
         private int nextWave = 0;
 
     public float timeBetweenWaves = 5f;
     private float waveCountdown;
     private SpawnState state = SpawnState.COUNTING;
     private float searchCountdown = 1f;  
     public Transform[] spawnPoints;
     private int index;
     void Start()
     {
         waveCountdown = timeBetweenWaves;
     }
     void Update()
     {
         if(state == SpawnState.WAITING)
         {
             if(!EnemyIsAlive())
             {
                WaveCompleted();
             }
             else
             {
                 return;
             }
         }
         if(waveCountdown <= 0)
         {
             if (state != SpawnState.SPAWNING)
             {
                 StartCoroutine(SpawnWave(waves[nextWave]));
             }
         }
          else
             {
                 waveCountdown -= Time.deltaTime;
             }
     }
     void WaveCompleted()
     {
          Debug.Log("Wave Completed");
          state = SpawnState.COUNTING;
          waveCountdown = timeBetweenWaves;
          if(nextWave + 1 > waves.Length -1)
          {
              nextWave = 0;
              Debug.Log("Completed all waves! Looping");
          } else {
              nextWave++;
          }
          
     }
     bool EnemyIsAlive()
     {
         searchCountdown -= Time.deltaTime;
         if(searchCountdown <= 0f)
         {
             searchCountdown = 1f;
             if(GameObject.FindGameObjectsWithTag("Enemy") == null)
         {
             return false;
         }
         }
         return true;
     }
     IEnumerator SpawnWave (Wave _wave) //want to wate a certain amount of seconds in metod
     {
         state = SpawnState.SPAWNING;
        
         
 
         for(int i=0;i< _wave.enemy.Length; i++)
         {
             index = (index >= _wave.enemy.Length-1) ? 0 : index+1;
             SpawnEnemy(_wave.enemy[index]);
             yield return new WaitForSeconds(1f/_wave.rate);
         }
 
         state = SpawnState.WAITING;
         yield break;
     } 
     void SpawnEnemy (Transform _enemy)
     {
         Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length)];
         //SpawnEnemy
         switch (_enemy.name)
         {
             case "BG3" : 
             _sp = spawnPoints[1];
             break;
             case "Notebook": 
             _sp = spawnPoints[2];
             break;
         }
         Debug.Log("Spawning Enemy" +_enemy.name);
         
         Instantiate (_enemy, _sp.position, _sp.rotation);
         
     }
 }

The variable nextWave in the WaveCompleted() method is responsible for the order of the waves. Thanks in advance for any help!

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
0
Best Answer

Answer by Aviryx · Aug 18, 2020 at 06:20 PM

What you need to do (imo) is to create a separate list to store how many waves there are and then pick from that. When a wave is selected it can be removed from the list until nothing is left.


1) create a list that will be used to count "how many and which waves are left to be spawned".


 public List<Wave> waveTracker = new List<Wave>();

2) before spawning the "first" wave, add all of the waves to a list.


 foreach (Wave individualWave in waves)
 {
     waveTracker.Add(individualWave);
 }

3) Time to pick which (random) wave to spawn!


 var randomSelection = Random.Range(0, waveTracker.Count);

4) Now you have the wave that needs to be spawned, you can remove that wave from the list.


 waveTracker.Remove(randomSelection);

5) and spawn the selected (random) wave.


 waves[randomSelection];

When you add all of the waves that have not been spawned to the list, you need to check if the result is higher than 0.... if it is then you have waves left to spawn. If the list is empty (because all waves have been spawned) then you need to repopulate the list and start again.


Hopefully this helps as it was all written off the top of my head.

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

138 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

Related Questions

whats the best way to randomize prefab faces and its facial expressions? 0 Answers

i want to spawn randomly 1 Answer

How can I create a script to create and then randomly select 1 of 3 spawning points? 1 Answer

How to generate random objects? 1 Answer

Simple random spawning system for 10 items without duplicates 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