Files
AppleHillsProduction/Assets/Scripts/Minigames/BirdPooper/ObstacleSpawnConfig.cs

112 lines
4.5 KiB
C#

using System;
using UnityEngine;
namespace Minigames.BirdPooper
{
/// <summary>
/// Container for a pool of obstacle prefabs at a specific difficulty tier.
/// Pools are ordered by difficulty, with pool[0] being the easiest.
/// </summary>
[Serializable]
public class ObstaclePool
{
[Tooltip("Obstacles in this difficulty tier")]
public GameObject[] obstacles;
}
/// <summary>
/// Configuration for obstacle spawning in Bird Pooper minigame.
/// Includes difficulty pools, spawn timing, and diversity settings.
/// </summary>
[Serializable]
public class ObstacleSpawnConfig
{
[Header("Difficulty Pools")]
[Tooltip("Obstacle pools ordered by difficulty (pool[0] = easiest, always active)")]
public ObstaclePool[] obstaclePools;
[Tooltip("Times (in seconds) when each additional pool unlocks. Length should be obstaclePools.Length - 1. At poolUnlockTimes[i], pool[i+1] becomes available.")]
public float[] poolUnlockTimes;
[Header("Spawn Timing")]
[Tooltip("Minimum interval between spawns (seconds) - represents high difficulty")]
public float minSpawnInterval = 1f;
[Tooltip("Maximum interval between spawns (seconds) - represents low difficulty")]
public float maxSpawnInterval = 2f;
[Header("Difficulty Scaling")]
[Tooltip("Time in seconds for difficulty to ramp from 0 to 1")]
public float difficultyRampDuration = 60f;
[Tooltip("Curve mapping normalized time (0..1) to difficulty (0..1). Default is linear.")]
public AnimationCurve difficultyCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
[Tooltip("Maximum jitter applied to computed interval (fractional). 0.1 = +/-10% jitter")]
public float intervalJitter = 0.05f;
[Header("Recency / Diversity")]
[Tooltip("Time in seconds it takes for a recently-used prefab to recover back to full weight")]
public float recentDecayDuration = 10f;
[Tooltip("Minimum weight (0..1) applied to a just-used prefab so it can still appear occasionally")]
[Range(0f, 1f)]
public float minRecentWeight = 0.05f;
/// <summary>
/// Validates the configuration and logs warnings for invalid settings.
/// </summary>
public void Validate()
{
// Validate pools
if (obstaclePools == null || obstaclePools.Length == 0)
{
Debug.LogError("[ObstacleSpawnConfig] No obstacle pools defined!");
return;
}
// Validate pool unlock times
int expectedUnlockTimes = obstaclePools.Length - 1;
if (poolUnlockTimes == null)
{
Debug.LogWarning($"[ObstacleSpawnConfig] poolUnlockTimes is null. Expected {expectedUnlockTimes} entries. Only pool[0] will be available.");
}
else if (poolUnlockTimes.Length != expectedUnlockTimes)
{
Debug.LogWarning($"[ObstacleSpawnConfig] poolUnlockTimes.Length ({poolUnlockTimes.Length}) does not match expected value ({expectedUnlockTimes}). Should be obstaclePools.Length - 1.");
}
// Validate spawn intervals
if (minSpawnInterval < 0f)
{
Debug.LogWarning("[ObstacleSpawnConfig] minSpawnInterval is negative. Clamping to 0.");
}
if (maxSpawnInterval < 0f)
{
Debug.LogWarning("[ObstacleSpawnConfig] maxSpawnInterval is negative. Clamping to 0.");
}
if (minSpawnInterval > maxSpawnInterval)
{
Debug.LogWarning("[ObstacleSpawnConfig] minSpawnInterval is greater than maxSpawnInterval. Values should be swapped.");
}
// Validate difficulty ramp
if (difficultyRampDuration < 0.01f)
{
Debug.LogWarning("[ObstacleSpawnConfig] difficultyRampDuration is too small. Should be at least 0.01.");
}
// Validate recency settings
if (recentDecayDuration < 0.01f)
{
Debug.LogWarning("[ObstacleSpawnConfig] recentDecayDuration is too small. Should be at least 0.01.");
}
if (minRecentWeight < 0f || minRecentWeight > 1f)
{
Debug.LogWarning("[ObstacleSpawnConfig] minRecentWeight should be between 0 and 1.");
}
}
}
}