zombie_mp/Assets/HQ FPS Weapons/Scripts/Demo/ItemSpawner.cs
Sewmina Dilshan 68183e5317 initial
2021-08-23 13:28:33 +05:30

179 lines
4.3 KiB
C#

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