Jump to content
Unity Insider Forum

Aus mehreren initialisieren Prefabs genau eins auswählen und eine Funktion ausführen


Erik

Recommended Posts

Hey, versuche schon seit Tagen das Problem zu lösen und dachte ich versuche jetzt hier mein Glück.

Mein Problem:

Ich habe eine Klasse Namens "Kanone" welche die Funktion "Shoot()" besitzt. Ich habe eine Kanone als GameObjekt erstellt, habe das Script hinzugefügt und das GameObjekt als Prefab abgespeichert.

Jetzt kann ich mithilfe eines Buttons, ein neues Gameobjekt "newKanone" aus dem Prefab erzeugen. -> Die Koordinaten übergebe ich als Variablen.

Die Kanone erzeuge ich wie folgt:  GameObject newKanone = Instantiate(Kanone, this.Position_x_y, Quaternion.Euler(0, 0, this.Winkel));

Danach gebe ich der Kanone noch einen bestimmten Tag, den ich auch über den Button mitgebe: newKanone.tag = "kanone1".

Das klappt alles ziemlich gut.

Ich drücke zwei mal den Button und habe nun zwei GameObjekts "newKanone" an den entsprechenden Koordinaten initialisiert.

 

Jetzt suche ich nach einer Möglichkeit EINE der beiden Kanonen auszuwählen und die Funktion "Shoot()" NUR auf der ausgewählten Instanz auszuführen. Die Art und Weise wie das Prefab ausgewählt wird ist dabei neben sächlich. Mir geht es Hauptsächlich um die Theorie. Zum testen würde ich gerne einen Button, welchen ich in irgendeiner Art und Weise die Information, um welche Kanone es sich handelt, mitgeben kann -> z.b durch den Tag der Kanone. (hat bei mir leider nicht funktioniert)

Wenn der Button gedrückt wird, soll die Funktion "Shoot()" auf dieser Instanz ausgeführt werden.

Den Ablauf der Umsetzung habe ich mir wie folgt vorgestellt:

1. Ich übergebe den Button den Tag der initialisierten Kanone.

2. Ich suche mithilfe des Tags die entsprechende Kanone und speichere mit diese in einer Variablen. -> ausgewählteKanone = GameObject.FindWithTag("kanone1");

3. In der Variablen "ausgewählteKanone" befindet sich das entsprechende GameObjekt "newKanone", also eine Instanz/Prefab der Klasse "Kanone".

4. Jetzt möchte ich die Funktion der Klasse aufrunfen -> ausgewählteKanone.shoot();

 

Leider hat das alles nicht funktioniert. Hat einer von euch vielleicht eine Idee wie man so etwas umsetzen könnte? Ich habe das Gefühl das ich etwas grundlegendes falsch verstanden habe. Ein Codespiel wäre Klasse aber mir würde natürlich auch ein theoretischer Ablauf/Ideen extrem weiterhelfen:).

Über eure Hilfe würde ich mich sehr freuen!

Mfg Erik

 

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin kein fan von Tags bei solchen Dingen, deswegen hier mal Grob wie ich das machen würde.
Wenn du die neue Kanone erstellst also mit newKanone, dann füge das doch in eine Liste hinzu. Beispiel List<Kanone> kanonenListe.
Die Instanz kann auch eine ID beinhalten, wenn du wirklich unterscheiden musst und relevant ist. Beispiel ID 1.

Jetzt kannst du Beispiel ne UI erstellen und siehst die Kanonen mit IDs und kannst sie auswählen. Oder per script auf die Liste zugreifen und durch loopen bis die ID == 1 ist. Bei sowas benutze ich gerne static Listen. Beispiel (in der Kanone Klasse):

public static List<Kanone> kanonenListe = new List<Kanone>().

void Start()
{
	this.Id = kanonenListe.Count;
}

void OnEnable()
{
	kanonenListe.Add(this);  
}
  
void OnDisable()
{
	kanonenListe.Remove(this);  
}

kanonenListe wird auch immer leer sein, wenn man eine Scene wechselt, da ja OnDisable aufgerufen wird, wenn der Component zerstört oder deaktiviert wird.
Vllt dazu noch Find funktionen schreiben.

public static bool TryFindById(int id, out Kanone kanone)
{
	kanone = null;
	foreach(Kanone k in kanonenListe)
	{
		if(k.Id == id)
		{
			kanone = k;
			return true;
		}
	}

	return false;
}

jetzt kannst du einfach das machen

if( Kanone.TryFindById(1, out var kanone) )
{
  Debug.Log("Kanone wurde gefunden: " + kanone.Id);
} else {
	Debug.Log("Nicht gefunden"); 
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb MaZy:

Ich bin kein fan von Tags bei solchen Dingen, deswegen hier mal Grob wie ich das machen würde.
Wenn du die neue Kanone erstellst also mit newKanone, dann füge das doch in eine Liste hinzu. Beispiel List<Kanone> kanonenListe.
Die Instanz kann auch eine ID beinhalten, wenn du wirklich unterscheiden musst und relevant ist. Beispiel ID 1.

Jetzt kannst du Beispiel ne UI erstellen und siehst die Kanonen mit IDs und kannst sie auswählen. Oder per script auf die Liste zugreifen und durch loopen bis die ID == 1 ist. Bei sowas benutze ich gerne static Listen. Beispiel (in der Kanone Klasse):

public static List<Kanone> kanonenListe = new List<Kanone>().

void Start()
{
	this.Id = kanonenListe.Count;
}

void OnEnable()
{
	kanonenListe.Add(this);  
}
  
void OnDisable()
{
	kanonenListe.Remove(this);  
}

kanonenListe wird auch immer leer sein, wenn man eine Scene wechselt, da ja OnDisable aufgerufen wird, wenn der Component zerstört oder deaktiviert wird.
Vllt dazu noch Find funktionen schreiben.

public static bool TryFindById(int id, out Kanone kanone)
{
	kanone = null;
	foreach(Kanone k in kanonenListe)
	{
		if(k.Id == id)
		{
			kanone = k;
			return true;
		}
	}

	return false;
}

jetzt kannst du einfach das machen

if( Kanone.TryFindById(1, out var kanone) )
{
  Debug.Log("Kanone wurde gefunden: " + kanone.Id);
} else {
	Debug.Log("Nicht gefunden"); 
}

 

Danke für die ausführliche Erklärung!

Ich werde mich mal mit den Listen beschäftigen und heute Abend deine Vorschläge ausprobieren.

Ich werde dir nochmal bescheid geben ob ich es hinbekommen habe:D.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 23 Stunden schrieb MaZy:

Ich bin kein fan von Tags bei solchen Dingen, deswegen hier mal Grob wie ich das machen würde.
Wenn du die neue Kanone erstellst also mit newKanone, dann füge das doch in eine Liste hinzu. Beispiel List<Kanone> kanonenListe.
Die Instanz kann auch eine ID beinhalten, wenn du wirklich unterscheiden musst und relevant ist. Beispiel ID 1.

Jetzt kannst du Beispiel ne UI erstellen und siehst die Kanonen mit IDs und kannst sie auswählen. Oder per script auf die Liste zugreifen und durch loopen bis die ID == 1 ist. Bei sowas benutze ich gerne static Listen. Beispiel (in der Kanone Klasse):

public static List<Kanone> kanonenListe = new List<Kanone>().

void Start()
{
	this.Id = kanonenListe.Count;
}

void OnEnable()
{
	kanonenListe.Add(this);  
}
  
void OnDisable()
{
	kanonenListe.Remove(this);  
}

kanonenListe wird auch immer leer sein, wenn man eine Scene wechselt, da ja OnDisable aufgerufen wird, wenn der Component zerstört oder deaktiviert wird.
Vllt dazu noch Find funktionen schreiben.

public static bool TryFindById(int id, out Kanone kanone)
{
	kanone = null;
	foreach(Kanone k in kanonenListe)
	{
		if(k.Id == id)
		{
			kanone = k;
			return true;
		}
	}

	return false;
}

jetzt kannst du einfach das machen

if( Kanone.TryFindById(1, out var kanone) )
{
  Debug.Log("Kanone wurde gefunden: " + kanone.Id);
} else {
	Debug.Log("Nicht gefunden"); 
}

 

Danke das hat wunderbar funktioniert!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...