Unity3D ArgumentException: The Object you want to instantiate is null?
Hallo liebe Programmierfreunde da draußen. :)
Ich arbeite gerade an einem Ich-bin-ein-Ball-und-sammle-kleine-Würfel-ein-Spiel, bin aber noch ziemlicher Anfänger. Vor allem was das Coden angeht.
Ich möchte gerne, dass beim Einsammeln der Würfel ein Licht, also ein neues GameObject entsteht. Dafür habe ich dieses Script geschrieben:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateObject : MonoBehaviour
{
public Transform Spawnpoint;
public GameObject Prefab;
private void Start()
{
}
void OnTriggerEnter()
{
Instantiate(Prefab, Spawnpoint.position, Spawnpoint.rotation);
}
}
Natürlich habe ich mehrere aufsammelbare Würfel im Level. Jeder von ihnen hat dieses Script und jeweils ein eigenes EmptyGameObject als SpawnPoint. Das Licht ist ein Prefab und alle Würfel nutzen dieses eine.
Ich habe also einen Original-Würfel erstellt, den dann per Copy & Paste vervielfacht, alle in der Welt verteilt und jeder Kopie einen eigenen SpawnPoint für sein Licht gegeben.
So, wenn ich jetzt aber das Spiel starte, werden bei allen Würfeln, außer dem ersten Original-Würfel, unendlich Klone des Licht-Prefabs erstellt, ohne, dass ich irgendetwas mache. Dabei bekam ich diese Fehlermeldung:
UnassignedReferenceException: The variable Spawnpoint of CreateObject has not been assigned.
Nach ein bisschen Recherche habe ich diese Zeile in void start hinzugefügt:
Prefab = GameObject.FindGameObjectWithTag("SpawnLight");
So, jetzt war diese Fehlermeldung weg, aber leider auch meine Lichter. Wenn ich jetzt einen Würfel aufsammle, bleibt es dunkel. Dafür bekomme ich eine nette Fehlermeldung, welche mich wissen lässt:
ArgumentException: The Object you want to instantiate is null.
Ich habe leider keine Ahnung, was ich machen muss, um meine netten, kleinen Lichter zurückzubekommen... 😟
Ich freue mich über Hilfe jeglicher Form und bin mir sicher, dass es irgendwo da draußen jemanden gibt, der mir den Weg zum Licht zeigen und ebnen kann.
Vielen Dank schon einmal
KomischerLappen 😃
2 Antworten
In deinem Script wird nirgends die Variable "Spawnpoint" gesetzt. Hast du das im Inspektor gemacht? Wenn nicht kannst du im Script bei Instantiate auch dies schreiben:
Instantiate(Prefab, transform.position, transform.rotation);
Und wie oder wo setzt du "Prefab"?
Ok, ich habe es gelöst...Ziemlich lustig um ehrlich zu sein :D
Durch meine "OnTriggerEnter" Abfrage wird jeder Trigger berücksichtigt und mein Würfel hing ein kleines Stück im Boden....Eieiei...2 Stunden Kopfzerbrechen für nichts xD
Trozdem danke nochmal :)
Zu wenig Code, zu viel gelaber.
Mal ehrlich, wie soll man dir helfen wenn du weder zum Punkt des Problems kommst, noch genug Quellcode zeigst um nachzuvollziehen was du tust.
Prefab = GameObject.FindGameObjectWithTag ("SpawnLight");
Ausm Stehgreif: Da du sagst du hast kein Licht, hast du den Tag "SpawnLight" irgendwo gesetzt?
Hey vielen Dank für deine Antwort trotz meiner zu Ausführlichen Umschreibung :)
Ja natürlich habe ich dem Licht Prefab diesen Tag zugesprochen!
Kannst du deinen Quellcode debuggen? Ich kenne mich mit Unity3D leider gar nicht aus. Falls ja, dann sag mal bitte WO deine Exception geworfen wird.
Also wenn ich in der Unity3d Cosole einen Doppelklick auf die Fehlermeldung mache, wirft er mich immer automatisch zu dieser Stelle im Script:
Instantiate(Prefab, Spawnpoint.position, Spawnpoint.rotation);
Da er sagt, ArgumentException, erstellt er ggf. das Object Prefab nicht. Wenn du mit der Funtion FindGameObjectWithTag dein Prefab Object erstellst, dann funktioniert das ggf. nicht. Prüf das mal. Ansonsten: Was genau macht Instantiate?
Ne mit "FindGameObjectWithTag" definiere ich nur um welche GameObjects es sich bei den zu erstellenden Prefabs handelt. Nämlich alle mit dem Tag "SpawnLight".
Instantiate position und rotation übergibt einfach nur die Position und die Rotation an ein anderes Objekt, in meinem Fall dem Prefab.
Ok, ich habe es gelöst...Ziemlich lustig um ehrlich zu sein :D
Durch meine "OnTriggerEnter" Abfrage wird jeder Trigger berücksichtigt und mein Würfel hing ein kleines Stück im Boden....Eieiei...2 Stunden Kopfzerbrechen für nichts xD
Trozdem danke nochmal :)
Vielen Dank für deine Antwort!
Ich habe ein EmptyGameObject im Inspector in die Public Variable "Spawnpoint" gesetzt. Mit dem kreieren des public Transform Spawnpoint habe ich im Inspector dafür das Feld bekommen.
Wie meinst du "wie oder wo setzt du "Prefab"?"