Jump to content
Unity Insider Forum

Prefab Variant Variant(Clone) entfernen


MichaelH

Recommended Posts

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:

prefab.thumb.png.3dd79344fe73dd008dbdca639a2c93fa.png 

Das kann doch nicht so schwer sein ?!?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...