using System.Collections.Generic; using Unity.Entities; using Unity.Transforms; using UnityEngine; namespace HappyForest.Prototypen { // --- DOTS DATEN FÜR DEN MANAGER --- public struct SpawnerData : IComponentData { public Entity DotsPrefabEntity; } // --- DER OOP MANAGER --- public class ManagerScript : MonoBehaviour { [Header("Architektur Switch")] [Tooltip("Schaltet um auf das rasend schnelle Entity Component System")] public bool nutzeDOTS = false; public GameObject dotsPrefab; // Zieh hier dein NEUES DOTS-Prefab rein [Header("OOP Spawner Einstellungen")] public GameObject oopPrefab; // Dein altes Prefab public bool pillenKollidieren = true; [Header("Tasten-Einstellungen")] public float aktionsVerzoegerung = 0.1f; private float letzterAktionsZeitpunkt = 0f; [HideInInspector] public List aktivePillen = new List(); // DOTS Referenzen private EntityManager entityManager; private EntityQuery spawnerQuery; private int dotsPillenCount = 0; void Start() { // Initialisiere DOTS Welt if (World.DefaultGameObjectInjectionWorld != null) { entityManager = World.DefaultGameObjectInjectionWorld.EntityManager; spawnerQuery = entityManager.CreateEntityQuery(typeof(SpawnerData)); } } void Update() { // Tote OOP-Pillen aussortieren (falls sie über -10 gefallen sind) aktivePillen.RemoveAll(pille => pille == null); // Tasten gedrückt halten (mit Cooldown) if (Time.time - letzterAktionsZeitpunkt > aktionsVerzoegerung) { // HIER SIND DIE NEUEN TASTEN FÜR DEINE TASTATUR if (Input.GetKey(KeyCode.Space)) { Debug.Log("Leertaste gedrückt!"); // <--- NEU SpawnPille(1); letzterAktionsZeitpunkt = Time.time; } else if (Input.GetKey(KeyCode.M)) { PilleEntfernen(); letzterAktionsZeitpunkt = Time.time; } else if (Input.GetKey(KeyCode.C)) { SpawnPille(100); letzterAktionsZeitpunkt = Time.time; } } } private void SpawnPille(int anzahl) { if (nutzeDOTS) { // --- DOTS SPAWN --- if (!spawnerQuery.HasSingleton()) { Debug.LogError("Abbruch: Manager findet SpawnerData nicht!"); // <--- NEU return; } Entity prefab = spawnerQuery.GetSingleton().DotsPrefabEntity; for (int i = 0; i < anzahl; i++) { Entity newEntity = entityManager.Instantiate(prefab); // Optionale Startposition (z.B. aus einer bestehenden Pille) könnte man hier über LocalTransform setzen entityManager.SetComponentData(newEntity, LocalTransform.FromPosition(Vector3.zero)); dotsPillenCount++; } } else { // --- OOP SPAWN (Dein alter Code) --- for (int i = 0; i < anzahl; i++) { Vector3 spawnPos = Vector3.zero; if (aktivePillen.Count > 0) { GameObject randomPille = aktivePillen[Random.Range(0, aktivePillen.Count)]; spawnPos = randomPille.transform.position; } if (oopPrefab != null) { GameObject neu = Instantiate(oopPrefab, spawnPos, Quaternion.identity); aktivePillen.Add(neu); // Kollision umschalten if (!pillenKollidieren) neu.layer = LayerMask.NameToLayer("Pille"); else neu.layer = LayerMask.NameToLayer("Default"); } } } } private void PilleEntfernen() { if (nutzeDOTS) { // In DOTS müsste man hier eine Query machen und eine Entity löschen. // Für diesen Test reduzieren wir nur den Zähler zur Veranschaulichung. Debug.Log("Löschen in DOTS benötigt einen kleinen Extra-Job!"); } else { if (aktivePillen.Count > 0) { GameObject pilleToDelete = aktivePillen[0]; aktivePillen.RemoveAt(0); Destroy(pilleToDelete); } } } void OnGUI() { GUI.color = Color.yellow; GUI.skin.label.fontSize = 20; int fps = (int)(1f / Time.unscaledDeltaTime); GUI.Label(new Rect(10, 10, 400, 30), $"FPS: {fps}"); if (nutzeDOTS) { GUI.Label(new Rect(10, 40, 400, 30), $"Aktive DOTS Pillen (Gespawnt): {dotsPillenCount}"); } else { GUI.Label(new Rect(10, 40, 400, 30), $"Aktive OOP Pillen: {aktivePillen.Count}"); } } } }