MichaelH Geschrieben 11. August 2021 Melden Share Geschrieben 11. August 2021 Ich versuch seit Stunden per Script ein Instantiate Prefab(Clone) wieder aus der Hierarchy zu Entfernen ohne dabei das Prefab selbs zu beeinflussen. Das Prefab ist ein Variant Variant ... und Stellt den Sector eines Levels dar, der jenachdem wo sich der Player grade befindet, ein und ausgestellt wird. Hier mal ein Bild: Das kann doch nicht so schwer sein ?!?! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. August 2021 Melden Share Geschrieben 11. August 2021 Nö, vermutlich nicht, aber ohne Code kann dir keiner sagen, was schief läuft Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MichaelH Geschrieben 11. August 2021 Autor Melden Share Geschrieben 11. August 2021 Ok, hier mal die ganze Klasse LevelManager. Ist nicht so lang. Ev fällt dir ja auch noch zur Verbesserung der Funktionen ein. using UnityEngine.Experimental.Rendering.Universal; using System.Collections.Generic; using UnityEngine; public class LevelManager : MonoBehaviour { [SerializeField] GameObject player; [SerializeField] List<Sector> sectors; int[,] sectorIndex; float minX, maxX, minY, maxY; Vector2 sectorSize = new Vector2(12, 9); Vector2 playerArea; Sector currentSector; void Start() { playerArea = sectorSize / 2 - Vector2.one; CreateSectorIndexArray(); // Set startsector transform.position = GetSectorPosition(player.transform.position); currentSector = sectors[GetSectorIndex(transform.position)]; Instantiate(currentSector); } private Vector2 GetSectorPosition(Vector2 pos) { pos.x += sectorSize.x / 2 * Mathf.Sign(pos.x); pos.y += sectorSize.y / 2 * Mathf.Sign(pos.y); pos.x = (int)(pos.x / sectorSize.x) * sectorSize.x; pos.y = (int)(pos.y / sectorSize.y) * sectorSize.y; return pos; } private void OnTriggerExit2D(Collider2D collision) { if (collision.gameObject != player) return; Vector2 pos = transform.position; Vector2 point = collision.ClosestPoint(pos); point -= pos; if (point.x > playerArea.x) pos.x += sectorSize.x; else if (point.x < -playerArea.x) pos.x -= sectorSize.x; else if (point.y > playerArea.y) pos.y += sectorSize.y; else if (point.y < -playerArea.y) pos.y -= sectorSize.y; Debug.Log($"New Positon: {pos}"); int index = GetSectorIndex(pos); if (index >= 0) { // currentSector.enabled = false; // DestroyImmediate(currentSector); Destroy(currentSector); // Destroy(currentSector.gameObject); currentSector = sectors[GetSectorIndex(pos)]; Instantiate(currentSector); transform.position = pos; } else Debug.Log($"No sector at {pos}"); } private void CreateSectorIndexArray() { minX = sectors[0].transform.position.x; maxX = minX; minY = sectors[0].transform.position.y; maxY = minY; foreach (Sector sec in sectors) { if (sec.transform.position.x < minX) minX = sec.transform.position.x; else if (sec.transform.position.x > maxX) maxX = sec.transform.position.x; if (sec.transform.position.y < minY) minY = sec.transform.position.y; else if (sec.transform.position.y > maxY) maxY = sec.transform.position.y; } int i = (int)((maxX - minX) / sectorSize.x) + 1; int j = (int)((maxY - minY) / sectorSize.y) + 1; sectorIndex = new int[i, j]; for (int k = 0; k < i; k++) { for (int l = 0; l < j; l++) { sectorIndex[k, l] = -1; } } float x,y; for (i = 0; i < sectors.Count; i++) { x = (sectors[i].transform.position.x - minX) / sectorSize.x; y = (sectors[i].transform.position.y - minY) / sectorSize.y; sectorIndex[(int)x, (int)y] = i; } } private int GetSectorIndex(Vector2 pos) { int x = (int)((pos.x - minX) / sectorSize.x); int y = (int)((pos.y - minY) / sectorSize.y); return sectorIndex[x, y]; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. August 2021 Melden Share Geschrieben 11. August 2021 Eine klare Unterscheidung in der Benennung zwischen Prefab und Instanz wäre ganz hilfreich. Nenne deine Prefab-Variablen am besten "XYPrefab" oder "XYPrefabs" für Listen. Ich sehe, dass du sowohl Instantiate(currentSector); als auch Destroy(currentSector); drin hast. Entweder, currentSector referenziert ein Prefab, dann darfst du es nicht zerstören, oder es referenziert eine Instanz, dann halte ich es für unwahrscheinlich, dass du davon mit Instantiate einen Klon erstellen willst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MichaelH Geschrieben 11. August 2021 Autor Melden Share Geschrieben 11. August 2021 Hab jetzt nochmal in der Scripting API ein wenig geforscht, currentSector = Instantiate( sectors[GetSectorIndex(transform.position)]); Destroy(currentSector.gameObject); das macht was ich wollte 😃 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. August 2021 Melden Share Geschrieben 11. August 2021 Sieht in der Tat besser aus Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.