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

    Yeah, Spiele machen!

    [size=5]W[/size]elches bessere Thema gäbe es wohl, kommende schriftliche Merkwürdigkeiten zum Thema Spieleentwicklung einzuleiten, als die Spieleentwicklung selbst?<br /> Wie auch immer ein Leser genau auf diese Zeilen stieß, es wird wohl mit der massiven Welle aus Menschen zu tun haben, die die Spieleentwicklung für sich entdeckt haben oder noch entdekcne wollen, und das vielleicht sogar, ohne eine professionelle Ausbildung für Grafikdesign, Programmierung oder sonst einer sich dafür anbietenden Fähigkeiten auf ausgeprägtem Niveau zu besitzen.<br /> <br /> <img src="http://blackicegames.de/files/uin/titel.png" style="float:left;padding: 4px;" />Ein Mangel an genannten Eigenschaften ist heutzutage mit rapide sinkender Wichtigkeit versehen.<br /> Denn, und das hast Du sicher bereits bemerkt:<br /> Spieleentwicklung wird immer einfacher. Immer präsenter.<br /> Während vor zehn Jahren das Monopol der Spieleentwicklung bei Menschen mit mehr verbrachter Zeit im Keller oder der Garage als an der frischen Luft, oder alternativ hoch und höher bezahlten Visionären, lag, ist in den letzten Quartalen ein neuer Trend entstanden, der sich aus der Modding-Szene ableitete.<br /> Grundidee ist, dass auch Hobbyisten das Zeug dazu haben, Spiele zu entwickeln.<br /> Gezeigt haben das neben diversen Mods genialer Qualität auch die Erfolge von Community Content, der nicht selten durch mitgelieferte Editoren eines Spiels enstehen konnte.<br /> <img src="http://blackicegames.de/files/uin/reignofsteel.jpg" style="float:right;padding: 4px;" />So war es nur eine Frage der Zeit, bis sich die Entwickler verschiedener Spiele-Engines dazu entschieden, ihre Produkte kostenlos anzubieten, 2009 beispielsweise erschienen Unity Indie und die Unreal Engine in Form des UDK.<br /> Diese Engines erhöhten das Niveau, die Bedienfreundlichkeit und die Anzahl an Möglichkeiten für Independant Developer (unabhängige Entwickler) im Vergleich zu den bereits verfügbaren, kostenlosen Engines deutlich.<br /> Das XNA Game Studio von Microsoft beispielsweise verfolgte bereits viel früher den Ansatz, Spieleentwicklung kostenlos zu machen, setzte allerdings viele Programmierkenntnisse voraus.<br /> <br /> Resultat der Veröffentlichungen war eine Welle von Benutzern, nicht selten unausgebildete Hobbyisten, die plötzlich Spiele für PC, Mac, oder iPhone entwickeln konnten, ohne sich dafür dumm und dusselig zu zahlen, und diese Gelegenheit nutzten.<br /> Neben denen, die an ersten Versuchen scheitern, gelingt es immer mehr Anfängern, stolz erste Ergebnisse zu präsentieren.<br /> <img src="http://blackicegames.de/files/uin/spacetaxi.jpg" style="float:left;padding: 0 8px 0 4px;" />Weitere Konsequenz des Trendes ist die Enstehung vieler Info- und Tutorial-Seiten, Videos und Internetforen (siehe Unity Insider), deren Zweck es ist, Neulingen einen guten Start zu ermöglichen, denn die neue Zielgruppe muss nun mal bei null anfangen.<br /> <br /> Probleme gibt es allerdings auch ein paar.<br /> So ist ein professioneller Programmierer / Designer / etc., sobald er seine Ausbildung beendet hat, in der Lage, sich bei einem richtigen Spielehersteller zu bewerben.<br /> Dort findet er Gleichgesinnte, Ausrüstung, Anleitung und Bezahlung.<br /> Nichts davon kommt für Hobbyentwickler von alleine.<br /> Equipment und Bares sind in den allermeisten Fällen schöne Nebeneffekte für diejenigen, die wirklich Talent dazu haben.<br /> Gleichgesinnte zu finden ist da schon einfacher, aber auch das ist schwierig, wenn diese tatsächlich effizient arbeiten sollen.<br /> <br /> Richtig Spiele entwickeln ist vermutlich die Königsklasse aller kreativen Arbeit.<br /> Ein Team sollte eine gewisse Menge Fähigkeiten abdecken, damit das Spiel erfolgreich werden kann.<br /> Die wichtigsten Bereiche sind:<br />[list] [*]Programmieren (unabdingbar) [*]Zeichnen und Bildbearbeitung (sehr wichtig und unabdingbar wenn's gut werden soll) [*]Modellieren und Texturieren (für ein 3D-Spiel unabdingbar, sonst nicht nötig) [*]Anderes (damit's richtig gut wird - Mapdesign, Sound, Video, Texte, Internetseite, ...) [/list] Letztenendes reicht also ein einziger, um ein Spiel auf die Beine zu stellen, wenn er etwas programmieren und ein wenig designen kann.<br /> Das Resultat wird dann allerdings entweder schlecht programmiert (und voller Fehler) sein oder schlecht aussehen - davon ist auszugehen.<br /> Zwei Kollegen sind daher in 99% der Fälle ein Muss, damit am Ende etwas spielbares entsteht.<br /> Als Information: Allein der Bereich Graphics Designer lässt sich, wenn man es genau nimmt, in dutzende Bereiche aufteilen, was der Grund ist, dass an großen, professionellen Spielen auch mehrere dutzend Leute beteiligt sind.<br /> Orientiert man sich daher als Einsteiger an großen Projekten (ich lese immer wieder "ich will eine riesige Spielwelt" oder "ich baue ein mmorpg"), dann muss man seine Einstellung zur ganzen Sache gleich einmal grundlegend überdenken.<br /> Denn es sitzen nicht zu Unrecht mindestens achzig gut bezahlte Menschen zum Teil mehrere Jahre an einem einzigen professionellen Titel.<br /> Wer in seinem ersten Spiel nichts weiter als eine Kugel hat, die man über einfarbige Kisten hinweg von a nach b steuern muss, der darf auf sich stolz sein.<br /> Wer sich als erstes vornimmt, mit seinem Kumpel aus der Schule, der immerhin eine zwei im Kunstkurs hat, einen Blockbuster mit geplanten 50 Spielern gleichzeitig auf 60km² Spielwelt zu bauen, bevor er alt und schrumpelig geworden ist, sollte sich lieber Briefmarken sammeln als Hobby nehmen.<br /> Wer jetzt versuchen will, möglichst viele "Mitarbeiter" um sich zu scharen, sollte unbedingt bedenken, wie schwer es ist, ein Team zu leiten, dass nicht bezahlt wird, und wie unmöglich es wird, die Arbeit aller zu koordinieren und zu einem Endprodukt zusammen zu fügen, insbesondere, wenn man das noch nicht einmal alleine geschafft haben sollte.<br /> <br /> Aber bitte nicht abschrecken lassen!<br /> Was ich damit sagen will ist zweierlei.<br /> Erstens: Jeder hat mal klein angefangen.<br /> Und das nicht, weil es mehr Spaß macht, sondern, weil es nicht anders geht.<br /> So ziemlich jeder, der es mit der Ãœberholspur versucht hat, hat es zu gar nichts gebracht. Ausnahmen bestätigen aber auch hier die Regel.<br /> Zweitens: Sei realistisch.<br /> Baue dir erst das simpelste Spiel, dass Dir einfällt, dann das zweitsimpelste, und wenn beide fertig sind und funktionieren, hast Du so viel Einblick in den Aufwand dieser Arbeit bekommen, dass Du weißt, wie viel Du als nächstes schaffen kannst.<br /> Und wenn man so weit ist, kann es erstmal nur noch bergauf gehen.<br /> <br /> Viel Glück beim Spiele Programmieren!
  2. Sascha

    Paul

    Hehe, richtiger Ansatz Willkommen im Forum!
  3. Ich freu mich schon auf heute Abend, wer freut sich mit?

    1. Vorherige Kommentare anzeigen  %s mehr
    2. DoubleM

      DoubleM

      ^^

      Wenn ich dann da bin freue ich mich auch :D

    3. Thomas Eilmsteiner
    4. Balmung

      Balmung

      Wenn man überlegt was bei so einem Live Interview übers Internet alles schief gehen kann und alles guckt mit, da ist nichts mit raus schneiden. ;) Ok ok, ich bin ja schon ruhig, muss ja nicht noch Öl ins Feuer gießen. ;D

       

      Bin mal gespannt ob wir was wirklich interessantes neues erfahren.

  4. Herzlich willkommen auch von mir.
  5. Hab auch lange gebraucht, um es spitz zu kriegen. UVSphere nehmen (nicht ICOSphere, fals du hast), alle Punkte markieren, die Kamera auf isometrisch stellen (Perspektive aus mit Numpad 5 ggf.), die Kamera direkt neben das Objekt packen, sodass sie horizontal schaut, ggf. mit Numpad 1. Dann einfach alle Punkte markieren => U => Sphere From View. Wenn Du nicht wie ich v2.49b benutzt, dürfte es leicht anders sein.
  6. Oh, wohl war. Macht euch mal alle Avatarem damit man euch nicht verwechselt...
  7. Meinst Du etwa Lars? Der ist hier Admin, der kennt alle Funktionen... Hab etwas Geduld, er ist im Urlaub.
  8. Doppelaccount oder was? PovRay? Blender? Ich tippe stark auf 3D Willkommen Antek! PovRay hatte ich auch ein halbes Jahr lang im Informatik-Unterricht. Wie kommt man von davon auf Blender??
  9. Sascha

    Scripting-Tutorials

    Über unsere Scripting-Tutorials Dies ist die Liste unserer Scripting-Tutorials. Sie ist gedacht für alle, die noch absolut keine Programmiererfahrung haben, aber auch für jene geeignet, die bereits, wenn auch nicht in Unity, programmieren können. Es werden überhaupt keine Vorkenntnisse voraus gesetzt. Eigentlich sind diese Texte auch weniger Tutorials als vielmehr Lehrtexte Scripten in Unity für Einsteiger Erste Grundlagen für das Scripten im Allgemeinen Scripten in Unity für Nicht-mehr-Einsteiger Der zweite Teil, passend zum ersten Nach diesen beiden beherrscht man die Grundlagen und kann sich an seine ersten eigenen Scripts setzen. Wer jetzt auf C# umsteigen möchte: C#-Tutorial für Um- und Einsteiger Umstieg von JavaScript auf C# Scripten in Unity mit Unity Die Schnittstelle der Unity-Engine, deren Klassen beim Scripten benutzt werden, vorgestellt Scripten in Unity für Scripterfahrene (an Objekte kommen) Der vierte Teil, wichtig für sauberes Programmieren und um das Prinzip hinter Unity zu verstehen Die Scripting Reference lesen Damit man eigenständig neue Dinge über Unity lernen kann Noch mehr Scripten in Unity (Wissen für Fortgeschrittene) Noch mehr Scripten in Unity - Teil 1: Arrays und Existenzoperator Erste leicht fortgeschrittene Techniken, aber einfach erklärt Noch mehr Scripten in Unity - Teil 2: Klassen und Überladungen Objektorientierte Programmierung in Unitys JavaScript Für den Anfang nicht benötigt, für Fortgeschrittene interessant Noch mehr Scripten in Unity - Teil 3: Statische Variablen und Funktionen Für die richtige Anwendung statischer Deklarationen und damit für sauberes Programmieren Noch mehr Scripten in Unity - Teil 4: Böse Funktionen beseitigen Die typischen inperformanten Funktionen durch äquivalenten, besseren Code ersetzen Scripten in der Praxis (Komponenten- und Praxisorientiertes Sctipting) Fehler in Scripts finden Konsole benutzen und Fehlermeldungen lesen können Scripten in der Praxis - Der CharacterController Menschen und andere Lebewesen in Unity Scripten in der Praxis - Raycasts Wozu sie gut sind und wie man sie benutzt
  10. Hurraa, 2000+ Beiträge :D

    1. Sascha

      Sascha

      Flutscht ja wie wild.

    2. Johannes

      Johannes

      :D Kaum bin ich weg kommen die ganzen posts
  11. Sieht echt lustig aus, bin gespannt.
  12. Fatale Niederlage beim IndieDB-Contest. Die Nominierten haben alle zu mind. 70% fertige Spiele, da komme ich halt noch nicht gegen an...

    1. Lars

      Lars

      Ihr seid trotzdem ein super Team und außerdem ist dein Team noch jung.

      "Was dich nicht umbringt, macht dich stärker."

    2. Sascha
  13. Lies Dir bitte Scripten in Unity für Einsteiger und Scripten in Unity für Nicht-mehr-Einsteiger durch, bevor Du dich an dieses Tutorial setzt. Sonst kommt absolut Bahnhof dabei raus. Noch mehr Scripten in Unity - Teil 2: Klassen und Überladungen Wer sich durch die vorherigen Tutorials durchgearbeitet hat, darf jetzt ein wenig programmieren für Fortgeschrittene. Yay! Was nun folgt, ist ein Einblick in objektorientierte Programmierung, welche in dieser Form eigentlich gar kein Teil von JavaScript ist. Von C# schon, dennoch bleiben wir auch weiterhin nur bei ersterem. Ich erzähle zur Einleitung mal ein bisschen aus dem Nähkästchen, als ich vor langer Zeit mal versuchte, eine 3D-Engine zu schreiben. Ich wollte eine gewisse Anzahl von 3D-Rechtecken speichern, die natürlich vier Eckpunkte im Raum hatten. Also bastelte ich mir vier Arrays (siehe vorheriges Tutorial), eines für die ganzen ersten Punkte, eines für die ganzen zweiten, usw. Selbst Programmieranfänger dürften einsehen, dass das ganz schön unschön ist. Man stelle sich vor, eines der Arrays würde aus irgendeinem Grund unabhängig von den anderen geändert werden. Und überhaupt: Fügt man ein neues Rechteck hinzu, muss man alle vier Arrays bearbeiten. Damals habe ich eine Sache nicht gekonnt: Objektorientiertes Programmieren. Das wärs aber gewesen. Teil 1 - Class Hätte der kleine Sascha mehr Ahnung gehabt, so hätte er folgendes gewusst: Man hätte sich eine so genannte Klasse erstellen können, die ein solches Rechteck repräsentiert. Diese hätte vier Variablen gehabt: Für jeden Eckpunkt eine, und anschließend hätte er alle Rechtecke in ein Array getan. Das klingt doch viel besser! Klassen erzeugt man in Javascript mit dem Keyword class: class Rechteck { } Diese Klassen kann man überall definieren, solange es außerhalb einer Funktion ist. Es bietet sich der Ordnung zuliebe an, das vor den Variablendeklarationen zu tun. Klassen werden, wie Funktionen, am Anfang groß geschrieben. Innerhalb der Klasse wird genau wie drumherum gescriptet: class Rechteck { var Punkt1 : Vector3; var Punkt2 : Vector3; var Punkt3 : Vector3; var Punkt4 : Vector3; function DrehMich() { //...Code zum Drehen } } Eine Klasse ist, wenn sie definiert ist, ganz einfach als Variablentyp zu benutzen: var eckbert : Rechteck; Beim Initialisieren braucht man ein neues Keyword: new. eckbert = new Rechteck(); Die Klammern müssen sein, Erklärung gibt's im Abschnitt "Konstruktoren". Aber bevor wir voranschreiten: Eine Rechteck-Klasse ist ziemlich blöd, weil wir schließlich in Unity sind, und Unity regelt die Sache mit den Meshes schon für uns. Es gibt aber hin und wieder gute Gelegenheiten, Klassen zu benutzen. Immer, wenn mehrere Variablen zu einer Gruppe gehören, gruppiert man sie in einer Klasse. Teil 2 - Klassenhierarchie Will man die Variablen oder Funktionen eines Objekts (so nennt man eine Variable, die eine Klasse als Datentyp hat) ansprechen, so benutzt man einfach den guten, alten Punkt: class Vector5 { var x : float; var y : float; var z : float; var v : float; var w : float; } var victor : Vector5 = new Vector5(); function Start() { victor.x = 100; } Auch bei Funktionen: class Person { var name : String = "Unbekannt"; var groesse : float = 1.8; function Wachse(amount : float) { groesse += amount; } } var lars : Person = new Person(); function Start() { lars.name = "Lars"; lars.Wachse(0.1); } ...und schon ist Lars 1,90m groß Es gibt eine besondere Art Funktionen: Konstruktoren. Teil 3 - Konstruktoren Ein Konstruktor ist nichts weiter als eine Funktion, die den Namen ihrer Klasse trägt und dadurch beim Initialisieren des Objekts ausgeführt wird. Konstruktoren sind dazu da, Variablen des Objekts dynamisch zu initialisieren, indem man Parameter benutzt: class Person { var name : String; var groesse : float = 1.80; function Person(derName : String) { name = derName; } } //... var sascha : Person = new Person("Sascha"); Jetzt kann die Klasse "Person" nicht mehr initialisert werden, ohne "name" anzugeben, da der vorherige Konstruktor ohne Parameter durch die Definition eines neuen ungültig wird. Ein Keyword ist insbesondere hierbei hilfreich: this. "this" repräsentiert die Klasse, in der es angewandt wird: class Person { var name : String; function Person(name : String) { this.name = name; } } Hätte ich "name = name;" geschrieben, hätte es natürlich nicht geklappt, denn "name" ist ja der Parameter in der Funktion. "this.name" ist allerdings die Variable "name" der Klasse "Person". Wunderbar. Übrigens: Der Aufbau eines Scripts und der Aufbau einer Klasse ist aus genau einem Grund identisch: Scripts sind selbst eine Klasse mit dem Namen, den man der Scriptdatei gibt. Wer in C# programmiert, muss deshalb sogar bei jedem C#-Script den gesamten Script in eine Klassendefinition setzen, aber das gehört nicht hierher. Teil 4 - Überladungen Es gibt eine interessante Eigenschaft von Funktionen. Man kann die selbe Funktion mehrere Male, aber mit unterschiedlichen Parametern deklarieren. Jede Variation einer Funktion nennt man Überladung. Beim Aufruf der Funktion wird die Überladung aufgerufen, deren Parameterliste mit den Parametern im Funktionsaufruf übereinstimmt. function MachWas(param : String) { print("Du hast die String-Version aufgerufen."); } function MachWas(param : int) { print("Du hast die int-Version aufgerufen."); } //... Machwas(4); Es geht, wie man sieht, nur über die Variablentypen, nicht um deren Namen: Beide Parameter heißen "param", dennoch ist die Angelegenheit eindeutig und damit fehlerfrei. Falsch dagegen: function MachWas(param : String) { } function MachWas(dingens : String) { } Diese beiden Funktionen haben eine identische Parameterliste, Ergebnis: Fehler! Mehrere Überladungen sind vor allem bei Konstruktoren sinnvoll. Teil 5 - Abschließende Worte Das war jetzt ein Einblick in objektorientierte Programmierung. Sehr fortgeschritten. Wenn Du alles verstanden hast: Glückwunsch - Du bist cool!
  14. Containers 2 - Die Käsekuchenverschwörung Teaser veröffentlicht http://www.youtube.com/watch?v=m5UFmQCS-z0 Hehe, ich hab Spaß an dem, was ich tue
  15. Sascha

    Junade

    Jo, willkommen im Forum. Keine Sorgen über zu doofe Fragen, sowas gibt's nicht
  16. Sascha

    Slin

    Hehe... Ja, Delphi mag ich auch nicht mehr so, es hatte sich nur halt ergeben, dass ich das zuerst gelernt hab. Würde ich heute auch nur noch bedingt benutzen. Mit Gimp komm ich gar nicht klar, ich bin Adobist.
  17. Sascha

    Slin

    Willkommen auch von mir - Irgendwie haben wir Ähnlichkeiten. Abi - Zivildienst - Informatikstudium Wobei ich jetzt kurz vor letzterem stehe Und wir beide kennen einen Haufen unterschiedlicher Programmiersprachen, bis auf Unitys Javascript haben wir aber deiner Auflistung nach keine Übereinstimmung. Ist ja heiß
  18. Sascha

    Shader Tutorials

    Wow, das sieht nach einer Menge nützlicher Infos aus. Ich werd mich mal bei Gelegenheit ran setzen. Danke!
  19. Dieses kurze Tutorial ist die Fortsetzung von Scripten in Unity für Einsteiger und Scripten in Unity für Nicht-mehr-Einsteiger. Es behandelt Arrays, einen wichtigen Variablentyp beim Programmieren. Noch mehr Scripten in Unity - Teil 1: Arrays und Existenzoperator Hat man sich jetzt etwas mit Programmieren auseinander gesetzt, und bastelt man vielleicht schon an einem eigenen Spiel mit eigenen Scripts, so ist man vielleicht schon einmal über den Begriff "Array" gestolpert. Array ist ein absolut unverzichtbarer Datentyp, der mehrere Variablen beinhaltet, wie ein Regal Bücher. In Unity gibt es für Javascript zwei Sorten von Arrays. 1. Statische Arrays (built-in arrays / native arrays) Dieser Arraytyp hat eine bestimmte Anzahl von "Fächern", also Variablen, für deren Werte darin Platz ist. Eine Variable in einem Array wird als "Element" bezeichnet. Der Typ der darin vorhandenen Elemente ist determiniert (festgelegt). Deklariert wird er wie folgt: var zahlen : int[]; Einfach zwei eckige Klammern ( [ und ] ) hinter einen beliebigen Datentypen setzen, schon hat man nicht mehr eine einzelne Variable dieses Typs, sondern gleich ein ganzes Array. Bevor man nun Werte zuweisen kann, muss das Array initialisiert werden, damit klar ist, was für eine Größe (length) es hat, sprich: Wie viele Elemete hinein passen. Das geschieht dann so: zahlen = int[10]; Oder gleich so: var zahlen : int[] = int[10]; Jetzt passen 10 int-Variablen hinein. Hinweis: Ein normal deklariertes Array lässt sich über den Inspektor im Unity Editor einstellen, und zwar inklusive Größe. Daher ist die Größe in diesem Fall nicht unbedingt sicher. Will man nun auf die einzelnen Elemente im Array zugreifen, helfen wieder die eckigen Klammern: zahlen[3] = 5; print("Die Zahl im Array mit index 3 hat den Wert "+zahlen[3]); Die Größe eines Arrays, also die Anzahl der Elemente, kann mit "length" abgefragt (nicht aber geändert) werden. print("Wir haben "+zahlen.length+" Zahlen im Array."); Will man die Größe eines statischen Arrays zur Laufzeit (also: Während das Spiel läuft) ändern, muss man es neu initialisieren, und dabei gehen alle darin enthaltenen Werte verloren. Will man diese sichern, muss man sich eine Funktion dafür zusammenbauen, die die Werte in einem anderen Array zwischenspeichert, das alte Array initialisiert und die Werte zurück kopiert. Das ist keine sehr schöne Sache, und obwohl statische Arrays sehr schnell arbeiten, sollte man in solchen Fällen zu dynamischen Arrays greifen. 2. Dynamische Arrays (js-arrays) Ein Dynamisches Array kann jederzeit vergrößert oder verkleinert werden, einfach, indem man ein neues Element anhängt oder eines löscht. Zudem kann dieser Arraytyp Variablen verschiedener Art beinhalten. Wer schon einmal etwas von objektorientierter Programmierung gehört hat: Das geht, weil es Werte des Typs "Object" verwendet, von dem alle Datentypen erben. Ist aber nicht weiter wichtig Ein dynamisches Array wird wie folgt deklariert und initialisiert: var sachen : Array; sachen = Array(); Oder gleich: var sachen : Array = Array(); Wie man sieht, muss keine Länge angegeben werden, ein dynamisches Array hat am Anfang die Größe Null. Ein Element anhängen kann man mit Push(): sachen.Push("Hallo, dies ist ein Satz."); sachen.Push(17+4); var geht : boolean = true; sachen.Push(geht); Jetzt steht in dem Array: {"Hallo, dies ist ein Satz.", 21, true} Schick. Trotz der Tatsache, dass es anders geht, empfehle ich dringend, nur Variablen eines Typs in einem Array unter zu bringen. Ansonsten kann man beim Auslesen der Werte ernsthafte Probleme bekommen. Auslesen kann man das Array auf verschiedene Arten, die erste kennst Du nun schon: print(sachen[0]); Eine weitere ist Pop(). Ja, Pop. Diese Funktion heißt so, seit es dynamische Arrays gibt, also keine Witze. Pop() gibt das als letzte Element des Arrays zurück und entfernt dieses gleichzeitig aus dem Array. Pop() ist daher eher dafür geeignet, ein Array "abzuarbeiten", wenn also die Werte jeweils nur ein Mal ausgelesen müssen. var dingens = sachen.Pop(); Beachtet, dass ich "dingens" keinen Datentyp zugewiesen habe, da sachen völlig unsaubererweise alle möglichen Datentypen gemischt hat. Mit dingens kann man jetzt weiter arbeiten. Kommt bloß nicht auf die Idee, mehrere Aktionen hintereinander mit Pop() auszuführen! VÖLLIG FALSCH: var zahlen : Array = Array(); zahlen.Add(6); zahlen.Add(9); if(zahlen.Pop() > 7) print(zahlen.Pop()+" ist größer als 7."); Wer sich nämlich alles gut durchgelesen hat, sieht: die beiden Aufrufe von Pop() geben unterschiedliche Werte zurück, da nach dem ersten Aufruf Pop() die 9 aus dem Array entfernt hat. Weist also immer einer Variable den Rückgabewert von Pop() zu und arbeitet damit weiter, anstatt den Wert direkt zu benutzen. Alles klar? Weiter im Text. Will man auf den letzen Wert eines Arrays zugreifen, ohne ihn zu löschen, muss man die eckigen Klammern und "length" benutzen: zahlen[zahlen.length-1] Warum -1? Erinnere: Der Index fängt bei Null an, length gibt aber 1:1 die Anzahl der Elemente zurück. Das letzte Element hat also den Index length-1. Das gilt natürlich auch für statische Arrays. Will man nun Elemente entfernen, die nicht ganz am Ende sind (ansonsten hilft Pop(), einfach ohne den Rückgabewert zu beachten), benutzt man RemoveAt(): sachen.RemoveAt(1); Diese Anweisung entfernt das Element mit Index 1 aus "sachen". Alle nachfolgenden Elemente rücken nach! Was also vorher den Index 2 hatte, hat nun 1, was 3 hatte, hat nun 2 usw. Die Größe des Arrays (length) verkürzt sich dadurch, wie auch bei Pop(), um 1. Manchmal möchte man Elemente an den Anfang anhängen oder vom Anfang "poppen" (hör auf zu lachen...). In diesem Fall gibt es netterweise Shift() und Unshift(). Sie funktionieren wie Push() und Pop(), nur eben am Anfang anstatt am Ende. Shift() fügt dabei hinzu, Unshift() entfernt ein Element. Beachte immer die dadurch entstehenden Indexänderungen, weil alle anderen Elemente Auf- oder Nachrücken. Ansonsten kann man noch andere Funktionen von dynamischen Arrays benutzen: Clear() - Löscht alle Elemente des Arrays Reverse() - Dreht das Array einmal um, das letzte Element ist dann vorne, usw. Sort() - Sortiert alle Elemente des Arrays. Hat man z.B. Zahlen darin, so wird die Reihenfolge der Elemente so geändert, dass die kleinste Zahl das erste Element wird, usw. Einen vollständigen Überblick über die Array-Funktionen gibt es hier: http://unity3d.com/support/documentation/ScriptReference/Array.html Arrays traversieren (mehrere Elemente auslesen) Alles folgende gilt für beide Arraytypen! Ein Element auslesen, schön und gut. In den meisten Fällen aber will man mehrere Elemente hintereinander auslesen, und da hilft in der Regel die For-Schleife: for(var i : int = 0; i < zahlen.length; i++) print("Die Zahl mit dem Index "+i+" hat den Wert "+zahlen[i]); Beachte: bei zahlen.length kein -1, da ich < (kleiner als) und nicht <= (kleiner gleich) benutze. Das -1 erübrigt sich so. Die For-Schleife wird von vielen ständig unterschätzt, mit ihr kann man noch auf andere weise arbeiten, die aus anderen Programmiersprachen vielleicht als "foreach" bekannt ist: for(var value in zahlen) { print(value); } "zahlen" ist wieder ein Array und "value" eine geschwind deklarierte Variable, ähnlich wie "i" in der Schleife davor. Der Code in den geschweiften Klammern ( { und } ) wird dann für jedes Element ein Mal ausgeführt und "value" übernimmt bei jedem Durchlauf den jeweiligen Wert. Null und der Existenzoperator Wir machen gleich mal etwas richtig cooles, aber dafür muss noch ein bisschen Wissen her. Und zwar: Alle Variablen, die keinen primitiven Datentyp haben (int, boolean, float, ...), sondern einen nicht-primitiven (z.B. GameObject, Vector oder auch Arrays), haben den Wert null, wenn sie nicht initialisiert sind. Versucht man mit einer nicht initialisierten, nicht-primitiven Variable zu arbieten, gibt es meist einen Fehler: var richtung : Vector3; function Start() { richtung.x = 5; //FEHLER!!! "richtung" ist nicht initialisiert! } Der Fehler heißt dann "NullReferenceException". Man kann den Wert null für Abfragen benutzen: if(richtung != null) richtung.x = 5; In diesem Fall gibt es keinen Fehler (aber natürlich auch kein x = 5). Unity macht uns das noch ein Stück einfacher und lässt uns alle nicht-primitiven Variablen wahlweise wie booleans behandeln: if(richtung) oder if(!richtung) Erstere Abfrage wird in unserem Fall false ergeben, die zweite somit true. Diese Möglichkeit nenne ich gerne "Existenzoperator". Ein dynamisches Array abarbeiten Hier gibt's jetzt mal einen Code für Fortgeschrittene! Und zwar eine Zuweisung in einer Abfrage. var sachen : Array = Array(); //Array füllen... var ding; while(ding = sachen.Pop()) { print(ding); } In diesem Code wird bei jedem Aufruf der While-Schleife der Variable "ding" der Wert des jeweils letzten Elements von "sachen" zugewiesen, anschließend kann innerhalb des Funktioneskörpers mit diesem Wert gearbeitet werden, indem man "ding" benutzt. Die Zuweisung wird vor der While-Abfrage ausgeführt, und die Abfrage schaut am Ende nur nach "ding" und beachtet alles ab dem Gleichzeichen nicht mehr. Da Unity uns den Existenzoperator bereitstellt, hört die while-Schleife auch auf, sobald das Array leergepoppt wurde (ok, jetzt darfst Du lachen). Arrays in Unity Abgesehen von den überall vorhandenen Nutzungsmöglichkeiten von Arrays, ist es gut, wichtige Arrays in Unity zu kennen. Eines ist zum Beispiel der Rückgabewert von GameObject.FindGameObjectsWithTag(tag), in dem alle GameObjects des aktuellen Levels mit dem Tag "tag" stehen. Forscht man ein wenig in der Scriptreferenz herum, begegnet man immer mehr Arrays. Abschließende Worte Wow, jetzt hast Du echt schon einiges gelernt. Wenn Du das, was Du bis jetzt in den drei Tutorials von mir nicht nur gelesen, sondern auch verstanden hast, musst Du dich offiziell nicht mehr Anfänger nennen, denn Du hast die wichtigsten Aspekte des Programmierens erlernt. Glückwunsch!
  20. Du kannst in Unity verschiedene Grafikkarten-Generationen emulieren. Und die Stats im Game-Fenster helfen dir auch. Genaueres weiß ich auch nicht.
  21. Naaah, einfach einen Trigger bauen, und dann einen Script dazu, der eine Transform-Variable hat und bei OnTriggerEnter() den Zielpunkt der interpolierenden Kamera setzt.
  22. Habs mir jetzt auch mal angesehen und finde es echt nicht schlecht. Zwei Dinge: 1. Die Warnungen hätte ich gerne nicht mitten im Bild, dafür vielleicht farbig 2. Es wäre cool, wenn die Kamera, wenn das Taxi bis zu einer bestimmten Höhe über einer Plattform ist, eine feste, hohe Position einnimt und bis zum Verlassen der Plattform statusch drauf hält.
  23. Sascha

    Dinge im Editor anzeigen

    Hallo, Ich bastele gerade an einem Pfadnetzwerk-System und habe ein paar PathNode-Objekte in einem Level. In einem Array im PathNode-Script habe ich andere PathNodes verzeichnet, mit denen der aktuelle Node verbunden ist. Ich würde gerne Linien zwischen verbundenen PathNodes im Editor anzeigen, während das Spiel nicht läuft. Weiß jemand, wie? Danke im Voraus //e: Das hat sich mal wieder schnell erledigt (typisch, direkt nach dem ich die Frage stelle...): OnDrawGizmos() tut den Trick.
  24. Vermutlich, aber das dürfte noch ein wenig dauern, bis ich dazu komme...
  25. 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.
×
×
  • Neu erstellen...