using System.Collections; using System.Collections.Generic; using UnityEngine; public class SummonerSpawner : MonoBehaviour { [Header("Objects to spawn")] [SerializeField] private GameObject[] spawnableObjects; [Header("Spawner config")] [SerializeField] private int objectCount = 8; [SerializeField] private float spawnRadius = 5f; [SerializeField] private bool lookAtCenter = true; [Header("Spawn timing")] [SerializeField] private float delayBeforeSpawn = 1f; [SerializeField] private float timeBetweenSpawns = 0.2f; [Header("Debug")] [SerializeField] private bool drawGizmos = true; private int currentObjectIndex = 0; private List spawnedObjects = new List(); private bool isSpawning = false; public void SelectNextObject() { if (spawnableObjects.Length == 0) return; currentObjectIndex = (currentObjectIndex + 1) % spawnableObjects.Length; Debug.Log($"Wybrano obiekt: {spawnableObjects[currentObjectIndex].name} (Index: {currentObjectIndex})"); } public void SelectPreviousObject() { if (spawnableObjects.Length == 0) return; currentObjectIndex--; if (currentObjectIndex < 0) { currentObjectIndex = spawnableObjects.Length - 1; } Debug.Log($"Wybrano obiekt: {spawnableObjects[currentObjectIndex].name} (Index: {currentObjectIndex})"); } public void ResetSpawn() { if (isSpawning) { StopAllCoroutines(); isSpawning = false; } foreach (GameObject obj in spawnedObjects) { if (obj != null) { Destroy(obj); } } spawnedObjects.Clear(); Debug.Log("Spawn zresetowany - usunięto wszystkie obiekty"); StartCoroutine(SpawnObjectsCoroutine()); } private IEnumerator SpawnObjectsCoroutine() { if (spawnableObjects.Length == 0) { Debug.LogWarning("Brak obiektów do spawnowania!"); yield break; } GameObject prefabToSpawn = spawnableObjects[currentObjectIndex]; if (prefabToSpawn == null) { Debug.LogWarning("Wybrany obiekt jest null!"); yield break; } isSpawning = true; yield return new WaitForSeconds(delayBeforeSpawn); for (int i = 0; i < objectCount; i++) { float angle = Random.Range(0f, 360f) * Mathf.Deg2Rad; float x = transform.position.x + spawnRadius * Mathf.Cos(angle); float z = transform.position.z + spawnRadius * Mathf.Sin(angle); Vector3 spawnPosition = new Vector3(x, transform.position.y, z); GameObject spawnedObj = Instantiate(prefabToSpawn, spawnPosition, Quaternion.identity); if (lookAtCenter) { spawnedObj.transform.LookAt(transform.position); } spawnedObjects.Add(spawnedObj); if (i < objectCount - 1) { yield return new WaitForSeconds(timeBetweenSpawns); } } Debug.Log($"Spawnowano {objectCount} obiektów typu: {prefabToSpawn.name}"); isSpawning = false; } public void SetSpawnRadius(float newRadius) { spawnRadius = Mathf.Max(0.1f, newRadius); Debug.Log($"Nowy promień spawnu: {spawnRadius}"); } public void SetObjectCount(int count) { objectCount = Mathf.Max(1, count); Debug.Log($"Nowa liczba obiektów: {objectCount}"); } public void SetObjectIndex(int index) { if (index >= 0 && index < spawnableObjects.Length) { currentObjectIndex = index; } } public void SetDelayBeforeSpawn(float delay) { delayBeforeSpawn = Mathf.Max(0f, delay); } public void SetTimeBetweenSpawns(float time) { timeBetweenSpawns = Mathf.Max(0f, time); } private void OnDrawGizmos() { if (!drawGizmos) return; Gizmos.color = Color.yellow; float angleStep = 360f / Mathf.Max(1, objectCount); Vector3 previousPoint = transform.position + new Vector3(spawnRadius, 0, 0); for (int i = 1; i <= objectCount; i++) { float angle = i * angleStep * Mathf.Deg2Rad; float x = transform.position.x + spawnRadius * Mathf.Cos(angle); float z = transform.position.z + spawnRadius * Mathf.Sin(angle); Vector3 newPoint = new Vector3(x, transform.position.y, z); Gizmos.DrawLine(previousPoint, newPoint); Gizmos.DrawWireSphere(newPoint, 0.2f); previousPoint = newPoint; } Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, 0.3f); } }