Jump to content
Unity Insider Forum

Sascha

Administrators
  • Gesamte Inhalte

    13.619
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    780

Alle erstellten Inhalte von Sascha

  1. Sascha

    klar wie Glas

    Alles, was in der "Transparent"-Unterkategorie bei den Shadern ist, hilf Dir. Abgesehen von denen unter "Transparent/Cutout", die machen nämlich nur sichtbar/unsichtbar und nichts dazwischen.
  2. void bedeutet: Kein Rückgabewert. Das kommt - in Unity - nur bei c# zum Einsatz, da JavaScript es mit den Datentypen immer nicht so eng sieht. Wenn die Funktion in c# per return einen Wert zurück gibt, muss anstatt void der Datentyp stehen.
  3. ...und zwar: Jetzt. 1000 Posts!

    1. Lars
    2. Cireva

      Cireva

      jetzt noch die 100 member^^

  4. Bin durch Lars und seine Info über den Wettbewerb auf IndieDB gelandet, und siehe da: Da hab ich geschaut
  5. Ganz schick soweit! Ein bisschen Air Control fänd ich allerdings nett. Des weiteren ist es manchmal schwer zu sehen, wenn man nach vorne oder hinten gehen muss, und das Menü ist etwas unübersichtlich, da schwer lesbare Schrift und vorm Hover keine Unterscheidung zwischen klickbarer und unanklickbarer Schrift. Dennoch spaßig irgendwie ^^
  6. Hallo, Um das Spiel zu Unterbrechen, benutze ich Time.timeScale = 0; Dieser Code setzt Time.deltaTime auf fortan 0, und das gilt auch für die Physik. Klappe zu, Affe tot. Wenn ich jetzt in der Pause etwas animieren will, bietet sich natürlich folgendes an: private var lastRealTime : float; function Update() { var delta : float = Time.realtimeSinceStartup - lastRealTime; //Mit delta anstatt Time.deltaTime arbeiten lastRealTime = Time.realtimeSinceStartup; } Klappt soweit auch. Jetzt das Problem: Time.realtimeSinceStartup beinhaltet wirklich die realtime. Soll heißen: Wenn das Spiel richtig unterbrochen wird, eben z.B. durch Fokusverlust, dann läuft dieses Teil weiter. Weiß jemand, wie ich den Fokus des Spiels ermittele, oder noch besser, wie ich Time.realtimeSinceStartup ersetze/modifiziere, sodass ich nur die Zeit seit Spielbeginn mit Fokus erhalte? Danke im voraus
  7. Sascha

    Phex

    Auch von mir ein Willkommen. Ich steh auf Scriptfragen
  8. Nachtrag: Jetzt hier Community Manager. Ich freue mich drauf!
  9. Sascha

    Haegar

    So isset. Willkommen!
  10. Die war mir zu speziell, um sie da einzubauen... mach ich aber vielleicht doch noch. //e: Ist eingefügt.
  11. Und noch ein Tutorial...

  12. Willkommen! Das Problem kenne ich, ich denke auch ständig daran, wie wohl die Shader für bestimmte Oberflächen aussehen sollten...
  13. Wer sich das Tutorial für Einsteiger in aller Gemütlichkeit durch gelesen hat, wird jetzt vermutlich etwas ordentliches scripten wollen. Also machen wir uns mal an die etwas fortschrittlicheren Sachen ran. Scripten in Unity für Nicht-mehr-Einsteiger Teil 1 - Kommentare Das ist eigentlich fast schon eine Nebensache, da sie für das Programm keine Relevanz haben: Kommentare. Sie sind dazu da, um den Überblick zu behalten, oder auch, um anderen etwas zu verdeutlichen. Es gibt zwei Sorten von Kommentaren: Einzeilige und Blockkommentare. Einzeilig: //Alles was hinter den beiden Schrägstrichen steht, ist ein Kommentar und wird vom Programm nicht beachtet Block: /* Hiermit gehen auch mehrzeilige Kommentare */ Kommentare werden von ordentlichen Editoren (und der Unity-Scripteditor gehört dazu) farblich abgesondert; praktisch. Kommentare haben einen weiteren Nutzen: Man kann Programmteile "auskommentieren". Setzt man vor eine Anweisung die beiden // , dann wird sie natürlich nicht mehr ausgeführt. So kann man, falls man will, das Script testen, wie es ohne läuft. Teil 2 - Die If-Abfrage Eine Funktion löst eine andere aus - das ist ja schon ganz nett. Aber will man ein Spiel schreiben, reicht das noch lange nicht aus. Es gibt ein paar Strukturen in der Programmierung, die sollte jeder kennen. Da wäre zum ersten die If-Abfrage. "if" bedeutet auf deutsch "falls". Die If-Abfrage besteht aus einem Kopf, in dem eine Bedingung steht - diese ist eine Variable vom Typ boolean (erinnere: ja oder nein) - und einem Körper, in dem wie bei der Funktion Anweisungen stehen. if(bedingung) { } Sollte die Bedingung den Wert "true", also "ja", haben, dann werden die Funktionen im Körper, also zwischen den geschweiften Klammern, ausgeführt, sonst nicht. Beispiel: if(true) { print("Ich scripte hier!"); } if(false) { print("Ich scripte nicht."); } Sollte in dem Körper der Abfrage nur eine einzige Anweisung stehen, darf man die geschweiften Klammern weg lassen. Ein weiteres Besipiel: var klappt : boolean = true; function Start() { if(klappt) print("Es klappt."); klappt = false; if(klappt) print("Wenn das klappt, fress ich einen Besen."); } Nun aber weiter im Text: In If-Abfragen kann man auch andere Variablen benutzen als boolean. Dafür muss man den Wert mit einem anderen vergleichen. Dabei kommt dann heraus: "Ist gleich" oder "ist ungleich", und das ist dann wieder unser benötigter boolean-Wert. Zum Vergleichen benutzt man ein doppeltes Gleichzeichen ( == ), denn das einfache ist ja schon für die Wertzuweisung zuständig. Beispiel: if(3 == 4) print("Diese Anweisung wird nicht ausgeführt werden."); var hi : String = "Hallo"; if(hi == "Hallo") print("Diese Anweisung wird ausgeführt."); // Achtung: String-Vergleiche funktionieren nicht immer so einfach, in diesem Fall geht's Teil 3 - Logische Operatoren Mehrere Bedingungen ( = boolean-Variablen) lassen sich zu einer zusammenfügen, indem man so genannte logische Operatoren verwendet. So kann man im Script abfragen, ob zwei Bedingungen stimmen, oder nur eine von beiden. Da wäre zum einen das logische Und ( && ). if(4 > 3.5 && "wurst" != "käse") print("Das hier wird ausgeführt"); if(4 > 3.5 && "wurst" == 5) print("Das hier bestimmt nicht."); Auf diese Weise lassen sich belieblig viele Bedingungen kombinieren. So spart man sich das Stapeln von Abfragen: if(4 > 3.5) { if("wurst" != "käse") print("Das hier würde genau so funktionieren wie das oben."); } Dann gibt es noch das logische Oder ( || ). Einen | erzeugt man mit AltGr+< (die Taste neben der linken Umschalttaste). Eine Oder-Bedingung gilt dann als wahr, wenn eine ihrer Teilbedingungen wahr sind: var zahl : int = 4; if(zahl == 2 || zahl == 4) print("Das hier wird sowas von ausgeführt..."); Mehrere logische Operationen sollten unbedingt voneinander abgetrennt werden, das geschieht mit normalen Klammern ( ( und ) ): if(("a" == "b" || 3 == 3) && 2 > 0) print("Auch das hier wird ausgeführt."); Teil 4 - Else Jetzt kennst Du bereits if. Aber gibt noch mehr solcher Strukturen. Da wäre zum einen else. "else" heißt auf deutsch "sonst", und das passt. Wer aufgepasst hat, kann sich die Funktion schon denken: if(3 > 5) print("Das wird nicht ausgeführt"); else print("Das aber schon.") auch else kann einen Körper mit geschweiften Klammern haben, damit es mehrere Anweisungen gibt: if(false) { //... } else { //... } Teil 5 - While-Schleife Jetzt kommt noch eine weitere Struktur. Sie ist der If-Abfrage sehr ähnlich, hat aber den Unterschied, dass die Anweisungen im Körper nicht nur ein Mal ausgeführt werden, wenn im Kopf "true" steht, sondern immer wieder ausgeführt werden, bis "false" im Kopf steht. Das ist in den allermeisten Fällen nur sinnvoll, wenn der Wert, um den es im Kopf geht, im Körper geändert wird. var zahl : int = 0; while(zahl < 5) { print("Es wird getan!"); zahl = zahl + 1; } Am Ende haben wir hier fünf Mal den angegebenen Satz in der Konsole stehen. Daran sieht man schon einmal den primären Nutzen von Schleifen: etwas soll x Mal ausgeführt werden. Für diesen Zweck allerdings ist die For-Schleife nützlicher. Bevor die dran kommt, erst einmal neue Operatoren! Teil 6 - Neue Operatoren Es gibt ein paar nützliche Operatoren, die noch gar nicht dran kamen. Da gibt es z.B. + als "Concat"-Operator, der Strings zusammenfügt: var name : String = "Hase"; print("Mein Name ist "+name+"."); Wer errät's? Am Ende steht da "Mein Name ist Hase." Sehr wichtig! Das funktioniert auch mit Strings und Zahlen: var zahl : int = 3; print("Die Nummer lautet "+zahl); Aber Vorsicht bei Rechnungen in diesem Falle, benutze Klammern! print("Drei plus zwei ist "+(3+2)); ...denn das + ist immernoch auch zum Rechnen da. Jetzt gibt es noch schnelle Rechenoperatoren: zahl++; Erhöht "zahl" um 1, genau wie zahl--; ..."zahl" um 1 verringert. Dann gibt es noch diese: zahl += 5; //entspricht zahl = zahl + 5; zahl -= 5; //entspricht zahl = zahl - 5; zahl *= 5; //entspricht zahl = zahl * 5; zahl /= 5; //entspricht zahl = zahl / 5; ...für schnelleres Rechnen. Yay! Dann gibt es noch das Ausrufezeichen ( ! ). Dieses kann man benutzen, um boolean-Werte umzukehren. Dieser Code: if(lebtNoch == false) ...entspricht diesem: if(!lebtNoch) Das ist nicht notwendig, aber ganz schön praktisch! Teil 7 - Die For-Schleife Mit der For-Schleife geht Zählen besser als je zuvor! Anstatt sie aber im Detail zu erläutern, werde ich jetzt erstmal einfach die gängigste Verwendungsweise vorstellen: var wieOft : int = 5; for(var i : int = 0; i < wieOft; i++) { print("Wir sind bei "+i); } Der Kopf der For-Schleife besteht aus drei Teilen, die per Semikolon ( ; ) voneinander getrennt sind. Der erste Teil ist eine Anweisung, die am Anfang der Schleife ausgeführt wird (hier kann man eine Variable deklarieren und initialisieren!), der zweite Teil ist eine Bedingung, die vor jedem Durchlauf der Schleife abgefragt wird (genau wie in der While-Schleife, bei false wird die Schleife abgebrochen), der dritte Teil ist wieder eine Anweisung, die nach jedem Durchlauf ausgeführt wird. Dieser Code ist also von der Funktion her identisch mit diesem: var wieOft : int = 5; var i : int = 0; while(i < wieOft) { print("Wir sind bei "+i); i++; } ...und ist dabei wesentlich sauberer und schicker. Teil 8 - Return und Break Return wurde im vorherigen Tutorial benutzt; mit return lassen sich Werte von einer Funktion zurück geben. Wer sich nicht erinnert: Die Funktion wird dadurch beendet. Man kann return auch ohne Wert benutzen: return; ...einfach, um die Funktion zu beenden. Das hat einen ganz einfachen nutzen: Man spart sich jede Menge geschweifter Klammern. Denn anstatt einen riesigen Anweisungsblock einer Funktion komplett in eine If-Anweisung zu packen (man denke nur ans nachträgliche Einrücken...), kann man einfach die Funktion am Anfang mit diesem Code versehen: if(!wirdGemacht) return; //... Break ist ein Befehl, der ähnlich wie return verwendet wird, er beendet aber nicht die Funktion, sondern die Schleife, in der er steht. Logischerweise gibt's hier keinen Rückgabewert, Schleifen haben ja keinen. while(zahl < 5) { if(zahl == 4) //Ich würd gerne vorher abbrechen... break; print("Wetten, das hier wird nicht ausgeführt, wenn zahl gleich 4 ist?"); } Dieser Code macht nicht viel Sinn, aber break kann durchaus von großem Nutzen sein. Teil 9 - Switch-Case-Abfrage Eine interessante Abfrage gibt es noch: Man stelle sich vor, man hat eine Zahl, und abhängig von dieser möchte man etwas tun. Eine KI zum Beispiel hat eine Variable "modus". Ist modus 1, so steht sie herum, bei 2 sucht sie den Spieler, bei 3 schießt sie wild umher und bei 4 tanzt sie Disco Fox. Will man das Verhalten nun abhängig vom Modus gestalten, bietet sich theoretisch eine Reihe von If-Abfragen an: if(mode == 1) Idle(); else if(mode == 2) Search(player); //usw. Das ist etwas unschön und verstößt auch gegen einige Regeln für sauberes Programmieren. Ändert man nämlich den Namen der Variable, schaut man doof aus der Wäsche. Deshalb schafft switch-case Abhilfe. Der Code oben lässt sich in einer Case-Abfrage so ausdrücken: switch(mode) { case 1: Idle(); break; case 2: Search(player); break; //usw. } Das break ist wichtig, weil die Engine ohne das Schlüsselwort auch bei einer Übereinstimmung den Switch-Block weiter abarbeitet. Sollte in einem Case-Block "return" mit Sicherheit aufgerufen werden, darf man sich das break natürlich sparen. Ein Schlüsselwort gibt es noch: default. switch(mode) { default: //... break; } Der Code in einem default-Block wird immer ausgeführt und kommt daher z.B. an die Reihe, wenn mode aus irgendeinem Grund -1 ist. Er kommt nach allen case-Blöcken vor Ende des Switch-Blocks. Er sollte samt break immer vorhanden sein, auch wenn kein Code darin steht, sonst gibt es ja kein break! Teil 10 - Abschließende Worte All das hat in Unity überhaupt keinen direkten Nutzen gehabt. Wir haben ja nicht einmal ein neues Script geschrieben. Aber sicherlich kannst Du Dir denken, dass man ohne Abfragen und Schleifen nicht weit kommt. Und ich glaube, der passende Artikel für Script ist "das". Ich kann es mir trotzdem nicht angewöhnen. Viel Spaß beim Scripten!
  14. Tschulligung, dass hier damit rein platze, aber wäre es nicht sinnvoller, externe Tutorials in die Linkliste zu tun und nur die, die es nur hier gibt in den Forenbereich zu tun? Allein der Sprache wegen schon....
  15. Ich danke. Mal sehen, ob ich demnächst nochmal die Zeit für ein anderes finde.
  16. Es gibt keine Ressourcen-Sektion... ansonsten gerne!
  17. Tadaa, Scripting-Tutorial

    1. Lars

      Lars

      Sieht gut aus!

  18. Unity wirkt ja mit großer Anziehungskraft auf Designer, während die Benutzerfreundlichkeit einen Programmierer erst einmal abschreckt, ist diese doch meist mit Einschränkungen oder sonstigen Ärgernissen verbunden. Wer sich gerne Spiele ausdenkt oder designed, muss sich auch in Unity ersteinmal mit Programmierung auseinander setzen, und dafür dieses Tutorial. Bis auf den letzten Teil (3.2) nicht unbedingt für Leute, die schon gut mit JavaScript programmieren können. Dieses Tutorial beschäftigt sich ausschließlich mit Javascript, da es noch einen Satz einfacher ist als c#. Scripten in Unity für Einsteiger Teil 1 - Scripts benutzen / Unity-Grundlagen Wer sich Unity schon einmal angesehen hat, sieht: Unity läuft grundlegend über dieses Prinzip: Ein Spiel besteht aus mehreren Szenen (Scenes) Eine Szene besteht aus mehreren GameObjects Ein GameObject besitzt mehrere Komponenten (Component) Ein GameObject ansich ist nichts weiter als eine Instanz. Es ist kein Licht, hat keine Form, keine Physik und ist in keiner Weise sichtbar. Erst die Komponenten des GameObjects definieren, was es ist. Fügt man z.B. ein Licht hinzu, so ist das kein Licht-GameObject, sondern ein GameObject mit einer Licht-Komponente. Sichtbare Objekte haben eine Komponente, die von der Renderer-Klasse abgeleitet ist (was das genau heißt, muss man erstmal nicht wissen), ohne diese wären sie unsichtbar. Sogar "Transform" ist eine Komponente, die sich nur nicht löschen lässt, und pro GameObject einmalig ist, trotzdem ist es nur eine Komponente. Eine Komponentenart hebt sich stark von den anderen ab: Script (MonoBehaviour). Ein Script ist eine weitere Komponente, die einem GameObject hinzugefügt werden kann. Warum es gut ist, dass man pro GameObject Scripts hat, und nicht ein großes Programm, das alles steuert, wie es sonst üblich ist, sei später erwähnt. Was hier zu merken ist: Wir wollen jetzt ein Script erstellen, das einen Würfel dreht. Erstelle eine neue Szene. Erstelle einen Würfel und platziere ihn im Weltzentrum (0,0,0). Erstelle jetzt einen neuen Javascript und nenne ihn RotateMe. Weise den Skript dem Würfel zu. >>> Noch passiert nichts, der Skript ist ja noch leer! Teil 2 - Variablen Variablen erfüllen viele Zwecke. Sie haben einen Datentyp und einen Wert. Der Datentyp gibt an, was die Variable beinhaltet; das kann ein Wort sein, eine Zahl, ein Vektor oder sogar ein GameObject. Die Zahl der Datentypen ist unbegrenzt, allein schon, weil man sich selber welche erstellen kann. Die wichtigsten Datentypen sind die so genannten primitiven Datentypen: (Kleiner Nachtrag hier: String ist nicht wirklich ein primitiver Datentyp im eigentlichen Sinne, verhält sich aber ungefähr so.) Eine Variable definiert man in Javascript (!) wie folgt: var name; Das Schlüsselwort "var" wird vom Editor gesondert markiert und bedeutet: Im folgenden wird eine Variable definiert. Das Wort "name" ist der Name der Variable und kann beliebig heißen, aber: - nur Buchstaben und Zahlen, Tiefstriche gehen auch ( _ ) - das erste Zeichen muss ein Buchstabe sein - keine Sonderzeichen (auch keine Umlaute) und erst recht keine Leerzeichen - die Konvention liegt bei CamelCase-groß-und-klein-schreibung, d.h.: erster Buchstabe klein und dann Kapitälchen, z.B. nameDerVariable Das Semikolon ( ; ) am Ende beendet die Anweisung, das gilt für alle Anweisungen. RICHTIG: FALSCH öffne das Script RotateMe und lösche den gesamten Inhalt Erstelle eine Variable "rotateSpeed" >>> Das Ergebnis müsste nun so aussehen: var rotateSpeed; Teil 2.1 - Variablen initialisieren Variablen erstellen, schön und gut, sie müssen auch Werte haben. Eine Wertzuweisung funktioniert ganz simpel per Gleichzeichen ( = ): health = 100; Dies ist eine Anweisung. Anweisungen lassen sich nicht einfach so in das Script schreiben, einzige Ausnahme sind Variablen, die erstellt werden (siehe vorheriger Abschnitt). Wie man diese Zuweisung anwendet, sei später erklärt. Eine Wertzuweisung lässt sich mit einer Variablendeklaration kombinieren, das nennt man dann Initialisierung: var health = 100; Hierbei gibt es eine Besonderheit in Javascript. Die meisten Programmiersprachen verlagen danach, dass eine Variable bei der Deklaration einen Typ angegeben bekomen. JavaScript tut dies nicht; weist man z.B. health den Wert 100 bei der Initialisierung zu, wird health bis auf weiteres als int behandelt, was es ja auch ist. Die Initialisierung einer Variable ist also eine Art vorläufiger Festsetzung des Datentyps. Man kann den Datentyp aber auch endgültig angeben... Teil 2.2 - Variablen-Typ angeben ...das funktioniert durch einen Dopelpunkt ( : ). Beispiel: var health : int; Health ist nun eine int-Variable. Die Performance des Scripts steigt, wenn man immer fleißig die Datentypen angibt, weil das Programm dann nicht immer selbst herausfinden muss, was für einen Datentyp eine Variable hat. Insbesondere, weil Variablen ohne angegebenen Typ ihren Typ später wechseln können. Initialisieren wir jetzt unsere Variable, sieht sie so aus: var health : int = 100; ändere jetzt die Variable rotateSpeed so ab, dass sie ein float ist und den Wert 10 hat. >>> Das Ergebnis müsste jetzt so aussehen: var rotateSpeed : float = 10; Teil 2.3 - Variablen im Unity-Editor Jetzt haben wir ein Script an unserem Würfel, der eine Variable hat: rotateSpeed. Diese Variable soll natürlich die Geschwindigkeit angeben, mit der gedreht wird. Eine normale Variable, die einen Datentyp hat (und sei er auch nur durch die Initialisierung angegeben), ist in Unity im Editor einstellbar. Speichere und schließe den Script-Editor. Markiere den Würfel und sieh Dir die Komponentenliste an. Das Script in der Komponentenliste, unser RotateMe-Script, hat jetzt eine Einstellung erhalten: Rotate Speed! Sie hat den Wert 10, weil wir ihn so zugewiesen haben. Den kann man jetzt aber ändern, und diese änderung beeinflusst dann das Verhalten der Script-Komponente, nicht des Scripts selbst! Hätten wir z.B. zwei Würfel mit RotateMe-Script und änderten wir den Rotate Speed-Wert des einen, so hat das keinen Einfluss auf den anderen, genau wie die änderung der Position eines Objekts die anderen nicht beeinflusst. Man muss also nicht jedes mal das Script ändern, um eine Einstellung zu ändern, und schon gar nicht zwei Scripts schreiben, um zwei Objekte unterschiedlich schnell drehen zu lassen! Teil 3 - Funktionen Eine Funktion ist nun das entscheidenste Konstrukt in einem Script. Sie kann ausgelöst werden und beinhaltet eine beliebige Anzahl von Aweisungen, wie z.B. die Wertzuweisung (siehe oben), oder ruft andere Funktionen auf. Eine Funktion sieht folgendermaßen aus: function Name() { } Für den Namen deiner Funktion gelten die selben Richtlinien wie für Variablen, nur, dass der Konvention nach Funktionsnamen am Anfang groß geschrieben werden. Zwischen den geschweiften Klammern ( { und } , AltGr+7 und AltGr+0 auf der PC-Tastatur) stehen dann die Anweisungen, die ausgeführt werden sollen, sobald die Funktion aufgerufen wird. Beispiel: function LogVier() { print("4"); } Wird die Funktion LogVier aufgerufen, wird eine andere Funktion aufgerufen, die in diesem Fall print() heißt. print() zeigt einen String in der Unity-Konsole an (und unten links im Editor), und zwar den, der in den Klammern steht. Variablen, die in den Klammern stehen, heißen Parameter. Durch Parameter lässt sich das Verhalten von Funktionen beeinflussen. Teil 3.1 - Parameter Parameter müssen in einer Funktion deklariert sein, sonst kann man sie nicht benutzen. Sie werden ähnlich wie normale Variablen deklariert, nur ohne "var", und in der Klammer der Funktion: function PrintPlusOne(zahl : int) { } diese Funktion erwartet nun einen Parameter vom Typ int. Versucht man, diese Funktion mit anderen Paramenetern aufzurufen, gibt es einen Fehler. Parameter sind, genau wie Variablen, die innerhalb einer Funktion deklariert werden, nur innerhalb der Funktion verfügbar. Versucht man, sie von anderswo auszulesen oder zu ändern, gibt es einen Fehler. Zuweisungen und andere Funktionen aufrufen sind nicht alles, was man tun kann, man kann z.B. auch rechnen: function PrintTwoPlus(zahl : int) { print(zahl + 2); } Diese Funktion zeigt in der Konsole das Ergebnis der Addition Zahl + 2 an. So ruft man diese Funktion auf: PrintTwoPlus(5); Dann erhält man "7" in der Konsole. Mehrere Parameter sind genauso möglich wie gar keiner, man trennt mehrere mit einem Komma ( , ). Aber wie ruft man eine Funktion auf, wenn man sie nur aus anderen Funktionen aufrufen kann (die müssen ja auch aufgerufen werden!)? Teil 3.2 - Unity-Funktionen Ganz einfach: Es gibt in Unity ein paar reservierte Funktionen, die nicht der Programmierer aufruft, sondern die Unity Engine selbst. Die wichtigsten: Awake() Wird aufgerufen, wenn das GameObject, dem das Script zugewiesen ist, initialisiert wird (also ganz am Anfang) Start() Wird aufgerufen, wenn das GameObject, dem das Script zugewiesen ist, fertig initialisiert ist Update() Wird immer wieder aufgerufen, solange das Script aktiv ist Füge die Update-Funktion zum Rotate-Script hinzu, denn wir wollen den Würfel kontinuierlich drehen >>> Das Ergebnis müsste jetzt so aussehen: var rotateSpeed : float = 10; function Update() { } Jetzt müssen wir in der Update-Funktion den Würfel drehen. Dazu greifen wir auf eine andere Komponente des selben GameObjects zu, das das Script angeheftet hat. In den meisten Fällen kann man ganz bequem auf die anderen Komponenten zugreifen, zum Beispiel die transform-Komponente: transform Transform hat eine Funktion namens Rotate(xAngle : float, yAngle : float, zAngle : float). Diese nutzen wir in der Update-Funktion, um den Würfel bei jedem Aufruf ein kleines Stück weiter zu drehen, und zwar um die y-Achse: transform.Rotate(0, 1, 0); Aber wir wollen den Würfel ja mit unserer angegeben, variablen Geschwindigkeit drehen! transform.Rotate(0, rotateSpeed, 0); Eines müssen wir aber noch beachten. Jede Art von zeitabhängigen Aktionen muss modifiziert werden. Das liegt daran, dass die Update()-Funktion je nach Leistung des Systems, auf dem die Unity Engine läuft, mal öfter und mal weniger oft aufgerufen wird. Da die Drehung ganz klar zeitabhängig ist (der Würfel dreht sich ja mit x Grad pro Sekunde), multiplizieren wir die Gradzahl mit der Zeit seit dem letzten Update()-Aufruf. Wer ein gewisses Grundverständnis von Mathematik hat, sieht: Wenn wir bei jedem Aufruf um x Grad mal diese Zeit drehen, entsteht eine gleichmäßige Drehung, denn wenn ein Aufruf etwas früher kommt, wird der Würfel entsprechend weniger gedreht und umgekehrt. Dieser Wert seit dem letzten Update()-Aufruf lässt sich jedenfalls so auslesen: Time.deltaTime also muss unsere Funktion jetzt so aussehen: function Update() { transform.Rotate(0, rotateSpeed * Time.deltaTime, 0); } (Das * ist ein Mal-Zeichen). Passe die Update-Funktion des Scripts wie beschrieben an. >>> Zeit zum Testen! Der Würfel müsste sich drehen! Dreht er sich zu langsam? Einfach Rotate Speed im Unity Editor ändern! Teil 4 - Rückgabewerte Eine Funktion kann irgendwas für eine andere Funktion machen. Das ist zum Beispiel dann dann sinnvoll, wenn man etwas bestimmtes an mehreren Stellen machen will. Man schreibt dann für diese Aufgabe eine Funktion, die dann immer aufgerufen wird, anstatt ihren Code überall in anderen Scripts zu verteilen. In den meisten Fällen einer solchen Auslagerung benutzt man die Funktion, um einen Wert zu ermitteln. Diesen Wert kann die Funktion dann an die Funktion, die sie aufgerufen hat, zurück geben. Dies geschieht mit dem return-Statement: function QuadratZahl(zahl : int) { return zahl * zahl; } Der Rückgabewert wird dann verwendet, indem man die Funktion bei ihrem Aufruf wie einen Wert behandelt: var ergebnis : int = QuadratZahl(8); print("Das Quadrat von 8 ist "+ergebnis); Die Funktion, die QuadratZahl() aufruft, wartet mit dem Ausführen, bis sie den Rückgabewert hat. Teil 5 - Abschließende Worte Jetzt kannst du scripten. Auch wenn du - verhältnismäßig - nicht sehr viel gemacht hast: Wenn Du dir alles genau durchgelesen hast, hast du nicht nur die Grundlagen gelernt, sondern auch einiges mehr, das dir beim Verstehen komplizierterer Dinge helfen wird. Als nächstes könntest du dich in die offizielle Scripting-Referenz einlesen: http://unity3d.com/s...criptReference/ Der Anfang dürfte dir bekannt vorkommen, aber das ist hoffentlich auch der Grund, warum du alles schneller verstehst, was nun kommt. Viel Erfolg beim Scripten! Das nächste Tutorial wartet schon!
  19. Keiner im Team kann bisher animieren, das soll sich ändern. Das mit den Kisten ist mir neu oO Danke! Es soll, sobald wir die Vorentwicklung und ein paar Framework-Formalitäten soweit haben, ein größeres Spiel mit Handlung entstehen. Bis dahin freuen wir uns über jede Registrierung
  20. Ich lade von FreeplayMusic.com für Musik und Flashkit.com für Sounds.
  21. Hallo miteinander, Ich bin mit ein paar Kollegen seit längerer Zeit dabei, Spiele für "im Browser" zu entwickeln. Am Anfang hatten wir Java-Applets mit JOGL, also OpenGL, was natürlich bedeutete, dass wir uns eine 3D-Engine selber schreiben mussten. Das hat schon gar nicht schlecht geklappt, die Spiele liefen, Abzeichen (Achievements), Highscores und Spielstände ließen sich durch das Spiel auf dem Server speichern. Als ich dann Anfing, eine Artikelserie für realize! zu schreiben, in denen ich verschiedene Engines vorstelle (ich habe schon mit xna, udk und eineigen anderen gearbeitet), wurde ich erstmals auf Unity hingewiesen. Liebe auf den ersten Blick Das Team - wir nennen uns "Black Ice Games", hat jetzt eine von mir selbst geschriebene Seite, auf der wir unsere ersten Gehversuche in Unity vorstellen. Zu finden ist sie hier (da noch keine eigene domain gekauft wurde): http://blackicegames.de/ Wir bestehen aus drei Programmierern (einer bin ich) und zwei 2D-Artisten. Hier ein paar Screenshots der Spiele: Wie gesagt, erste Gehversuche. Als nächstes steht die ordentliche Implementierung unserer GUI auf dem Plan, ähnlich wie der Games for Windows Live Guide. Wer möchte, darf sich gerne registrieren und Anzeichen und damit Punkte sammeln, um sich in der Top9 zu verewigen Um Feedback wird gebeten!
  22. Sascha

    Der Sascha

    Einziges Update: Studienplatz ist sicher
  23. Wär ja blöd, wenn man jedes mal einen Vorschlag zur Eröffnung eines Unterforums machen müsste. Das Board ist ja nicht zum Quatschen, sondern zum Austausch verschiedenster für's Thema relevanter Informationen, und da werden diese Bereiche einfach gebraucht. Also: Weiter so
×
×
  • Neu erstellen...