Advertisement
Krythic

SpawnManager

Sep 28th, 2024
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.47 KB | None | 0 0
  1.  
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public enum SpawnManagerMode
  6. {
  7.     Discrete,
  8.     Roulette
  9. }
  10.  
  11. public class SpawnManager : MonoBehaviour
  12. {
  13.     public SpawnManagerMode mode;
  14.     [Range(0, 64)]
  15.     public int rouletteMin;
  16.     [Range(0, 64)]
  17.     public int rouletteMax;
  18.     [Range(0, 100)]
  19.     public int spawnChance = 100;
  20.     public bool spawnOnStart;
  21.     public SpawnableObject[] spawnableObjects;
  22.  
  23.     public void Start()
  24.     {
  25.         Despawn();
  26.         if (spawnOnStart)
  27.         {
  28.             Spawn();
  29.         }
  30.     }
  31.  
  32.     /**
  33.      * Despawns all spawnable objects from the world.
  34.      */
  35.     public void Despawn()
  36.     {
  37.         foreach (SpawnableObject spawnableObject in this.spawnableObjects)
  38.         {
  39.             if(spawnableObject != null && spawnableObject.worldObject != null)
  40.             {
  41.                 spawnableObject.worldObject.gameObject.SetActive(false);
  42.             }
  43.         }
  44.     }
  45.  
  46.     public void Spawn()
  47.     {
  48.         switch (mode)
  49.         {
  50.             case SpawnManagerMode.Discrete:
  51.                 foreach (SpawnableObject spawnableObject in this.spawnableObjects)
  52.                 {
  53.                     if (spawnableObject != null && spawnableObject.worldObject != null)
  54.                     {
  55.                         if (Random.Range(0, 100) <= spawnableObject.discreteChance)
  56.                         {
  57.                             spawnableObject.worldObject.gameObject.SetActive(true);
  58.                         }
  59.                         else
  60.                         {
  61.                             spawnableObject.worldObject.gameObject.SetActive(false);
  62.                         }
  63.                     }
  64.                 }
  65.                 break;
  66.             case SpawnManagerMode.Roulette:
  67.                 int totalWeight = 0;
  68.                 List<SpawnableObject> availableObjects = new List<SpawnableObject>();
  69.                 for (int i = 0; i < spawnableObjects.Length; i++)
  70.                 {
  71.                     if (spawnableObjects[i] != null && spawnableObjects[i].rouletteWeight > 0)
  72.                     {
  73.                         availableObjects.Add(spawnableObjects[i]);
  74.                         totalWeight += spawnableObjects[i].rouletteWeight;
  75.                     }
  76.                 }
  77.                 if (availableObjects.Count > 0 && totalWeight > 0)
  78.                 {
  79.                     int objectsToSpawn = Random.Range(rouletteMin, rouletteMax + 1);
  80.                     objectsToSpawn = Mathf.Min(objectsToSpawn, availableObjects.Count);
  81.                     List<SpawnableObject> spawnedObjects = new List<SpawnableObject>();
  82.                     for (int spawnCount = 0; spawnCount < objectsToSpawn; spawnCount++)
  83.                     {
  84.                         int randomWeight = Random.Range(0, totalWeight);
  85.                         int currentWeightSum = 0;
  86.                         SpawnableObject selectedObject = null;
  87.                         foreach (var obj in availableObjects)
  88.                         {
  89.                             currentWeightSum += obj.rouletteWeight;
  90.                             if (randomWeight < currentWeightSum)
  91.                             {
  92.                                 selectedObject = obj;
  93.                                 break;
  94.                             }
  95.                         }
  96.                         if (selectedObject != null)
  97.                         {
  98.                             selectedObject.worldObject.gameObject.SetActive(true);
  99.                             spawnedObjects.Add(selectedObject);
  100.                             availableObjects.Remove(selectedObject);
  101.                             totalWeight -= selectedObject.rouletteWeight;
  102.                         }
  103.                     }
  104.                 }
  105.                 break;
  106.             default:
  107.                 break;
  108.         }
  109.     }
  110.  
  111. #if UNITY_EDITOR
  112.     private void OnDrawGizmos()
  113.     {
  114.         Gizmos.DrawIcon(this.gameObject.transform.position,"SpawnManager",true);
  115.     }
  116. #endif
  117.  
  118.  
  119.     void OnDrawGizmosSelected()
  120.     {
  121.         if (spawnableObjects != null)
  122.         {
  123.             foreach (SpawnableObject spawnableObject in spawnableObjects)
  124.             {
  125.                 if (spawnableObject != null && spawnableObject.worldObject != null)
  126.                 {
  127.                     Gizmos.color = Color.green;
  128.                     Gizmos.DrawLine(transform.position, spawnableObject.worldObject.gameObject.transform.position);
  129.                 }
  130.             }
  131.         }
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement