Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using UnityEngine;
- public enum SpawnManagerMode
- {
- Discrete,
- Roulette
- }
- public class SpawnManager : MonoBehaviour
- {
- public SpawnManagerMode mode;
- [Range(0, 64)]
- public int rouletteMin;
- [Range(0, 64)]
- public int rouletteMax;
- [Range(0, 100)]
- public int spawnChance = 100;
- public bool spawnOnStart;
- public SpawnableObject[] spawnableObjects;
- public void Start()
- {
- Despawn();
- if (spawnOnStart)
- {
- Spawn();
- }
- }
- /**
- * Despawns all spawnable objects from the world.
- */
- public void Despawn()
- {
- foreach (SpawnableObject spawnableObject in this.spawnableObjects)
- {
- if(spawnableObject != null && spawnableObject.worldObject != null)
- {
- spawnableObject.worldObject.gameObject.SetActive(false);
- }
- }
- }
- public void Spawn()
- {
- switch (mode)
- {
- case SpawnManagerMode.Discrete:
- foreach (SpawnableObject spawnableObject in this.spawnableObjects)
- {
- if (spawnableObject != null && spawnableObject.worldObject != null)
- {
- if (Random.Range(0, 100) <= spawnableObject.discreteChance)
- {
- spawnableObject.worldObject.gameObject.SetActive(true);
- }
- else
- {
- spawnableObject.worldObject.gameObject.SetActive(false);
- }
- }
- }
- break;
- case SpawnManagerMode.Roulette:
- int totalWeight = 0;
- List<SpawnableObject> availableObjects = new List<SpawnableObject>();
- for (int i = 0; i < spawnableObjects.Length; i++)
- {
- if (spawnableObjects[i] != null && spawnableObjects[i].rouletteWeight > 0)
- {
- availableObjects.Add(spawnableObjects[i]);
- totalWeight += spawnableObjects[i].rouletteWeight;
- }
- }
- if (availableObjects.Count > 0 && totalWeight > 0)
- {
- int objectsToSpawn = Random.Range(rouletteMin, rouletteMax + 1);
- objectsToSpawn = Mathf.Min(objectsToSpawn, availableObjects.Count);
- List<SpawnableObject> spawnedObjects = new List<SpawnableObject>();
- for (int spawnCount = 0; spawnCount < objectsToSpawn; spawnCount++)
- {
- int randomWeight = Random.Range(0, totalWeight);
- int currentWeightSum = 0;
- SpawnableObject selectedObject = null;
- foreach (var obj in availableObjects)
- {
- currentWeightSum += obj.rouletteWeight;
- if (randomWeight < currentWeightSum)
- {
- selectedObject = obj;
- break;
- }
- }
- if (selectedObject != null)
- {
- selectedObject.worldObject.gameObject.SetActive(true);
- spawnedObjects.Add(selectedObject);
- availableObjects.Remove(selectedObject);
- totalWeight -= selectedObject.rouletteWeight;
- }
- }
- }
- break;
- default:
- break;
- }
- }
- #if UNITY_EDITOR
- private void OnDrawGizmos()
- {
- Gizmos.DrawIcon(this.gameObject.transform.position,"SpawnManager",true);
- }
- #endif
- void OnDrawGizmosSelected()
- {
- if (spawnableObjects != null)
- {
- foreach (SpawnableObject spawnableObject in spawnableObjects)
- {
- if (spawnableObject != null && spawnableObject.worldObject != null)
- {
- Gizmos.color = Color.green;
- Gizmos.DrawLine(transform.position, spawnableObject.worldObject.gameObject.transform.position);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement