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

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

1

19.02.2013, 16:04

C# als Skriptsprache, allgemeines Konzept

Hey,
ich arbeite seit einiger Zeit nebenher immer mal wieder an einem kleinen Framework, welches auf SFML2 basiert, bzw auf dessen .Net-Binding. Es gab verschiedene Gründe dafür und mittlerweile finde ich immer mehr Vorbilder, bei welchen ich mir bestimmte Funktionen bzw Features abgucke, welche ich für mein Framework selbst haben möchte. Zur Zeit geht es mir um die Benutzung des Frameworks. Ich möchte den größten Teil hinterher gern mit C# als Skriptsprache benutzen können. Im Prinzip kommen ein paar Editoren zusammen, welche ich gerne in einem größeren Programm zusammen fassen möchte. Dadurch hat sich mir die Frage gestellt, ob man das Spiel selbst nicht möglicherweise auch in so einem Editor schreiben soll. Für den Codeteil könnte ich mir vorstellen eine externe IDE zu verwenden, so wie es zum Beispiel bei Unity gemacht wird. Schon alleine, da ich nicht mal eben nebenher vergleichbares zu Visual Studio schaffen kann;)
C# hat für mich jetzt den Vorteil, das ich direkt auf alle Elemente meiner Frameworkklassen zugreifen kann. Durch Python oder LUA würde das alles etwas komplexer werden und um einiges mehr Arbeit kosten. Außerdem gefällt mir die Mächtigkeit von .Net, welche beim entwickeln eines Spiels sicher hilfreich ist.

Nun das zum Hintergrund. Nun zur eigentlichen Sache. Habt ihr C# schon als Skriptsprache in .Net Anwendungen benutzt und wie waren eure Erfahrungen dabei? Wie sollte ich das allgemein angehen. Ein Ansatz, welchen ich aktuell für sinnvoll halte, wäre einfach den Compiler mit den Skripten aufzurufen und daraus eine ausführbare Datei zu generieren. Das Framework selbst würde als Bibliothek eingebunden und meine eigene Software würde das ganze im Prinzip nur verbinden, ein wenig Code generieren und ein paar Details verschleiern.
Ein weiterer Ansatz wäre aus den Skripten eine Bibliothek zu generieren, welche dann vom Spiel geladen wird. Dort drin sind dann die benötigten Codedatein. Teils vom Benutzer geschrieben und teils generiert.
Ein letzter Ansatz wäre die Skripte zur Laufzeit zu laden, zu übersetzen und einzubinden. Das hätte natürlich den Vorteil, dass man an den Skripten rumspielen kann ohne die ganze Anwendung zu kompilieren. Ein wirkliches "muss" wäre das für mich aber eigentlich nicht.

Nun das sind meine Ideen die ich dazu hatte. Vielleicht habt ihr schon mehr Erfahrung damit sammeln können und könnt mir Tips dazu geben. Wichtig wäre für mich auf jeden Fall die Machbarkeit. Es ist natürlich schön eine schöne Lösung zu haben, wenn die aber nicht zeitlich umsetzbar ist habe ich davon nichts;) Vielleicht gibts ja auch ein paar andere Anregungen oder Ansätze. Möglicherweise gibts ja auch Lücken in meinen Ideen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

19.02.2013, 16:24

Zur Laufzeit. Definitiv.
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]

Yannic

unregistriert

3

19.02.2013, 16:57

Erfahrungsgemäß ist das Einbinden C#'s als Scriptsprache in den meisten Fällen sehr einfach, weil man eben eine fertige Komponente benutzt und nicht selbst einen Interpreter schreiben muss etc.
Also ich würde der Geschwindigkeit/dem Speicherverbrauch wegen(kommt halt drauf an, wie viele Scripts du hast) alles in eine DLL vorkompilieren und da dann die Typen rausziehen, die von einem bestimmten Typen erben oder ein Interface implementieren.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static List<Type> GetTypesByInterfaceOrBaseClass<T>(Assembly assembly)
{
    return ((assembly != null) ? 

        (List<Type>)
        (from a in assembly.GetExportedTypes() 
            where a.IsClass && ((typeof(T).IsClass && (a is T)) || (typeof(T).IsInterface && a.GetInterfaces().Contains(typeof(T)))) 
            select a)

        : new List<Type>());
}

public static T CreateObjectFromType<T>()
{
    return Activator.CreateInstance<T>();
}

public static object CreateObjectFromType(Type type)
{
    return Activator.CreateInstance(type);
}

Sonst kann ich dir auch noch empfehlen boo empfehlen, ist ja zusätzlich implementierbar, hübsche Scriptsprache IMO.
Einfach zwei Assembly mit dem C#-/Boo-Modul kompilieren und dann per ILMerge für die Übersichtlichkeit zusammhauen, ab in das Framework! :thumbsup:

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

19.02.2013, 17:25


Also ich würde der Geschwindigkeit/dem Speicherverbrauch wegen [...]


Und wo ist das jetzt der Unterschied? Wir reden hier von C# und nicht von C++ oder sowas ;)
Das wird sich lediglich einmal beim Laden der Skripte unterscheiden...

Yannic

unregistriert

5

19.02.2013, 17:26

Genau, aber Ladezeiten nerven ja auch.

6

19.02.2013, 20:04

Wenn wir grade beim Thema sind. Kann man C# auch als Skriptsprache für ein in C++ geschriebenes Framework nutzen oder muss man da den Umweg über C++/CLI gehen? Ich könnte mir vorstellen das CLI das Einbinden von C# einfacher macht aber vielleicht gibts dazu ja noch Stichworte die einem da mehr Informationen bringen.
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

19.02.2013, 20:08

Ich muss sagen, die Version bei der zur Laufzeit geladen wird fand ich persönlich am schlechtesten. Mir geht es hier weniger um eine Skriptsprache mit welcher man bestimmte Punkte eines Spiels schrieben kann, sondern um eine Sprache mit der man das Spiel schreibt. Das alles zur Laufzeit zu laden wird doch vermutlich eher umständlich oder nicht.
Yannic dir kann ich leider nicht ganz folgen. Warum soll ich mir Typen aus einer Assembly ziehen? Ich bin mir bei deinem Code nicht sicher. Was in etwa passiert verstehe ich glaube ich schon, aber nicht warum ich das so umständlich machen muss. Ich hatte mir das so gedacht (vereinfacht). Ich habe eine Klasse für ein Objekt. Diese bekommt ein Interface welches eine Update Methode festlegt. Möchte man nun das Verhalten eines Objekts schreiben, erbt man von diesem Interface. man schreibt seinen Code. Das Programm generiert dann den Code, welcher die Objekte im Startzustand initialisiert. Alles was ab dann passiert wird ja im Prinzip dann durch die selbstgeschriebenen Skripte gesteuert. Habe ich da Möglicherweise einen Denkfehler?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Yannic

unregistriert

8

19.02.2013, 21:00

@Sortoc http://www.mono-project.com/Embedding_Mono

@Schorsch Ich weiß nicht wie was bei dir genau funktioniert und geladen wird, ich hab mir das einfach ein bischen bei Unity abgeguckt
und für mich verbessert. Das sieht also so aus, das von einer Klasse 'Behaviour' geerbt wird, die ein Update-Event definiert.
Alle Klassen, die von 'Behaviour' erben werden aus der Assembly extrahiert und dann gemäß des gespeicherten Levels an die GameObject attached.

Gruß,
Yannic ;)

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

19.02.2013, 23:31

Unity wäre ja im Prinzip eins meiner Vorbilder. Du hast ja schon ein paar Sachen genannt und da werde ich mal weiter forschen. Du schreibst dass du dir das so bei Unity abgeschaut hast. Gibt es dazu selbst Informationen im Internet, oder hast du selbst irgendwie Informationen extrahiert? Oder ist es einfach der Weg den du dir vorstellst, wie es bei Unity gemacht wird? Wenn du dazu noch ein paar Informationen hast, wäre es fein wenn du sie mit mir teilen würdest. Aber wie gesagt, habe ich jetzt ja schon ein paar Stichpunkte bekommen. Werd das ganze mal ein wenig testen. Danke schon mal an alle beteiligten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Yannic

unregistriert

10

19.02.2013, 23:39

So mache ich das einfach, kommt wahrscheinlich relativ nah dran, aber gewisse Sachen werden anders sein, weil durch die C-API von Mono auf die Scripts zugegriffen wird.

Werbeanzeige