Unity Destroy Object error

DreamGamer

Lieutenant
Registriert
Feb. 2017
Beiträge
572
Guten Morgen miteinander, ich sitze jetzt seit längeren an einem Projekt, an dem ich einfach festhänge. Ich möchte einfach Objekte fallen lassen und sie, sobald sie nicht mehr sichtbar sind löschen. Dafür habe ich ein OutOfWindow Skript für die Objekte(Prefab) aber sobald diese gelöscht werden sollten kommt jedes mal derselbe Fehler:
Code:
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object data, UnityEngine.Vector3 pos, UnityEngine.Quaternion rot) <0x43a52660 + 0x00062> in <c8d2deaeeb3a4471b3e224c2a136823a>:0
UnityEngine.Object.Instantiate (UnityEngine.Object original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.bindings.cs:211)
UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.bindings.cs:285)
Game.Update () (at Assets/Scripts/Game.cs:77)
Ich arbeite leider noch nicht, solange mit Unity weshalb mir Google helfen musste. Nur selbst dort habe ich nichts gefunden das mir geholfen hat(vllt. bin ich auch einfach schlecht im Googeln oder google falsch) deswegen frage ich hier :) Ich habe unten einmal beide Skripte stehen und um es verständlicher zu machen ebenfalls ein Video. Ich würde mich sehr sehr sehr über Hilfe freuen :)


OutOfWIndow-Skript:
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class deleteIfOutOfWindow : MonoBehaviour
{
    private Vector2 screenBounds;
    // Start is called before the first frame update
    void Start()
    {
        screenBounds = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height));
        
    }

    void OnBecameInvisible()
    {
        if (this.gameObject != null)
        {
            DestroyImmediate(this.gameObject);
        }
    }
}

Game-Skript:
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Game : MonoBehaviour
{
    public GameObject melone;
    public float spawnRate = 2f;
    float nextSpawn = 0.0f;
    Vector2 spawnPoint;
    public Transform gamePanel;

    Vector3 touchPosWorld;
    private Vector2 screenBounds;


    // Use this for initialization
    void Start()
    {
        screenBounds = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height));

    }

    void Update()
    {
    
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            if (touch.phase == TouchPhase.Began)
            {
                Debug.Log("Began");

                Vector2 worldPoint = Camera.main.ScreenToWorldPoint(touch.position);
                RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero);
                if (hit.collider != null)
                {
                    Debug.Log(hit.collider.gameObject.name);
                }

                if (hit.collider.gameObject.tag == "melons")
                {
                    GameObject.Destroy(hit.collider.gameObject);
                }
            }

        }


        if (Time.time > nextSpawn)
        {
            nextSpawn = Time.time + spawnRate;
            spawnPoint = new Vector2(Random.Range(-screenBounds.x, screenBounds.x), screenBounds.y);
            GameObject meloneObject = Instantiate(melone, spawnPoint, Quaternion.identity);
            meloneObject.transform.SetParent(gamePanel.transform, true);
            meloneObject.layer = 0;
            meloneObject.name = "rain";
        }
    }


}



Video:

















MFG DreamGamer
 
Hi,

steht doch sehr deutlich da, wo der Fehler ist:

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.

VG,
Mad
 
Ja irgendwie schon nur verstehe ich nicht, wo ich drauf zugreife? Ich erstelle es und fertig ist, dann wird doch nie wieder damit etwas gemacht. Oder wie ist die Fehler Meldung gemeint?
 
Hi,

du scheinst irgendwo im Code darauf zuzugreifen, nachdem es "destroy"ed wurde. Kenne jetzt Unity nicht, aber kannst du da schrittweise debuggen und Breakpoints setzen? Dann findest du sicher raus, wann welches Objekt wo diesen Fehler wirft.

VG,
Mad
 
Hi,

Kenne zwar Unity selbst auch nicht. Aber dafür C# so.
Ich würde sagen die Exception Kommt aus der Zeile 40 in der Update Methode. Um die abzufangen in Zeile 38 noch auch das gameObject auf null prüfen.

MFG
poberach
 
Hi,

du benutzt die Melone als Template for neue Instanzen, aber an dieser TemplateInstanz (melon_object im Graph) hast du das OutOfWIndow gebunden. Wenn nun das "melon_object" also deine erste Melone OutOfWindow ist, löschst du es und bei deinem Instantiate() aufruf, ist die "melone" nun eine ungültige Referenz.

Erkennbar im Video: Kurz vor der Exception verschwindet melon_object aus dem ObjectGraph links.

DreamGamer schrieb:
GameObject meloneObject = Instantiate(melone, spawnPoint, Quaternion.identity);

Idee: Entweder du erstellst die Template-Melone komplett im Code, oder du sorgst dafür dass die TemplateMelone nicht zerstört wird wenn sie OutOfWindow ist.
 
Zeile 56 in der Game Klasse:
Du hast nicht das Prefab referenziert, sondern die konkrete Melone in der Scene.
Diese wird aber gelöscht und kann somit nicht mehr als "Vorlage" für neue Instanzen dienen.

Du kannst aber die Referenz direkt auf das Prefab aus deinen Assets setzen.
Dazu ziehst du das Prefab aus deinem Project-tab (nicht der Szene) auf das entsprechende Feld deiner Game-Klasse
 
@Gojira und @hoppler ohhh stimmt jetzt funktioniert es danke :D Ich habe jetzt mal beide Methoden probiert mit Sprite.create geht es ohne Probleme und jetzt auch mit Instantiate(). Danke euch :D
 
Zurück
Oben