Jump to content
Unity Insider Forum

Kopieren von GameObjects?


pcace

Recommended Posts

Hi,

 

ich habe hier eine Variable, die zwischen 1 und 50 (int) variiert. Ich möchte, dass anhand dieser Zahl mein Gameobject kopiert wird. (also sooft wie die variable)

das ganze habe ich so versucht:

 

private int anzahl, pin_multiplikator, abstand;
private GameObject[]  strassen;
private GameObject Street

 

anzahl = pin_multiplikator;
strassen = new GameObject[pin_multiplikator];
if (anzahl_temp == anzahl) {
return;
}
else
{
for (int i = 0; i < anzahl; i++) {
	strassen [i] = Instantiate (Street) as GameObject;
	strassen [i].transform.localPosition = new Vector3 (1, 1, (i * abstand));  

}
}
anzahl = anzahl_temp;

 

 

Nun ist es aber so, dass "Street" immer weiter kopiert wird.

Es scheint also etwas grob falsch zu sein.

Ich würde mich sehr freuen, wenn mir jemand eine Möglichkeit aufzeigen könnte, wie ich ein Gameobjekt genau sooft wie die Variable kopieren könnte. Oder wenn mein versuch doch nicht sooo schlecht ist, zeigen kann, was ich falsch gemacht habe!

 

 

Danke vielmals!

 

Gruß

Pcace

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, der code ist in void update()

Aber da sich der Wert anzahl ja immer ändert (abhängig von der eingabe eines potentiometers an einem Arduino )

pin_multiplikator = Mathf.RoundToInt(map ((arduino.analogRead (4)), 0, 1023, 50, 1));

 

Aber warum ist das mit dem update() ein Problem? Ich hatte genau desswegen diese Abfage mit dem anzahl == anzahl_temp gemacht, damit das ganze ding nur abgefeuert wird, wenn sich der Wert ändert.

 

Oder sehe ich da was falsch?

 

Gruß

 

Daanke!!

 

Pcace

 

 

EDIT.: ich habe glaube ich das Problem gefunden, eine Lösung aber nicht:

 

ich habe mir mal in der for schleife per Debug.log sowohl anzahl als auch anzahl_temp ausgeben lassen. das stimmt, und ist immer der Wert, den ich am arduino einstelle.

Wenn ich mir aber hinter der gesammten IF schleife auch per Debug.log anzahl und anzahl_temp ausgeben lasse, dann sind beide 0. siehe hier:

 anzahl = pin_multiplikator;
 strassen = new GameObject[pin_multiplikator];
 if (anzahl_temp == anzahl) {
  return;
 }
 else
 {
  for (int i = 0; i < anzahl; i++) {
Debug.Log("Abstand_" + abstand + " anzahl_" + anzahl);
//strassen [i] = Instantiate (Street) as GameObject;
//strassen [i].transform.localPosition = new Vector3 (1, 1, (i * abstand));
  }
 }
 anzahl = anzahl_temp;
 Debug.Log("anzahl_temp" + anzahl_temp + " anzahl_" + anzahl);

das führt dann dazu, das script immer in die for schleife rennt, obwohl es das eigentlich nicht soll. Irgendeine Idee, was da falsch ist?

Kann es daran liegen, dass ich auch jedes Frame das hier mache:

 pin_multiplikator = Mathf.RoundToInt(map ((arduino.analogRead (4)), 0, 1023, 50, 1)); //range 1 - 50 multiplikatoren

 

 

Gruß

post-4513-0-97210700-1403188439_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok,

 

ich habe es nun so gemacht und es funktioniert etwas besser:

 

 strassen = new GameObject[pin_multiplikator];

 if (anzahl_temp == pin_multiplikator)
  {
   return;
  }
 else {
  for (int i = 0; i < pin_multiplikator; i++)
   {
   Debug.Log("pin multi:  " + pin_multiplikator + " anzahl temp" + anzahl);
   strassen [i] = Instantiate (Street) as GameObject;
   strassen [i].transform.localPosition = new Vector3 (1, 1, (i * abstand));
   }
  }
 anzahl_temp = pin_multiplikator

 

Problem nun is, dass ich nun immer mehr objekte erstelle, immer genau so viele wie pin_multiplikator groß ist. Blöderweise werden die natürlich nicht gelöscht. Irgendeine Idee wie ich das anstellen könnte?

 

Da die kopien auch alle "Strasse(Clone)" heissen, kann ich auch schwierig nach namen gehen.

btw: wie löscht man überhaupt Gameobjects?

 

Gruß

 

pcace

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

 

ich habe mir jetzt nochmal ein paar gedanken gemacht und komme auf nichts besseres als das:

for (int i = 0; i < pin_multiplikator; i++)
   {

   if (GameObject.Find ("Strasse" + i) == null)
   {
   strassen [i] = Instantiate (Street) as GameObject; //Strasse clonen
   strassen [i].name = "Strasse"+ i;  //bsp Name: "Strasse4"
 strassen [i].transform.localPosition = new Vector3 (0, 0, (bounds_strasse.size.z*i));

   }
   }
 if (GameObject.Find ("Strasse" + pin_multiplikator) != null) {
  for (int j = pin_multiplikator; j < max_anzahl; j++) {
   GameObject.Destroy (GameObject.Find ("Strasse" + j));
  }

   }

 

Macht das mehr sinn?

ich habe jetzt versucht, erst zu schauen, ob ein objekt da ist und nur wenn nicht ein anderes zu erzeugen...

 

 

gruß

 

Pcace

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ouh, GameObject.Find... tausende Instantiates und Destroys pro Sekunde... das ist nicht gerade performant... (vorsichtig ausgedrückt).

Wie wäre es mit sowas... alle Objekte sind schon instanziiert (bzw. werden es in Start) und sind in einem Array drin.

for(var i = 0; i < max; i++)
{
 strassen[i].renderer.enabled = i < pin_multiplikator;
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm,

na das könnte auch gehen ;)

allerdings reden wir hier nicht von tausenden, sondern genau von maximal 50 Objekten. das nächste problem ist, dass ich die ganzen GameObjekte zu beliebiger Zeit zur laufzeit als OBJ exportieren muss. das ganze habe ich (mit seeehr viel hilfe ;) ) so gelöst:

http://forum.unity3d.com/threads/export-obj-while-runtime.252262/#post-1667903

 

Dafür brauche ich allerdings gameobjects.

 

Gruß

 

Pcace

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das stimmt, nicht weniger gameobjects, aber ich glaube doch zu viele!

 

Aber du hast schon recht.. so richtig gut ist das nicht. Allerdings läuft das hier sehr sehr flüssig!

So mache ich es jetzt:

 strassen = new GameObject[pin_multiplikator];

 for (int i = 0; i < pin_multiplikator; i++)
   {

   if (GameObject.Find ("Strasse" + i) == null)
   {
   strassen [i] = Instantiate (Street) as GameObject; //Strasse clonen
   strassen [i].name = "Strasse"+ i;  //bsp Name: "Strasse4"

   }
   }
 if (GameObject.Find ("Strasse" + pin_multiplikator) != null) {
  for (int j = pin_multiplikator; j < max_anzahl; j++) {
   GameObject.Destroy (GameObject.Find ("Strasse" + j));
  }
   }
 for (int k = 0; k < pin_multiplikator; k++) {
  GameObject.Find ("Strasse" + k).transform.localScale = Street.transform.localScale;
  GameObject.Find ("Strasse" + k).transform.localPosition = new Vector3 (0,0,bounds_strasse.size.z*k);
   }

 

 

Grüße,

 

Pcace

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...