pcace Geschrieben 19. Juni 2014 Melden Share Geschrieben 19. Juni 2014 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 More sharing options...
Sascha Geschrieben 19. Juni 2014 Melden Share Geschrieben 19. Juni 2014 Das sieht schon richtig aus - wenn da irgendwas zu viel passiert, dann, weil "anzahl" nen komischen wert hat. Oder du diesen Code in Update ausführt und das Kopieren deshalb jeden Frame auf's Neue los geht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
pcace Geschrieben 19. Juni 2014 Autor Melden Share Geschrieben 19. Juni 2014 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ß Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
pcace Geschrieben 19. Juni 2014 Autor Melden Share Geschrieben 19. Juni 2014 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 More sharing options...
Sascha Geschrieben 19. Juni 2014 Melden Share Geschrieben 19. Juni 2014 Man löscht mit Destroy(einGameObject). Du solltest dir aber überlegen, ob du das wirklich willst. Dutzende GameObjects pro Frame zu erzeugen und zu löschen, ist performancetechnisch... ungut. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
pcace Geschrieben 19. Juni 2014 Autor Melden Share Geschrieben 19. Juni 2014 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 More sharing options...
Sascha Geschrieben 19. Juni 2014 Melden Share Geschrieben 19. Juni 2014 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 More sharing options...
pcace Geschrieben 19. Juni 2014 Autor Melden Share Geschrieben 19. Juni 2014 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 More sharing options...
Sascha Geschrieben 19. Juni 2014 Melden Share Geschrieben 19. Juni 2014 allerdings reden wir hier nicht von tausenden, sondern genau von maximal 50 Objekten. 60fps => 60*50 = bis zu 3000 Instantiates/Destroys pro Sekunde. Dadurch, dass du den Renderer an und aus schaltest, hast du ja nicht weniger GameObjects. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
pcace Geschrieben 20. Juni 2014 Autor Melden Share Geschrieben 20. Juni 2014 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.