Jump to content
Unity Insider Forum

The World of Mysteria-Moon


Recommended Posts

Das ist auch der Titel meines ersten Buches.

 

Eine Leseprobe gibt es kostenlos über meine Homepage:

 

http://www.mysteria-arts.de

 

Da könnt ihr euch auch in die Geschichte etwas einlesen.

 

Nun habe ich lange Zeit nach einer geeigneten Engine gesucht, und bin bei Unity gelandet.

Erster Versuch war mit UDK. Damit kam ich jedoch nicht klar. Mit den Tuts vom Softwareentwicklerblog konnte ich nach 3 Tagen mehr machen, als mit UDK nach 2 Wochen!

 

Geplant ist eine nahezu 1:1 Umsetzung zum Buch.

 

Benutzte Software:

 

Unity 3

Photoshop

MAYA

Sculptris

Mudbox

Motion Builder

Terragen 2

Realflow

Endorphin

 

Nun. Es ist derzeit ein Einmannprojekt. Das Einarbeiten in diese Programme hat schon ein paar Jahre gedauert. Mein erstes MAYA 3D-Modell entstand 2004.

 

Hilfe ist daher sehr willkommen. Das Spiel soll irgendwann ja auch mal auf den Markt.

 

Ich stecke derzeit etwas fest und möchte hier um Rat fragen:

 

Ich habe ein Charakter-Menue erstellt und das Inventar selbst ist ein Scrolldown menue.

Nun bin ich am überlegen, wie ich das Ganze am besten löse.

 

Derzeit habe ich das Menue für jeden Charakter in einem eigenen Script erstellt.

Die Frage ist nun, wie ich das bei einem Stufenanstieg regeln soll. Der ist in einem eigenen Script. So kann ich aber die Charawerte, die im Scrolldownmenue stehen nicht so einfach ändern.

 

Deshalb habe ich überlegt, ein Mastermenue tu machen, in dem ich alle feste stehenden Anzeigen unterbringe, und das Scroll-Down in ein separates Script packe. Macht das Sinn?

 

Ein Charaktermenue-Script hat immerhin schon über 3200 Zeilen. Das wird irgendwann zu unübersichtlich.

 

Hier mal 2 Screenshots:

 

Menue mit den Charawerten:

post-911-0-92972800-1324410510_thumb.jpg

 

Menue mit Inventar:

post-911-0-49436000-1324410513_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast für jeden Charakter das Menü extra geschrieben?

Wieso machst du sowas :) für was gibt es denn Vererbung und Objektorientierung...

 

Wenns so sein sollt empfhele ich dir dein gesamtes Charakter System so um zu schreiben das du nur ein Menü brauchst und lediglich jeweils die Werte des Charakters um den es sich dreht aus diesem ausliest!

 

Bei Fragen helfe ich gern!

 

Gruß Stephan

Link zu diesem Kommentar
Auf anderen Seiten teilen

So hab ich mir das auch gedacht.

Ich hab das erste Charaktermenue erstellt, auch um das GUI-Design aufzubauen. Für die anderen Charas war das dann nicht viel arbeit. Einfach kopieren. Jetzt hab ich ein Blanko "Master Menue" erstellt. in diesem will ich dann die Werte der Charas einlesen.

Das mit der Vererbung kanns Du mir gerne mal erklären.

Denn nach meinem bisherigen Wissenstand müsste ich dann die Werte der Charas in einer If, oder While Schleife einlesen.

 

So nach dem Motto:

 

if (Mortac_ist_angewählt) ....

Bzw, mit Case.

 

Aber bei 100 spezifischen Charawerten und 26 Charas ist das eine menge Arbeit...

 

Ich habe für den Spielbeginn für jeden Charakter ein Basic-Script:

 

Basic_Mortac.js:

 

var NEU : boolean;
function Update () {
NEU = Menue.NEU;
//Charaktervariablen von Mortac
// Basics
 PlayerPrefs.SetString("Name_01", "Mortac");
 PlayerPrefs.SetString("Race_01", "Caldobaraner");
 PlayerPrefs.SetString("Class_01", "Wissenschaftler");
 PlayerPrefs.SetInt("Level_01", 1);
 PlayerPrefs.SetInt("LE_01", 50);
 PlayerPrefs.SetInt("LEMAX_01", 50);
 PlayerPrefs.SetInt("AE_01", 0);
 PlayerPrefs.SetInt("AEMAX_01", 0);
 PlayerPrefs.SetInt("LP_01", 0);
 PlayerPrefs.SetInt("EXP_01", 0);

 PlayerPrefs.SetInt("WST_01", 0);
 PlayerPrefs.SetInt("MST_01", 0);
 PlayerPrefs.SetInt("RS_01", 3);

// Eigenschaften
// Positive
 PlayerPrefs.SetInt("MU_01", 8);
 PlayerPrefs.SetInt("KL_01", 19);
 PlayerPrefs.SetInt("KK_01", 25);
 PlayerPrefs.SetInt("CH_01", 8);
 PlayerPrefs.SetInt("GE_01", 3);
 PlayerPrefs.SetInt("RE_01", 9);
 PlayerPrefs.SetInt("SN_01", 10);
 PlayerPrefs.SetInt("FF_01", 16);
 PlayerPrefs.SetInt("IN_01", 15);
 PlayerPrefs.SetInt("ER_01", 20);

// Negative
 PlayerPrefs.SetInt("BL_01", 3);
 PlayerPrefs.SetInt("AG_01", 2);
 PlayerPrefs.SetInt("AN_01", 5);
 PlayerPrefs.SetInt("HA_01", 1);
 PlayerPrefs.SetInt("HL_01", 4);
 PlayerPrefs.SetInt("AR_01", 6);
 PlayerPrefs.SetInt("GG_01", 1);
 PlayerPrefs.SetInt("GW_01", 2);
 PlayerPrefs.SetInt("JZ_01", 2);

// Berechnung des Ausdauer Basiswert:
 var AU : int;
 var KK : int;
 var LE : int;
 KK = PlayerPrefs.GetInt("KK_01");
 LE = PlayerPrefs.GetInt("LE_01");
 AU = LE + KK;
  PlayerPrefs.SetInt("AUMAX_01", AU);
// Fertigkeiten
 // Körperliche
  PlayerPrefs.SetInt("Klettern_01", 5);
  PlayerPrefs.SetInt("Reiten_01", 3);
  PlayerPrefs.SetInt("FahrzeugLenken_01", 10);
  PlayerPrefs.SetInt("Schleichen_01", 8);
  PlayerPrefs.SetInt("Schwimmen_01", 6);
  PlayerPrefs.SetInt("Springen_01", 7);
  PlayerPrefs.SetInt("Zechen_01", 9);

 // Gesellschaftliche
  PlayerPrefs.SetInt("Ueberzeugen_01", 2);
  PlayerPrefs.SetInt("Feilschen_01", 1);
  PlayerPrefs.SetInt("Gassenwissen_01", 3);
  PlayerPrefs.SetInt("Luegen_01", 9);
  PlayerPrefs.SetInt("Menschenkenntnis_01", 4);
  PlayerPrefs.SetInt("Schaetzen_01", 5);

 // Natur
  PlayerPrefs.SetInt("Faehrtensuche_01", 9);
  PlayerPrefs.SetInt("FallenStellen_01", 13);
  PlayerPrefs.SetInt("Jagen_01", 3);
  PlayerPrefs.SetInt("Angeln_01", 0);
  PlayerPrefs.SetInt("Pflanzenkunde_01", 4);
  PlayerPrefs.SetInt("Tierkunde_01", 1);
  PlayerPrefs.SetInt("Magiekunde_01", 3);
  PlayerPrefs.SetInt("Heilkunde_01", 2);
  PlayerPrefs.SetInt("Wildnisleben_01", 1);

 // Wissen
  PlayerPrefs.SetInt("Alchemie_01", 0);
  PlayerPrefs.SetInt("Kriegskunst_01", 1);
  PlayerPrefs.SetInt("Zauberkunst_01", 0);
  PlayerPrefs.SetInt("Mechanik_01", 14);

 // Berufliche
  PlayerPrefs.SetInt("Abrichten_01", 0);
  PlayerPrefs.SetInt("Kochen_01", 5);
  PlayerPrefs.SetInt("Goldschmieden_01", 1);
  PlayerPrefs.SetInt("Schmieden_01", 0);
  PlayerPrefs.SetInt("Bogenbau_01", 0);
  PlayerPrefs.SetInt("Ruestungsbau_01", 0);
  PlayerPrefs.SetInt("SchloesserKnacken_01", -5);
  PlayerPrefs.SetInt("Taschendiebstahl_01", 0);
}

 

Dann habe ich ein weiteres Script für jeden Chara:

 

Mortac.js:

 

// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++
// Variablen einlesen:
// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++

// Charaktervariablen
var Testing : int = 100;
static var Name = PlayerPrefs.GetString("Name_01");
static var Race = PlayerPrefs.GetString("Race_01");
static var Class = PlayerPrefs.GetString("Class_01");
static var Level = PlayerPrefs.GetInt("Level_01");
static var LE = PlayerPrefs.GetInt("LE_01");
static var LEMAX = PlayerPrefs.GetInt("LEMAX_01");
static var AE = PlayerPrefs.GetInt("AE_01");
static var AEMAX = PlayerPrefs.GetInt("AEMAX_01");
static var AU = PlayerPrefs.GetInt("AU_01");
static var AUMAX = PlayerPrefs.GetInt("AUMAX_01");
static var LP = PlayerPrefs.GetInt("LP_01");
static var EXP = PlayerPrefs.GetInt("EXP_01");

static var Kontrolle : int = 0;
static var LEVEL : int = 0;
static var EXPNEXT : int = 0;
static var ATN : int = 0;
static var ATF : int = 0;
static var MAG : int = 0;
static var PA : int = 0;
static var AW : int = 0;
static var MAR : int = 0;

static var WST = PlayerPrefs.GetInt("WST_01");
static var MST = PlayerPrefs.GetInt("MST_01");
static var RS = PlayerPrefs.GetInt("RS_01");
// Eigenschaftsvariablen

// Positive
 static var MU = PlayerPrefs.GetInt("MU_01");
 static var KL = PlayerPrefs.GetInt("KL_01");
 static var KK = PlayerPrefs.GetInt("KK_01");
 static var CH = PlayerPrefs.GetInt("CH_01");
 static var GE = PlayerPrefs.GetInt("GE_01");
 static var RE = PlayerPrefs.GetInt("RE_01");
 static var SN = PlayerPrefs.GetInt("SN_01");
 static var FF = PlayerPrefs.GetInt("FF_01");
 static var IN = PlayerPrefs.GetInt("IN_01");
 static var ER = PlayerPrefs.GetInt("ER_01");

//Negative
 static var BL = PlayerPrefs.GetInt("BL_01");
 static var AG = PlayerPrefs.GetInt("AG_01");
 static var AN = PlayerPrefs.GetInt("AN_01");
 static var HA = PlayerPrefs.GetInt("HA_01");
 static var HL = PlayerPrefs.GetInt("HL_01");
 static var AR = PlayerPrefs.GetInt("AR_01");
 static var GG = PlayerPrefs.GetInt("GG_01");
 static var GW = PlayerPrefs.GetInt("GW_01");
 static var JZ = PlayerPrefs.GetInt("JZ_01");

// Fertigkeiten

 // Körperliche
  static var Klettern = PlayerPrefs.GetInt("Klettern_01");
  static var Reiten = PlayerPrefs.GetInt("Reiten_01");
  static var FahrzeugLenken = PlayerPrefs.GetInt("FahrzeugLenken_01");
  static var Schleichen = PlayerPrefs.GetInt("Schleichen_01");
  static var Schwimmen = PlayerPrefs.GetInt("Schwimmen_01");
  static var Springen = PlayerPrefs.GetInt("Springen_01");
  static var Zechen = PlayerPrefs.GetInt("Zechen_01");

 // Gesellschaftliche
  static var Ueberzeugen = PlayerPrefs.GetInt("Ueberzeugen_01");
  static var Feilschen = PlayerPrefs.GetInt("Feilschen_01");
  static var Gassenwissen = PlayerPrefs.GetInt("Gassenwissen_01");
  static var Luegen = PlayerPrefs.GetInt("Luegen_01");
  static var Menschenkenntnis = PlayerPrefs.GetInt("Menschenkenntnis_01");
  static var Schaetzen = PlayerPrefs.GetInt("Schaetzen_01");

 // Natur
  static var Faehrtensuche = PlayerPrefs.GetInt("Faehrtensuche_01");
  static var FallenStellen = PlayerPrefs.GetInt("FallenStellen_01");
  static var Jagen = PlayerPrefs.GetInt("Jagen_01");
  static var Angeln = PlayerPrefs.GetInt("Angeln_01");
  static var Pflanzenkunde = PlayerPrefs.GetInt("Pflanzenkunde_01");
  static var Tierkunde = PlayerPrefs.GetInt("Tierkunde_01");
  static var Magiekunde = PlayerPrefs.GetInt("Magiekunde_01");
  static var Heilkunde = PlayerPrefs.GetInt("Heilkunde_01");
  static var Wildnisleben = PlayerPrefs.GetInt("Wildnisleben_01");

 // Wissen
  static var Alchemie = PlayerPrefs.GetInt("Alchemie_01");
  static var Kriegskunst = PlayerPrefs.GetInt("Kriegskunst_01");
  static var Zauberkunst = PlayerPrefs.GetInt("Zauberkunst_01");
  static var Mechanik = PlayerPrefs.GetInt("Mechanik_01");

 // Berufliche
  static var Abrichten = PlayerPrefs.GetInt("Abrichten_01");
  static var Kochen = PlayerPrefs.GetInt("Kochen_01");
  static var Goldschmieden = PlayerPrefs.GetInt("Goldschmieden_01");
  static var Schmieden = PlayerPrefs.GetInt("Schmieden_01");
  static var Bogenbau = PlayerPrefs.GetInt("Bogenbau_01");
  static var Ruestungsbau = PlayerPrefs.GetInt("Ruestungsbau_01");
  static var SchloesserKnacken = PlayerPrefs.GetInt("SchloesserKnacken_01");
  static var Taschendiebstahl = PlayerPrefs.GetInt("Taschendiebstahl_01");
  Level = PlayerPrefs.GetInt("Level_01");
// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++
// Variablen aktualisieren:
// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++

function Update () {
// Charaktervariablen
Testing = 100;

Name = PlayerPrefs.GetString("Name_01");
Race = PlayerPrefs.GetString("Race_01");
Class = PlayerPrefs.GetString("Class_01");
LEVEL = PlayerPrefs.GetInt("Level_01");
LE = PlayerPrefs.GetInt("LE_01");
LEMAX = PlayerPrefs.GetInt("LEMAX_01");
AE = PlayerPrefs.GetInt("AE_01");
AEMAX = PlayerPrefs.GetInt("AEMAX_01");
AU = PlayerPrefs.GetInt("AU_01");
AUMAX = PlayerPrefs.GetInt("AUMAX_01");
LP = PlayerPrefs.GetInt("LP_01");
EXP = PlayerPrefs.GetInt("EXP_01");

WST = PlayerPrefs.GetInt("WST_01");
MST = PlayerPrefs.GetInt("MST_01");
RS = PlayerPrefs.GetInt("RS_01");
// Eigenschaftsvariablen

// Positive
 MU = PlayerPrefs.GetInt("MU_01");
 KL = PlayerPrefs.GetInt("KL_01");
 KK = PlayerPrefs.GetInt("KK_01");
 CH = PlayerPrefs.GetInt("CH_01");
 GE = PlayerPrefs.GetInt("GE_01");
 RE = PlayerPrefs.GetInt("RE_01");
 SN = PlayerPrefs.GetInt("SN_01");
 FF = PlayerPrefs.GetInt("FF_01");
 IN = PlayerPrefs.GetInt("IN_01");
 ER = PlayerPrefs.GetInt("ER_01");

//Negative
BL = PlayerPrefs.GetInt("BL_01");
AG = PlayerPrefs.GetInt("AG_01");
AN = PlayerPrefs.GetInt("AN_01");
HA = PlayerPrefs.GetInt("HA_01");
HL = PlayerPrefs.GetInt("HL_01");
AR = PlayerPrefs.GetInt("AR_01");
GG = PlayerPrefs.GetInt("GG_01");
GW = PlayerPrefs.GetInt("GW_01");
JZ = PlayerPrefs.GetInt("JZ_01");

// Eigenschaftsberechnungen
// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++

// Attacke Nahkampf
 ATN = ((MU + GE + KK) / 5);

// Attacke Fernkampf
 ATF = ((KL + GE + KK) / 5);

// Attacke Magiekampf
 MAG = ((MU + GE + KK) / 5);

// Parade Nahkampf
 PA = ((RE + GE + KK) / 5);

// Ausweichen
 AW = ((SN + RE + GE) / 4);

// Magieresistenz
 MAR = ((MU+KL+LEVEL)/3-2*AG);

// Ausdauer
 AU = LE + KK;
 AUMAX = LEMAX + KK;

// Berechnung zum Stufenanstieg
// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++
EXPNEXT = (Level +1 ) * (Level + 1) * 100;
while (EXP >= EXPNEXT) {
Level = Level + 1;
return;
}

// ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++
// Fertigkeitsvariablen

 // Körperliche
  Klettern = PlayerPrefs.GetInt("Klettern_01");
  Reiten = PlayerPrefs.GetInt("Reiten_01");
  FahrzeugLenken = PlayerPrefs.GetInt("FahrzeugLenken_01");
  Schleichen = PlayerPrefs.GetInt("Schleichen_01");
  Schwimmen = PlayerPrefs.GetInt("Schwimmen_01");
  Springen = PlayerPrefs.GetInt("Springen_01");
  Zechen = PlayerPrefs.GetInt("Zechen_01");

 // Gesellschaftliche
  Ueberzeugen = PlayerPrefs.GetInt("Ueberzeugen_01");
  Feilschen = PlayerPrefs.GetInt("Feilschen_01");
  Gassenwissen = PlayerPrefs.GetInt("Gassenwissen_01");
  Luegen = PlayerPrefs.GetInt("Luegen_01");
  Menschenkenntnis = PlayerPrefs.GetInt("Menschenkenntnis_01");
  Schaetzen = PlayerPrefs.GetInt("Schaetzen_01");

 // Natur
  Faehrtensuche = PlayerPrefs.GetInt("Faehrtensuche_01");
  FallenStellen = PlayerPrefs.GetInt("FallenStellen_01");
  Jagen = PlayerPrefs.GetInt("Jagen_01");
  Angeln = PlayerPrefs.GetInt("Angeln_01");
  Pflanzenkunde = PlayerPrefs.GetInt("Pflanzenkunde_01");
  Tierkunde = PlayerPrefs.GetInt("Tierkunde_01");
  Magiekunde = PlayerPrefs.GetInt("Magiekunde_01");
  Heilkunde = PlayerPrefs.GetInt("Heilkunde_01");
  Wildnisleben = PlayerPrefs.GetInt("Wildnisleben_01");

 // Wissen
  Alchemie = PlayerPrefs.GetInt("Alchemie_01");
  Kriegskunst = PlayerPrefs.GetInt("Kriegskunst_01");
  Zauberkunst = PlayerPrefs.GetInt("Zauberkunst_01");
  Mechanik = PlayerPrefs.GetInt("Mechanik_01");

 // Berufliche
  Abrichten = PlayerPrefs.GetInt("Abrichten_01");
  Kochen = PlayerPrefs.GetInt("Kochen_01");
  Goldschmieden = PlayerPrefs.GetInt("Goldschmieden_01");
  Schmieden = PlayerPrefs.GetInt("Schmieden_01");
  Bogenbau = PlayerPrefs.GetInt("Bogenbau_01");
  Ruestungsbau = PlayerPrefs.GetInt("Ruestungsbau_01");
  SchloesserKnacken = PlayerPrefs.GetInt("SchloesserKnacken_01");
  Taschendiebstahl = PlayerPrefs.GetInt("Taschendiebstahl_01");

 

Das Basic Script wird nur beim Beginn eines neuen Spiels ausgeführt.

Danach wird mit dem "Mortac.js" gearbeitet.

 

Dauerhafte Werteveränderungen werden dann in der PlayerPrefs gespeichert.

Derzeit sind da noch ein paar Testvariablen drin.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok. Ich hab mir das mit der Vererbung mal zu gemüte geführt.

 

Ist soweit kein Problem und extrem hilfreich.

In JS scheint das aber nicht so gut zu funktionieren. da hab ich geteilte Meinungen gelesen.

 

Wäre es sinnvoll, komplett auf C# unzusteigen, oder gibt es da Funktionen in JS, die man in C# nicht machen kann?

Ich denke mal, der Zugriff von einem C#-Script auf ein JS ist nicht so unproblematisch, oder?

Da die Befehle ähnlich sind, wäre es zum derzeitigen Standpunkt weniger ein Problem meine JS in C#-Scripte umzuschreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

In Javascript solltest du alles hin bekommen, was in c# geht. Von der Funktionsvielfalt sind sie in etwa gleich.

Da du aber, wie du schreibst, offen für c# bist, solltest du es einfach mal versuchen.

Ich selber werde früher oder später wohl auch auf c# umschwenken. Jedoch gehe ich einen anderen Weg des lernens. Erstmal alles verstehen und mit der einfacheren Scriptspache erstellen, dann auf die sauberere Sprache wechseln. ;)

Seine Projekte in 2 Sprachen zu basteln halte ich für nicht besonders sinnvoll.

c# scripte werden vor den javascripts ausgeführt, was bei gleichzeitigem lauf beider scripte zu problemen führen könnte.

Man kann dem aber entgegen wirken.

 

So jetzt zu deinem Problem.

Du scheinst da recht linear ran zu gehen. Erzeugst einen Cahrakter, gibst ihm eine eigene GUI, machst das selbe mit dem Nächsten...

Das würde funktionieren, ist aber nicht klug.

Ich will es mal an deinen Caharkerbögen erklären:

Der Unterschied zwischen den Charakterbögen der einzelnen Helden ist doch eigentlich nur der Inhalt, der dort als icon, Avatarbild oder als Text angezeigt wird. Alles andere bleibt gleich. Die Berechnung, die Anordnung der Slots, das Inventar an sich.

Also nutzt du nur eine GUI für alle deine Helden, denn diese GUI wird ja auch nur einmal angezeigt.

Was du machen musst, ist eine Unterscheidung zu erstellen. Wenn du dir den Held 1 anzeigen lassen willst, dann musst du Unity sagen, dass jetzt nur diese Werte ausgelesen werden. Beim Held 2 sind es andere Werte.

Du wirst mit Arrays arbeiten müssen um die Slots im Inventar zu bedienen. Wenn jetzt jeder Slot eine eigene Nummer hat, dann kannst du diese Nummer als Platz(Stelle) im InventarArray nutzen. Dort wird dann abgespeichert welcher Gegenstand in dem Slot ist oder ob er leer ist.

Diese Nummern nutzt du dann für andere Arrays, wo die Gegenstände abgelegt sind u.s.w.

 

Wie du siehst, brauchst du für jeden Held ein Array für die Slots.

Außerdem brauchst du für jeden Held Varialblen für seine Eigenschaften.

Da bietet es sich an Klassen zu erzeugen, wo alles drin steht.

Diese Klassen kannste auslesen und auch bearbeiten.

Und wenn du jetzt ein ExtraArray für das Inventar hast, dann kanst du mit einem Befehl alle Slots des Helden ins Inventararray übergeben (Welches ja nur zum Sehen da ist) und wenn du in diesem Inventar etwas änderst, dann schreibst du das halt auch in die Klasse rein.

 

Fazit:

Erzeuge Klassen

Erzeuge Script Module denen du Werte übergibst und die dann Werte zurück geben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das einzige Problem mit JavaScript ist, dass die Klassendefinition, wie sie in jedes C#-Script gehört, implizit ist.

Das

class Scriptname : MonoBehaviour

denkt sich der Compiler also bei JS immer hinzu.

 

Schreibt man also seine eigene Klassendefinition in ein JavaScript-Script, schreibt man eigentlich eine Klasse in eine Klasse, also eine Embedded Class.

Soweit ich weiß unterscheidet der Compiler da aber, sodass es funktioniert, aber wirklich hübsch ist das nicht.

Dass das nicht gerade schön ist, ist aber afaik das einzige Problem ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Generell ist JavaScript nunmal fürs Internet erfunden worden. (1995 von einem Netscape (Browser) Entwickler), das merkt man der Sprache halt an.

Ich persönlich greife lieber zu Hochsprachen, da sie nunmal auf den nativen, lokalen Ressourcenzugriff ausgelegt sind (Datein speichern etc.), im Grunde genommen ist es aber Geschmackssache.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also zu deinem Problem, erstell dir am Besten eine Einzige Klasse die du "Character" oder wie auch immer nennst, und diese Klasse besitzt alle Eigenschaften die alle deine Figuren gemeinsam haben, damit meine ich nicht Inhaltlich sondern allgemein.. denn jede Figur hat ja einen Namen oder auch Lebenspunkte:

 

- Name

- Avatar

- HP

- MP

- Angriffsstärke

- Verteidigungsstärke

- Items (Array)

- Laufgeschw.

- etc.

 

Für diese Klasse schreibst du beispielsweise genau einmal ein GUI - Inventar und dann nie wieder!

Jetzt erstellst du dir einfach für jede Figur ein Prefab was für mich in Unity am meisten Sinn macht, und weisst dann den Prefabs die Unteschiedlichen Werte zu die sich Inhaltlich zwischen den Figuren Unterscheiden.. jede bekommt ihren eigenen Namen und ein anders Bild etc.!

Solltest du einmal an den Punkt kommen das du für beispielsweise einen besonders mächtigen Character noch zusätzliche Werte brauchst dann leitest du einfach eine neue Klasse von "Character" ab wodurch diese alle Eigenschaften und methoden von der Elternklasse erbt, auch die Funktion zum zeichnen des Inventars! Jetzt kannst du Funktionen die du um etwas erweitern musst,

beispielsweise eben die GUI Funktion fürs Inventar um die neuen Werte ebenfalls anzeigen zu können überschreiben.. damit du aber nicht den kompletten Code den du in "Character" schonmal in dieser Funktion geschrieben hast kopieren musst, nur um eben ein paar neue Anzeigen rein zu basteln, gibt es zumindest in C# die Möglichkeit über "basic.Methodename()" eine Methode aus der Elternklasse auf zu rufen... wodurch du nur den tatsächlich neuen Code hinzufügen musst! Weiß aber nicht ob das so auch in JS funtzt...

 

Was ich dir auch raten würde wäre nicht alles über PlayerPrefs zu machen und erst recht nicht in der UpdateMethode... kann mir nicht vorstellen dass das auf dauer performant ist! In die PlayerPrefs kannst du dann etwas reinspeichern wenn dus wirklich brauchst, für Speicherstände eben aber nicht um irgendwelche Werte zwischen zu speichern um sie im nächsten Frame wieder ab zu fragen!

Du liest dir beim Spielstart einmal aus den Playerprefs die passenden Werte zu deinem Char aus und weisst sie diesem zu, mehr nicht... und beim speichern schreibst du sie eben wieder hinein, auch deine ganzen static Variablen machen für mich nicht sehr viel Sinn.. lass das static lieber weg... auf den ersten Blick ist es vlt. schön einfach static Vars zu verwenden.. aber sobald du 2 Objekte/Figuren (was auch immer) von der gleichen Klasse im Spiel hast.. teilen sie sich eben diese Werte!

 

Gruß Stephan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Frohe Weihnachten allerseits!

 

So. Ich hab das hingekriegt. Mit der Vererbung spart man eine Unmenge Arbeit. Hab da ein kleines anderes Problem:

 

Ich habe nun ein anderes Problem. Damit ich weiter viel unnötige Arbeit sparen kann, und das Ganze übersichtlich bleibt, habe ich mit folgendes überlegt:

 

Ich möchte im HUD-Script einen Int im Menue-Script festlegen, wenn man den Avatar eines Charakters anklickt.

 

  if (GUI.Button(new Rect(213,535,145,145), CharaAvatar1)) {

A_Scripte.GetComponent<Menue>().Wahl = 1;  

  if (GUI.Button(new Rect(213,535,145,145), CharaAvatar2)) {

A_Scripte.GetComponent<Menue>().Wahl = 2;  


 

Funktioniert einwandfrei.

 

Nun habe ich im Menue-Script folgendes:

 

  
public void Charakterwahl () {

switch (Wahl) {

	case 1:			

	Name = A_Scripte.GetComponent<Mortac>().Name;
	LE = A_Scripte.GetComponent<Mortac>().LE;
	EXP = A_Scripte.GetComponent<Mortac>().EXP;

		break;

	case 2:			

	Name = A_Scripte.GetComponent<Mortira>().Name;
	LE = A_Scripte.GetComponent<Mortira>().LE;
	EXP = A_Scripte.GetComponent<Mortira>().EXP;

		break;
	}	
}

 

Ist natürlich viel Arbeit....

 

Deshalb wollte ich das über eine Variable lösen. Aber mir fehlt wiedereinmal die korrekte Synthax:

 

	
public void Charakterwahl () {	
switch (Wahl) {

	case 1:			

	CharWahl = Mortac;

		break;

	case 2:			

	CharWahl = Mortira;

		break;
	}	
}

	Name = A_Scripte.GetComponent<CharWahl>().Name;
	LE = A_Scripte.GetComponent<CharWahl>().LE;
	EXP = A_Scripte.GetComponent<CharWahl>().EXP;

 

Um die Variable CharWahl zu deklarieren hatte ich folgende Möglichkeiten versucht:

 


public string CharWahl;

public Component CharWahl;

string CharWahl;

Component CharWahl

 

Die Fehlermendung kam immer in Zeile:

 

	Name = A_Scripte.GetComponent<CharWahl>().Name;

 

Kann mir da jemand helfen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...