Jump to content
Unity Insider Forum

mauer mit einer schleife erstellen? verstehe das mit der schleife dabei nicht so ganz


tobi_de

Recommended Posts

hi.

 

ich komme mit der schleifen steuerung einfach nicht zurecht irgendwie.

 

ich verstehe zwar teils wie es läuft... aber nur teils :(

 

 

ich soll aktuell für die schule eine mauer erstellen die aus würfeln besteht.

die anzahl der elemente für die höhe der mauer und der breite der mauer soll im inspector eingestellt werden können.

sogar den würfel soll man über den inspector von aussen wählen können.

für das ganze soll ein skript mit javascript erstellt werden was eine schleife benutzt.

 

könnt ihr mir da evtl weiter helfen und es mir auch erklären das ich es endlich mal kapiere?

 

ich habe immer das gefühl mein lehrer spricht spanisch mit mir :blink:

 

will das endlich mal richtig verstehen :)

 

wäre euch echt dankbar

Link zu diesem Kommentar
Auf anderen Seiten teilen

using UnityEngine;
using System.Collections;
public class Mauer : MonoBehaviour {
public GameObject wallpart;
public int height;
public int length;
void Start () {
 for(int l = 0;l<length;l++)
 {
  for(int h = 0;h<height;h++)
  {
Instantiate(wallpart,new Vector3(l*(2*wallpart.GetComponent<MeshRenderer>().bounds.extents.x),h*(2*wallpart.GetComponent<MeshRenderer>().bounds.extents.y),0),new Quaternion(0,0,0,0));
  }
 }
}
}

 

Ich würde es so machen, ist leider C# vllt bringt es dir ja trotzdem was.

 

 

Ps. Man könnte GetComponent auch nur einmal ausführen was von der Performance her besser wäre.

 

MeshRenderer mr;

mr = wallpart.GetComponent<MeshRenderer>();

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke. sieht sehr intressant aus :)

 

nur leider bringt es mir nicht wirklich etwas da ich es in javascript erstellen soll :unsure:

 

ich wäre euch über eine hilfe mit kleiner erklärung sehr dankbar.

 

ich würde es halt selber gerne endlich 100%tig verstehen und auch problemlos anwenden können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

nuja so ganz verstehe ich es leider nicht :(

 

so in etwa bekomme ich das ja mit der schleife recht ok hin.

also ich verstehe den sinn und die abfolge mitlerweile.

 

nur könnt ihr mir denn mit dem befehl weiter helfen welches im skript ein ausgewähltes objekt in javaskript quasi kopiert und einfügen kann wenn eines im inspector ausgewählt ist?

 

muss ich danach das skript einem lehren objekt zufügen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich dich richtig verstehe willst du wissen was Instantiate macht oder was?

Und falls ja, wie sollen wir dir da weiterhelfen. Du musst schon sagen was genau du verstehst und wo deine Lücken sind.

So eine Aussage wie "könnt ihr mir da evtl weiter helfen und es mir auch erklären das ich es endlich mal kapiere" ist da oftmals nicht wirklich präzise^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich versuch es mal.

Du brauchst um so eine Mauer zu erstellen 2 for - Schleifen. Nun was macht eine schleife genau:

Die Schleife wiederholt sich, mit allem was sie ausführen soll, so lange bis ein bestimmtes Ereigniss eintritt. Klassisches Beispiel:

while(boolean Bedingung)
{
	  Debug.Log("Hi");
}

 

Also diese while schleife würde jetzt so lange ein "Hi" ausspucken bis der boolean Bedingung == false ist.

Eine For-Schleife ist wie aufgebaut

for(int x = 0;x < länge;x)
{
    Debug.Log("Hi" + x);
}

Mit dem "int x = 0" initalisierst du eine neue Variable und gibs den Startwert direkt mit an

"x < länge" ist deine bedingung der Schleife, solange diese nicht erfüllt worden ist wird diese Schleife sich immer wiederholen

"x++" wird bei jedem Schleifen durchlauf durchgeführt

Also kann man sie benutzten um zum beispiel irgend etwas 20 mal auszuführen.

 

Es gäbe jetzt noch viele weitere Schleifen die sollten aber für die lösung deines Problems nicht so relevant sein und ich bin dafür zu faul weshalb ich jetzt nur bei den 2 bleibe

 

Um das Object zu erstellen(man könnte es auch Spawnen oder so was nennen) benutzt man Instantiate. Beispiel

//Ich möchte jetzt was spawnen/erstellen
Instantiate(GameObject,Vector3,Quanterion);

Ins GameObject kommt dein Object rein, also in dem Falle dein Würfel.

Mit dem Vector3 gibst du die Position an wo dein GameObject spawnen bzw erstellt werden soll

Und mit dem Quanterion gibst du die drehung des Würfels an aber bei deinem fall reicht es Quanterion.identity zu schreiben welche die Winkel auf null setzt

 

Ich hoffe ich konnte dir damit weiterhelfen.

Da ich schon halb am schlafen bin und einen anstrengenden Tag hatte, bitte ich für Rechtschreibfehler und unkorrekte Formulierungen, im fachlichen Sinne, um entschuldigung

 

MFG

 

GelegenheitsProgrammierer

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zusatzinfo zu Schleifen:

Schleifen werden immer am Stück ausgeführt. D.h. das komplette Projekt hält solange an, wie die Schleife am durchlaufen ist. Wird die Bedingung zum beenden einer Schleife also nicht erfüllt, bleibt dein Spiel hängen, bis sie erfüllt ist.

 

Hier teitt das große Problem der while Schleife ein, dass das Game komplett zum Absturz gebracht wird, da der Frame indem die Schleife läuft nie endet.

 

Die For Schleife hingegen beendet sich, vorrausgesetzt das ++ und -- ist richtig, von selbst sobald das Ziel erreicht ist.

 

Soll das Spiel paralell zur Schleife weiterlaufen, solltest du diese entweder in ein IENumerator packen und mit yield und waitforendofframe immer wieder unterbrechen, oder du nutzt einen selbstgebauten counter über die Update Methode. Heisst:

int startwert = 0;
int zielwert = 10;
[...]
void Update(){
[...]
if(startwert < zielwert){
   instantiate(...);
   startwert ++;
}
[...]
}

ist aber umständlich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ah ok vielen dank.

nun habe ich es zumindest besser verstanden.

ich werde mich später dann mal an das skript setzen und hoffe das ich es nun hin bekomme.

 

bei "Instantiate(GameObject,Vector3,Quanterion);" kann ich ja dann als "GameObject" das im inspector auswählbare objekt rein setzen oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

ah ok ^^

 

leider habe ich es heut zeitlich zwar noch nicht geschaft da ich noch unterwegs bin.

aber morgen werde ich mich ans skript setzen :-)

 

eine frage habe ich allerdings noch.

 

das mit dem objekt einfügen durch eine schleife mit "Instantiate".

wenn ich ja damit eine mauer erstelen will muss ja logischerweise das objekt dann auch in der höhe und seite mitwandern.

wenn aber nun durch die schleife für z.b. die seite der wert 10 gesetzt wäre, dann fügt der ja zwar wenn alles läuft 10 objekte ein, aber allerdings alle an der selben stelle oder?

da ja ein belibig großes objekt gewählt werden kann reicht ja leider auch kein bewegen in der achse zusätzlich um einen festen wert.

 

da habe ich gerade absolut keine idee wie das gehen soll oder irre ich mich da :blink:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du multiplizierst die 10 mit der int Variablen aus der Schleife (also "h" bzw. "l").

 

1 Durchgang: 10 * 0 = 0

2 Durchgang: 10 * 1 = 10

3 Durchgang: 10 * 2 = 20

 

usw.

 

Das wird im Worldspace allerdings nicht viel bringen. Deshalb benötigst du ein Parent Object, damit du im Localspace arbeiten kannst. 0 wäre dann exakt die gleiche Position, wie die des Parents.

 

grüße

reinerSCT

Link zu diesem Kommentar
Auf anderen Seiten teilen

for(int x = 0;x<10;x++)
{
//hier kannst du nur auf x zugreifen
    for(int y = 0;y<10;y++)
	 {
	 //Hier kannst du auf x und y zugreifen
	 Debug.Log(x +"/"+y);
	 }
}

 

Du must einfach deine initalisierten int variablen in den Vector3 einbauen.

Die später im Programm wird da einfach nur ne Wand erscheinen, doch jeder Block wird einzelnd nach einander gesetzt siehst du einfach nur nicht weil zu schwer

Link zu diesem Kommentar
Auf anderen Seiten teilen

sooo der anfang steht soweit und es werden auch die angegebenen objekte erstellt die im inspector eingegeben werden.

 

#pragma strict

 

var hoehe = 0;

var breite = 0;

var object : Transform;

 

function Start () {

 

for (var counterh : int = 1; counterh <= hoehe; counterh++)

Instantiate (object, Vector3(0, 0, 0),transform.rotation);

 

 

for (var counterb : int = 1; counterb <= breite; counterb++)

Instantiate (object, Vector3(0, 0, 0),transform.rotation);

 

 

wenn ich jetzt bei höhe 5 eingebe und bei breite 5 clont der 10 objekte und fügt die an der gleichen stelle ein.

normalerweise müsste der ja die höhe mal der breite nehmen also 25 einfügen, aber die dann weiterhin nur 5 hoch anordnen.

nur wo muss ich das multiplizieren bzw wie schaffe ich es das die steine nicht nur an einer stelle spawnen sondern eine wirkliche mauer bilden?

 

bekomme leider immer nur falsche ergebnisse beim rumprobieren :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

naja als erstes musst du die forschleife für die breite in die forschleife für die höhe schreiben

 

public GameObject Mauerblock;
public int MaxBreite;
public int MaxHoehe;
// Use this for initialization
void Start ()
{
 for(int breite = 0;breite < MaxBreite;breite++)
 {
  for(int hoehe = 0;hoehe < MaxHoehe;hoehe++)
  {
   Instantiate(Mauerblock,new Vector3(breite,hoehe,0),Quaternion.identity);
  }
 }
}

 

Eigendlich ist das nicht so schwer.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde ja empfehlen den nicht nur mit Code zu bewerfen sondern vielleicht auch zu versuchen das ganze zu erklären^^.

 

Du willst ja z.b 5*5 Objekte erstellen und diese schön als eine Mauer platzieren. So nun bedenk mal wieviele Objekte du mit einer solchen for-Schleife generierst.

for (var counterh : int = 1; counterh <= 5; counterh++)
Instantiate (object, Vector3(0, 0, 0),transform.rotation);

 

Exakt 5 Objekte, weil counterh<=5 besagt das man nur 5 erstellen soll.

Das ganze machst du nun 2 mal, dementsprechend entstehen 5 + 5 Objekte. Du willst aber 25 haben.

 

Was GelegenheitsProgrammierer nun gemacht hat ist folgendes:

for(int x = 0; x < 5; x++)//Wird 5 mal wiederholt
{
  for(int y = 0; y < 5; y++) //Wird ebenfalls 5mal wiederholt
  {
  }
}

So nun überleg einfach mal, für jeden durchgang der ersten Schleife wird eine 2 Schleife ausgeführt die ebenfalls 5 mal durchläuft.

Im Klartext für 1 Feld auf der x Achse werden 5 weitere auf der y Achse generiert. Damit haben wir 5*5=25 Objekte und nicht wie zuvor nur 10.

Was lernt man daraus, wenn du "multiplizieren" willst dann müssen die For Schleifen inneinander geschachtelt werden.

 

Edit:

 

Oder um es dir nochmal anders zu erklären:

 

 

 

for(int i = 0; i < 5; i++); /5 Objekte werden erstellt, ich will aber 25 haben...
for(int i = 0; i < 5; i++); //10
for(int i = 0; i < 5; i++); //15
for(int i = 0; i < 5; i++); //20
for(int i = 0; i < 5; i++); //25
//Wie man sieht wird ein und diesselbe For-Schleife 5 mal hintereinander ausgeführt. Und was sollte man benutzen um den Code nun übersichtlicher zu machen?
//Richtig ne For-Schleife
for(int i = 0; i < 5; i++)
{
  for(int x = 0; x < 5; x++);
}

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

ahhhhhh da ist endlich der klick bei mir gekommen und ich habe das mit der schleife endlich verstanden. :D

vielen dank.

 

stimmt... die schleife muss ja in der schleife laufen.

super das klappt nun soweit das das eine mit dem anderen multipliziert

 

#pragma strict

 

var hoehe = 0;

var breite = 0;

var object : Transform;

 

function Start () {

 

 

for(var x : int = 0; x < hoehe; x++)//Wird durch den wert der höhe wiederholt

{

for(var y : int = 0; y < breite; y++) //Wird durch den wert der breite wiederholt

{ Instantiate (object, Vector3(0, 0, 0),transform.rotation);

 

}

}

}

 

jetzt bräuchte ich nur noch hilfe wie ich das anstelle das ich wenn ich z.b. im inspector die höhe von 4 eingebe und die breite von z.b. 8 das das skript es auch so vernünftig wie eine mauer 4 hoch und 8 breit plaziert.

 

dazu muss die erste schleife doch eigentlich die höhe gestapelt ausgeben und das ganze in der breite wiederholen oder?

 

da habe ich gerade nur nicht wirklich eine idee wie ich das anstellen soll :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast bei Instantiate die Möglichkeit eine Position mitzugeben, an dieser Stelle werden die Objekte dann gespawnt. Dementsprechend musst du wohl was an deinem Vector3 verändern.

Ein Vector3 besteht aus 3 Variablen (X-Koordinate, Y-Koordinate, Z-Koordinate). Ein Standardwürfel in Unity ist exakt 1 Unit breit und 1 Unit hoch, wenn du nun erstmal nur eine Mauer aus diesen Standardwürfeln erstellen willst musst du also immer 1 Unit weiter gehen. Und da wir in unserer Schleife bereits +1 auf x oder y rechnen, müssen wir uns darüber erstmal keine Sorgen mehr machen.

 

So, jetzt bedenk einfach mal wie sich deine Werte beim Schleifendurchlauf ändern:

1 Durchlauf x = 0 und y = 0

2 Durchlauf x = 0 und y = 1

...

6 Durchlauf x = 1 und y = 0

 

Wie du siehst läuftst du auch bereits über jeden Punkt in deiner Mauer. Das einzige was du wirklich machen musst ist diese Punkte an dein Instantiate weiterzugeben. Und wie zuvor erwähnt kann man das mit dem Vector3 machen. Übrigens wurde dir die Lösung dafür auch schon zuvor von GelegenheitsProgrammierer gezeigt. Du solltest den Code auch genau lesen^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du schreibst immer

new Vector3(0,0,0)
// Da musst du aber schreiben
new Vector3(x,y,0)

wobei du x und y von deinen forschleifen bekommst.

 

Was das bewerfen mit Code angeht Djeurissen

Wir haben versucht es ihm zu erklären, doch was programmieren angeht hat er anscheinend noch nicht so viel erfahrung,

weshalb ich ihm auch raten würde sich erst noch ein programmierkenntnisse anzueignen bevor er mit Unity fort fährt, denn schleifen sind Basics meiner Meinung.

 

Doch trotz all dem

tobi_de

 

schau mal heir vorbei https://www.youtube.com/user/hummelwalker

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich gebe zu ich habe nicht den kompletten Thread gelesen, aber aus dem 1 Post kann man ja herrauslesen das er anscheinend einen programmierlehrer hat und bei diesem nicht alles versteht.

Dementsprechend währe es ja ganz hilfreich ihm das zu erklären. Aber ja, Tutorials würden nicht schaden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

aaaaarrrrrggg....

ich bin echt ein eierkopp...

ich hab mich zu sehr auf die schleife versteift das ich den rest nicht gerallt habe.

 

alles klar jetzt hab ichs auch wirklich verstanden :D

 

echt vielen herzlichen dank.

 

 

ich bin halt leider nicht der skripter... meine stärken liegen eher in der 3D bearbeitung und im lvl bzw objekt design.

aber ich möchte halt wenigstens die grundlagen verstehen.

 

nochmals danke ihr seid echt spitze :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...