Einsatz von LUA in der Spieleindustrie



  • Hallo,
    man liest ja oft, dass LUA ja quasi der Standard in der Spieleindustrie ist, hedoch wofür genau wird es eigentlich gebraucht, werden damit bei RPGs z.B. die Storys dann zusammengeskriptet oder wie?
    Es wäre nett, wenn mir da mal jemand genauer erklären könnte, wozu man LUA braucht 🙂



  • Soweit ich weiß
    Die Oberfläche von WoW, Iris3 und vielen mehr
    Die Maschinen incl der KIs des Landwirtschaftssimulators und vielen mehr
    Überhaupt alle möglichen Plugins
    Und immer, wenn man Schichten trennen will, so daß der Scripter nicht durch einen Programmierfehler das Game zum Absturz führt.
    Die von Dir genannten Quests in RPGs wären ein absoluter Kandidat, ja.
    http://www.gameengineer.net/downloads/tutorials/AngelScript/Game Scripting 101.pdf


  • Mod

    damit
    "Und immer, wenn man Schichten trennen will, so daß der Scripter nicht durch einen Programmierfehler das Game zum Absturz führt."
    hat es eigentlich weniger zu tun, lua scripte bringen oft genug programme zum absturz, in bloedesten faellen ist es ein endlos loop zwischen mehreren lua scripten.

    lua kann man fuer allerlei benutzen, z.b. hat man frueher ini files usw. benutzt um irgendwelche parameter zu initialisieren, meistens mit eigenen parsern die wuchersten weil jeder und niemand damit arbeiten wollte.
    mit lua kanst du die parameter auch initialisieren, du kannst dabei sogar funktionale initialisierungen machen (ala height=width/16*9), es ist ja nur ein script dass du laedst.

    du kannst lua benutzen um speicherstaende zu generieren, statt z.b. xml, das hat den vorteil dass du nur ein interface pflegen musst, statt lua+xml.

    du kannst lua scripte als events verschicken die dann beim receiver interpretiert werden, damit kannst du komplexe funktionalitaet haben ohne sie explizit implementieren zu muessen. (ich hab z.b. um ein licht flackern zu lassen, ein lua script sich selbst mit einem 500ms delay an den parent schicken lassen. wenn du dir andere engines anschaust, haben die oft hardgecodete effekte beim licht wie "flackern" "fackel" etc.)

    du kannst deine konsole mit lua interpreter laufen lassen, damit kannst du fast alles per console machen was ein script koennte, umgekehrt kann auch jedes script alles machen was in der konsole moeglich ist.

    das einzige was an lua nicht so schoen ist, ist die speicherverwaltung. auf kleinen geraeten (gba,psp) verwende ich deswegen pawn script. die laufen in ihren sandboxes (und sind auch recht schnell).



  • AddOns für MMORPG's sind wohl öfter in LUA geschrieben.



  • Weiteres Einsatzgebiet: Modding.
    Beispielsweise kann man Supreme Commander (ein RTS) komplett über LUA Scripts modden.
    Also eben nicht nur Bitmaps und Einheitenwerte ersetzen sondern auch neues Verhalten erzeugen, sowohl bei den Einheiten (KI) als auch beim UI.


  • Administrator

    Weiteres Einsatzgebiet: Quests & Tutorials.
    Und somit ja, man kann damit Stories "zusammenskripten". Man ist aber viel flexibler als einfach nur mit einer Textdatei, wo die Texte enthalten sind. Man kann halt auch Events auslösen, wodurch z.B. in dem Moment, wenn man bei Punkt A ist, bei Punkt B eine Explosion passiert.

    Man ist halt viel flexibler und kann Content hinzufügen oder anpassen, ohne dass man das Spiel neu kompilieren muss. Über eine Lua-Konsole kann man dann sogar Skripte, während das Spiel läuft, erstellen und ausführen.

    rapso schrieb:

    das einzige was an lua nicht so schoen ist, ist die speicherverwaltung. auf kleinen geraeten (gba,psp) verwende ich deswegen pawn script. die laufen in ihren sandboxes (und sind auch recht schnell).

    Hast du dabei auch schon mal andere Lua-Implementation verwendet?
    http://lua-users.org/wiki/LuaImplementations

    Oder wo genau ist dein Problem mit der Speicherverwaltung?

    Grüssli



  • Also.....
    ich habe es jetzt so verstanden, das man die Engine z.B. in C++ programmiert, und dann alle Funktion für Lua registriert, und sie dann in seinem Skrip nach belieben aufruft. Stimmt da so in etwa? Ein Stück handfester Code wäre da vielleicht eine Hilfe für mich 🙂
    Aber das mit der Initilisierung verstehe ich nicht so ganz, bisher habe ich einfach die WinAPI-Funktionen benutzt, um eine .ini Datei zu parsen. Damit ist es auch einfach, die Werte über ein Programm zu ändern. Mit einem Luaskript stell ich mir das ganze jetzt irgendwie viel kompliziert vor, denn irgendwie muss ich die Werte ja auch da aus dem Spiel heraus schreiben können. Wie soll das dann einfacher gehen?


  • Mod

    Dravere schrieb:

    Hast du dabei auch schon mal andere Lua-Implementation verwendet?
    http://lua-users.org/wiki/LuaImplementations

    noe, wueste auch nicht wirklich welchen zusammenhang das impliziert.

    Oder wo genau ist dein Problem mit der Speicherverwaltung?

    gab viele dynamische allokationen einfach nur damit ein script laeuft (selbst wenn das script an sich nichts allokiert). fuer qualit of service ist das eher suboptimal, da willst du eher ein festes budget haben koennen und dir sicher sein, dass es nichts an speicher verschwendet aber auch nicht zuwenig ist, dass es fehler verursacht.
    ich verwende lua seit version 3.2 oder so, es war mir damals nicht moeglich es wirklich stabil zum laufen zu bringen, wenn ram limitiert war.



  • openglnoob schrieb:

    Also.....
    ich habe es jetzt so verstanden, das man die Engine z.B. in C++ programmiert, und dann alle Funktion für Lua registriert, und sie dann in seinem Skrip nach belieben aufruft. Stimmt da so in etwa? Ein Stück handfester Code wäre da vielleicht eine Hilfe für mich 🙂
    Aber das mit der Initilisierung verstehe ich nicht so ganz, bisher habe ich einfach die WinAPI-Funktionen benutzt, um eine .ini Datei zu parsen. Damit ist es auch einfach, die Werte über ein Programm zu ändern. Mit einem Luaskript stell ich mir das ganze jetzt irgendwie viel kompliziert vor, denn irgendwie muss ich die Werte ja auch da aus dem Spiel heraus schreiben können. Wie soll das dann einfacher gehen?

    Es ist nur indirekt einfacher. Am Anfang ist es erst mal schwieriger. Du musst duch mit Lua genauer beschäftigen und dir Informationen dazu suchen, wie man es in sein Projekt einbindet. Dabei wird dir auffallen, das Lua in C geschrieben ist und sofern man mit C noch nichts am Hut hatte, muss man sich auch an diese Konzepte gewöhnen oder alternativ frühstmöglich auf einen Wrapper zurückgreifen.

    Dann muss man sich überlegen, was man alles veränderbar machen möchte. Dabei fängt man sinnvollerweise klein an. Am Anfang kann man die Feinde ja über Variablen beschreiben.

    Zombie.lua

    Name = "Zombie"
    Damage = 10
    Speed = 50

    Headcrab.lua

    Name = "Headcrab"
    Damage = 5
    Speed = 150

    Dann kann man sich eine Datei basteln, die wie das Level heißt. Das Level hat dann eine Funktion Init, die die Welt aufbaut. Außerdem hat man in seiner Engine eine Funktion, um Feinde zu erzeugen

    Level1.lua

    function Init()
    CreateEnemy("Zombie", 3, 4)
    CreateEnemy("Zombie", 2, 5)
    CreateEnemy("Zombie", 2, 1)
    CreateEnemy("Headcrab", 5, 2)
    end function

    Dabei beschreibt der erste Wert den Namen des Gegners und die beiden anderen Werte die X- und Y-Position in der Spielwelt (in diesem Beispiel gehe ich von einer Tilemap aus).

    Man kann das noch weiter ausbauen und eine Funktion registrieren, die einen EnemySpawner erzeugt, der in einem Intervall immer wieder Gegner erzeugt:

    CreateEnemySpawner("Headcrab", 5, 2, 1000)

    Erzeugt an Position (5, 2) ein Spawner, der alle 1000 Millisekunden einen neuen Gegner spawnt.

    Mit diesen paar Dingen, kann man schon eine Menge erreichen. Erweitert man das ganze noch um Events:

    EventZombie.lua
    function Event()
    CreateEnemy("Zombie", 3, 4)
    end function

    Und dann in der Init für das Level:

    RegisterEvent("EventZombie", 2, 3)

    Dann wird beim BEtreten der Position (2, 3) die Lua-Datei EventZombie geparst und die Event-Funktion ausgeführt, die einen Zombie spawnt.

    Wenn man das noch weiter ausbaut, dann hat man irgendwann so viel Macht, das man praktisch alles machen kann. Das Tor für viele Möglichkeiten ist damit offen.

    Doch das ist am Anfang ziemlich viel Arbeit und der Weg ist lang. Aber es lohnt sich bei größeren Projekten mit vielen Leveln, etc.

    Mehr Beispielcode kann ich dir auch nicht liefern. Dafür ist das ganze zu individuell. Aber vielleicht hast du ja eine Idee bekommen.



  • Danke sdfdf, jetzt kann ich mir schon eine Menge mehr darunter vorstellen.
    Ich bin gerade dabei ein kleines Rennspiel zu entwickeln, gibt es da Einsatzmöglichkeiten für Lua? Als erstes fällt dir da die KI für die Gegner ein, aber gibt es in diesem Fall auch andere Sachen die ich mit Lua realisieren könnte/sollte, die mir nachher mehr Flexibilität geben?



  • Vielleicht die Fahrdymanik für unterschiedliche Fahrzeugtypen.

    Es hängt eben sehr viel von den Gegebenheiten ab. Man muss einfach schauen, was sich "auslagern" lässt.


  • Administrator

    rapso schrieb:

    Dravere schrieb:

    Hast du dabei auch schon mal andere Lua-Implementation verwendet?
    http://lua-users.org/wiki/LuaImplementations

    noe, wueste auch nicht wirklich welchen zusammenhang das impliziert.

    Andere Implementation -> Andere Speicherverwaltung. In der Spieleindustrie wird ja unter anderem auch deswegen nicht immer die Standardimplementation genommen. LuaJIT ist da anscheinend noch recht verbreitet.

    openglnoob schrieb:

    Ich bin gerade dabei ein kleines Rennspiel zu entwickeln, gibt es da Einsatzmöglichkeiten für Lua? Als erstes fällt dir da die KI für die Gegner ein, aber gibt es in diesem Fall auch andere Sachen die ich mit Lua realisieren könnte/sollte, die mir nachher mehr Flexibilität geben?

    Ich persönlich würde so Dinge wie Tutorials mit Lua implementieren. Sowas lässt sich meistens mit weniger Aufwand per Lua implementieren und vor allem auch schneller testen und ein wenig ausprobieren.
    Über Lua kannst du Texte ausgeben, Bereiche blinken lassen oder irgendwelche Umrandungen einfügen, usw. Das Tutorial ist dann ein oder mehrere Lua-Skripte, welche nacheinander ausgeführt werden.

    Oder wie schon erwähnt wurde, kann man über Lua auch sehr gut Einstellung abspeichern. Bei einem Rennspiel wären das vielleicht Daten zu den Rennstrecken oder den Autos. Oder kann es auf Rennstrecken auch Ereignisse geben? Dann wäre dies auch ein Fall, wo man Lua in Erwägung ziehen könnte.

    Auch möglich ist die Unterstützung von Statistiken. Über Lua-Skripte kann man die Daten ansprechen und Statistiken erstellen, welche der User vielleich sogar über CSV exportieren kann.

    Den Möglichkeiten sind fast keine Grenzen gesetzt.

    Grüssli



  • Da hier ja einige schon etwas mehr Erfahrung mit LUA haben.. welchen Editor nutzt ihr? Gibt es da irgendeinen der aus der Masse heraussticht?



  • Klar: Notepad 😉

    Hihi, ich meine natürlich Notepad++ ...
    (wird z.B. auch von einer Modder-Gruppe für den Landwirtschafts-Simulator eingesetzt: Acids-Mods: Notepad++)



  • Ok danke für die zahlreichen Antworten, habe jetzt aufjedenfall mal eine klare Vorstellung zum Einsatz von Lua 🙂
    Bezüglich des Editors, ich habe mir irgendwann mal ein Plugin für Visual Studio runtergeladen, welches auch Syntax-Coloring für Lua unterstützt. Damit lassen sich dann im Visual Studio alle Dateien schön verwalten.


Anmelden zum Antworten