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
- }
- }
- }
|