| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 | using System;using UnityEngine;using System.Collections.Generic;using System.Collections;using Random = UnityEngine.Random;namespace HQFPSWeapons{	public class ItemSpawner : MonoBehaviour	{		[BHeader("General", true)]		[SerializeField]		private bool OneTimeSpawn = false;		[SerializeField]		private ItemSpawnSuccesion m_SpawnType = ItemSpawnSuccesion.InOrder;		[SerializeField]		private ItemToSpawn[] m_ItemsToSpawn = null;		[SerializeField]		private Vector3 m_RandomRotation = Vector3.zero;		[SerializeField]		private ParticleSystem m_ParticleEffects = null;		[BHeader("Delays")]		[SerializeField]		private float m_CanSpawnDelay = 10f;		[SerializeField]		private float m_InitialItemSpawnDelay = 0.5f;		[SerializeField]		private float m_DelayBetweenItemSpawns = 0.1f;		[SerializeField]		private float m_ItemDestroyDelay = 15f;		[BHeader("Audio")]		[SerializeField]		private SoundPlayer m_StartSpawnAudio = null;		[SerializeField]		private SoundPlayer m_EndSpawnAudio = null;		private BoxCollider m_Collider;		private AudioSource m_AudioSource;		private int m_ItemsToSpawnCount;		private float m_NextTimeCanSpawn;		private bool m_CanSpawn = true;		private WaitForSeconds m_TimeBetweenSpawns;		public void SpawnItems(int maxSpawnCount)		{			if (Time.time > m_NextTimeCanSpawn && m_CanSpawn)			{				maxSpawnCount = Mathf.Clamp(maxSpawnCount, 0, m_ItemsToSpawn.Length);				m_NextTimeCanSpawn = Time.time + m_CanSpawnDelay;				List <ItemPickup> itemsToSpawn = new List<ItemPickup>();				if (m_SpawnType == ItemSpawnSuccesion.InOrder)				{					for (int i = 0; i < m_ItemsToSpawn.Length; i++)					{						if (m_ItemsToSpawnCount >= maxSpawnCount)							break;						for (int n = 0; n < m_ItemsToSpawn[i].Amount; n++)						{							if (m_ItemsToSpawnCount >= maxSpawnCount)								break;							itemsToSpawn.Add(m_ItemsToSpawn[i].ItemPickup);							m_ItemsToSpawnCount++;						}					}				}				else if (m_SpawnType == ItemSpawnSuccesion.Random)				{					for (int i = 0; i < maxSpawnCount; i++)					{						int randomIndex = Random.Range(i, m_ItemsToSpawn.Length);						ItemToSpawn randomItem = m_ItemsToSpawn[randomIndex];						if (m_ItemsToSpawn[i].ItemPickup != randomItem.ItemPickup)						{							ItemToSpawn temp = m_ItemsToSpawn[i];							m_ItemsToSpawn[i] = randomItem;							m_ItemsToSpawn[randomIndex] = temp;						}						itemsToSpawn.Add(randomItem.ItemPickup);					}				}				StartCoroutine(C_SpawnItems(itemsToSpawn));			}		}		private Vector3 RandomPointInBounds(Bounds bounds)		{			return new Vector3(				Random.Range(bounds.min.x, bounds.max.x),				Random.Range(bounds.min.y, bounds.max.y),				Random.Range(bounds.min.z, bounds.max.z)			);		}		private void Start()		{			m_Collider = GetComponent<BoxCollider>();			m_AudioSource = GetComponent<AudioSource>();			m_TimeBetweenSpawns = new WaitForSeconds(m_DelayBetweenItemSpawns);		}		private IEnumerator C_SpawnItems(List<ItemPickup> itemsToSpawn) 		{			yield return new WaitForSeconds(m_InitialItemSpawnDelay);			m_StartSpawnAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);			for (int i = 0; i < itemsToSpawn.Count; i++)			{				if (itemsToSpawn[i] != null)				{					Quaternion spawnedItemRotation = Quaternion.Euler(						Random.Range(-Mathf.Abs(m_RandomRotation.x), Mathf.Abs(m_RandomRotation.x)),						Random.Range(-Mathf.Abs(m_RandomRotation.y), Mathf.Abs(m_RandomRotation.y)),						Random.Range(-Mathf.Abs(m_RandomRotation.z), Mathf.Abs(m_RandomRotation.z))					);					ItemPickup item = Instantiate(itemsToSpawn[i], RandomPointInBounds(m_Collider.bounds), spawnedItemRotation);					item.StartCoroutine(item.C_DelayedDestroy(m_ItemDestroyDelay));					if (m_ParticleEffects != null)						Instantiate(m_ParticleEffects, item.transform.position, spawnedItemRotation);					yield return m_TimeBetweenSpawns;				}			}			if (OneTimeSpawn)				m_CanSpawn = false;			m_ItemsToSpawnCount = 0;			m_EndSpawnAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);		}		// ------------------- Internal ------------------		[Serializable]		private struct ItemToSpawn		{			#pragma warning disable 0649			public ItemPickup ItemPickup;			public int Amount;			#pragma warning restore 0649		}		public enum ItemSpawnSuccesion		{			InOrder,			Random		}	}}
 |