Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.12.2013, 00:41

Spieler können Scripte im Spiel bearbeiten

Hallo
Ich versuche es jetzt einfach auch mal hir. Vielleicht hat ja jemand eine Idee, oder die Lösung wie ich dieses irgendwie echt schwere Thema umsetzen kann :D Das ganze läuft in Unity 3d.

Und zwar folgendes. Ich habe also ein Spiel. In diesem Spiel gibt es also mehrere Spieler, und diese haben Ihre Begleiter (Krieger)

Jetzt kann jeder Spieler auf seinen Krieger glicken und über einen Button das KIScript öffnen. Dort kann ich nun für meinen Krieger das Script ändern, abspeichern und so gegen andere Spieler kämpfen lassen. (Das ist also der Plan)

Was ich versucht und geschaft habe:
Habe das Lua Interface probiert. geht bei ir irgendwie garnicht. Habs zwar geschaft das er ein Script ausgibt, aber ich kann rein garnichts tran verändern.

Ein selbst zusammengeschustertes. Mit diesem kann ich schon über den Krieger auf den Button glicken und es erscheint auch das KI Script. Auch bearbeiten kann ich es. Das Problem ist nur. Speichern und überschreiben des Scripts funktioniert nicht. Zudem ist es das allgemeine Script. (Es funktioniert auch nur im Unity Editor selbst) Was heist, er benutzt nicht nur das Script von dem Krieger, sondern das Script aller Krieger, was ja nicht sinn und Zweck ist.

Das sind meine Probleme. Ich hätte einfach gerne über ein Script das KIScript des Kriegers ausgefählt den ich auch angewählt habe (besser gesagt in meinem Besitz ist) Das KI Script überschrieben und dann gespeichert, so dass dann der Krieger dieses im Gefecht nutzt.

Weitere bedenken die ich noch hatte. Wie hoch ist die gefahr bei solchen IngameScriptEditoren. Immerhin kann jeder schreiben was er möchte. Oder kann er da wenig kaputt machen? Virus plazieren? Oder anderes? Kann man ne Kontrolle einbauen?

Ich danke schon mal für die Hilfe :)

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

12.12.2013, 15:38

Ersteinmal die Aufteilung in die einzelnen Aufgabenteile:
Ein Skript muss bearbeitet werden können.
Ein Skript muss einem Gameobject zugewiesen werden können.
Ein zugewiesenes Skript muss ausgeführt werden können.

Das Bearbeiten ist fast Ausschließlich eine Sache des Interfaces und sollte nicht weiter problematisch sein.
Das Zuweisen sollte relativ unkompliziert sein. Ich persönlich würde so vorgehen, dass der entsprechenden Komponente der Einheit das Skript als String zugewiesen wird und die Komponente dann ihre Magie wirken lässt.

Komplexer ist da die Ausführung:
Die bereits erwähnte Komponente müsste dann wohl ein paar Dinge übernehmen:
Vorbereitung des Skriptcodes (z. B. Kompilieren, sofern notwendig) und ggf. das Melden von Fehlern (Wahlweise kann dieses auch schon an einer vorherigen Stelle oder durch eine andere Komponente durchgeführt werden.)
Aufrufen der im Skript definierten Funktionen/Methoden.
Einschränken der erreichbaren Funktionalität.
Die letzten beiden Dinge kann man auch mit "Bereitstellen der API" zusammenfassen. Wichtig für die Ausführung ist: was soll wann aufgerufen werden, was wird zur Verfügung gestellt und was wird als Rückgabe erwartet. (Das ist großteils dann deine Aufgabe, da du das Schreiben der KI zur Verfügung stellen willst, was unabhängig von der Ausführung von Skripten ist, die der Benutzer/Spieler geschrieben hat.)
Damit es nicht zu Sicherheitsproblemen kommen kann, sollte der Code nicht einfach alles einbinden können, was Mono so hergibt (keine Netzwerkkommunikation, kein Zugriff aufs Dateisystem, kein Absetzen von Systembefehlen, kein Ansprechen des Speakers auf dem Mainboard (dürfte in Mono meines Wissens ohnehin nicht gehen, aber mein Wissen kann auch veraltet sein...) etc.)
Damit neben der Malware auch Cheating unterbunden wird, sollte kein freier Zugriff auf die Szene, die GameObjects oder die Komponenten zugelassen werden.
Wichtig ist auch noch, dass der Code zu einem fest definierten Zeitpunkt initialisiert und freigegeben wird und auch, was der Code dabei machen darf/kann. In der Zeit dazwischen sollte es dem Spieler evtl. lieber nicht möglich sein, den Code zu ändern, da das nur zu Problemen führt (Syntaxfehler, Verlust des Zustands durch das erneute initialisieren, ...).
Und du musst an jeder Stelle, von der aus du Benutzercode aufrufst, mit Exceptions seitens des Benutzercodes rechnen (Division durch 0, NullReferenceException, Typfehler, ...). Wenn der Code einen Wert ermitteln sollte, muss dein Code an dieser Stelle einen Standardwert für einen Fehlerfall oder ein anderes Verhalten ("nichts tun") ausführen können.

Grundsätzlich dürfte es egal sein, ob Lua, Python, JavaScript (damit meine ich kein UnityScript ;) ) oder vielleicht sogar C# angeboten wird. Für die erstgenannten braucht man lediglich einen Interpreter für Mono (IronPython, IronLua und IronJS), für C# müsste man es schaffen, dieses vorher mit Mono (worin die Unity-Komponenten ausgeführt werden) zu kompilieren, aber das sollte durchaus möglich sein.
Wenn du es bereits geschafft hast, Lua-Code auszuführen, dann kannst du auf gleichem Wege auch Benutzerdefinierten Code ausführen. Irgendwie hast du ja einen String mit Lua-Code irgendwo, mit dem du irgendwas machst, und mit der Eingabe des Spielers muss genau das nochmal gemacht werden.)


Das sind die Dinge, die mir auf Anhieb eingefallen sind. Es kann durchaus sein, dass es noch weitere Dinge gibt, auf die ich hier noch nicht hingewiesen habe.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Nightmaremen

Treue Seele

Beiträge: 110

Beruf: Schüler

  • Private Nachricht senden

3

06.02.2014, 18:52

mal ganz von der rechtschreibung abgesehen halt ich das(insofern wie ich scripte verstanden habe,wenn ich was falsches sage liegt es wohl daran) für keine besonders gute Idee. Natürlich ist der Grundgedanke gut aber in einem spiel bestimmen zu können , was ein npc so kann und macht halt ich für fraglich , und für mich hört sich deine beschreibung an , als wolltest du hier ein (auch wenn nicht beabsichtigt) legales ich nenn es mal "cheatsystem" einbauen .
Ich würde da eher einige vorgaben machen was der npc könne /machen darf
"for a silent travel, u´d better take the next Train" (Lightning)

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

4

06.02.2014, 19:20

legales ich nenn es mal "cheatsystem" einbauen

?(

Du könntest dir das hier mal anschauen, vielleicht könntest du dir daher ein paar Ideen nehmen da dein Vorhaben sozusagen einfach eine erweiterte Development Console ist.
Wünsch dir viel Glück, kannst uns ja auf dem laufenden halten wie es läuft. (Klingt nämlich interessant)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cranberry« (07.02.2014, 09:40)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

07.02.2014, 08:03

Ich freu mich schon drauf...

myWarrior.DealDamage(Arena.FindNearestOpponent(myWarrior), 200000000000);

/win

Aber mal ernsthaft. Wie Sacaldur schon sagte, solltest Du anfangen die Problemstellung in kleine Teilbereiche zu zerlegen und Dich Stück für Stück weiterzuarbeiten, statt alles auf einmal zu wollen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

6

07.02.2014, 13:59

Ich freu mich schon drauf...

myWarrior.DealDamage(Arena.FindNearestOpponent(myWarrior), 200000000000);


myWarrior.SetResistance(100,Resistance.Physical);
:P
Liebe Grüße,
René

TSM

Frischling

Beiträge: 30

Beruf: Schüler

  • Private Nachricht senden

7

12.04.2014, 16:29

zurück zum Thema

Also mir würde mal jetzt ganz spontan eine Sache einfallen und zwar: könntest du den eingegebenen Code oder Script in einen String abspeichern und dann in ein beliebiges Format abspeichern und dann den Script neu lädst. :)

Werbeanzeige