Prototyped the object production scheduling.

This commit is contained in:
Khauvinkh
2024-08-17 15:12:00 +02:00
parent 4c839e6f98
commit 5a8bab2f41
23 changed files with 726 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
using UnityEngine;
public class DefectiveProduct : MonoBehaviour
{
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 05b73befcbdd4bbfaaee667a8da86b1f
timeCreated: 1723897738

View File

@@ -0,0 +1,36 @@
using System;
using UnityEngine;
using Random = UnityEngine.Random;
[CreateAssetMenu(fileName = "New Product Description", menuName = "Data/Product Description", order = 0)]
public class ProductDescription : ScriptableObject
{
[Serializable]
public struct Product
{
public GameObject Prefab;
[Range(0,100)]
public int Probability;
}
public Product[] Products;
public GameObject GetRandomProduct()
{
float randomValue = Random.value;
float sum = 0;
for (var i = 0; i < Products.Length; i++)
{
var product = Products[i];
sum += product.Probability / 100f;
if (randomValue <= sum)
{
return product.Prefab;
}
}
return null;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a80c2e8703664de8943062f03eedfe17
timeCreated: 1723896074

View File

@@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using UnityEngine;
public class ProductSpawner : MonoBehaviour
{
public enum ProductionPhaseType
{
Pause = 0,
Production = 1,
}
[Serializable]
public struct ProductionPhase
{
public ProductionPhaseType Type;
public ProductDescription Description;
[Min(1f)]
public float Duration;
[Min(1f)]
public float TotalSpawnCount;
public float SpawnInterval => Duration / TotalSpawnCount;
}
public List<ProductionPhase> ProductionPhases;
public float _remainingDuration;
public float _spawnTimer;
private void Update()
{
if (ProductionPhases.Count == 0)
{
enabled = false;
return;
}
var currentPhase = ProductionPhases[0];
if (_remainingDuration <= 0)
{
_remainingDuration = currentPhase.Duration;
_spawnTimer = 0f;
}
_remainingDuration -= Time.deltaTime;
if (currentPhase.Type != ProductionPhaseType.Pause)
{
_spawnTimer -= Time.deltaTime;
if (_spawnTimer >= 0f)
{
if (_remainingDuration <= 0)
{
ProductionPhases.RemoveAt(0);
}
return;
}
_spawnTimer = currentPhase.SpawnInterval;
Instantiate(currentPhase.Description.GetRandomProduct(), transform.position, Quaternion.identity);
}
if (_remainingDuration <= 0)
{
ProductionPhases.RemoveAt(0);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 13fa2421a3e649448c929ac42745ad65
timeCreated: 1723896826