Hihi ich dachte es mir schon, ich seh den Wald vor lauter Bäumen mal wieder nicht, dabei hab ich einige Möglichkeiten schon selber benutzt.
Das Problem mit Dictionaries ist das Unity diese zwar wunderbar verwenden kann, aber der Editor die Werte nicht anzeigt. Man muß also entweder alles über die Konsole ausgeben um es zu prüfen oder einfach abschätzen ob das was passiert stimmen kann...
Aber Unity3d kann Array`s anzeigen und tatsächlich verwende ich im gleichen Projekt für etwas anderes einfach 2 Arrays ( oder in einem Fall auch 3 ). Sprich ich hab z.b. ein Array mit Strings das angibt um was es sich handelt und 1-2 Arrays mit Floats in denen die Werte stehen.
Und um an den Wert zu kommen ist es dann ja auch einfach:
private string[] names = new string[]{"pinelogs", "oaklogs", "sprucelogs"};
private float[] amount = new float[names.Length];
// Werte werden z.b. geladen oder berechnet und eingetragen
public float getResource( string typ )
{
float res = 0f;
for ( int i = 0; i < names.Length; i++ )
{
if ( names[i] == typ )
res = amount[i];
}
return res;
}
public void setResource( string typ, float amo )
{
for ( int i = 0; i < names.Length; i++ )
{
if ( names[i] == typ )
amount[i] = amo;
}
}
Natürlich kann man sie so auch manipulieren... Der Vorteil von Arrays ist einfach das Unity3d diese im Editor anzeigen kann, ich kann also zur Laufzeit im Editor ( nicht mehr nach dem Release ) sehen: Ah der Wert hat sich geändert, als ich z.b. 10 pinelogs verwendet habe...
Aber danke für den Gedankenanstoss, den hab ich gebraucht 😃
Hallo,
wahrscheinlich lachen mich jetzt alle aus, aber ich bin kein Profi 😃
Also folgendes Problem ( in Unity3d, ist aber nebensächlich wo ).
Ich hab z.b. eine Klasse mit mehreren Variablen. Also z.b.
int pinelogs;
int oaklogs;
int sprucelogs;
... ( sind viele )
So nun will ich aus einem anderen Script abfrage wie viele ich hab, kenne aber nur den Namen des Holzes ( also z.b. string pinelogs )
z.b.
public int getAmount(string res )
{
int amount = 0;
switch( res )
{
case "pinelogs": amount = pinelogs; break;
case "oaklogs": amount = oaklogs; break;
case "sprucelogs": amount = sprucelogs; break;
}
return amount;
}
Natürlich kann man jetzt mit einer Switchanweisung alle abfragen, das sind aber super viele Zeilen und werden auch laufend mehr.
Daher die Frage: Geht es auch anders? Also unter pearl ( lange her ) konnte ich die Variable auch mit irgendeinem Sonderzeichen vorgestellt ansprechen nur mittels dem string also z.b. ( return ?res; ). Gibts so etwas auch in c#?
Danke für die Hilfe 😃
uff da siehst mal wie lange das her ist 🙂
Perl natürlich ( musste aber auch erst die beiden Artikel bei Wikipedia überfliegen, aber CPAN kam mir dann doch extrem bekannt vor 🙂 )
@Th69:
Vielen Dank, das war sehr verständlich und wird mir sicher weiter helfen 🙂
@Abt:
Du hast leicht Reden 🙂 Ich hab vor rund 30 Jahren Perl mittels eines Buches gelernt und vielleicht ein paar wenige Jahre angewendet ( für Webseiten um da z.b. ein Gästebuch zu realisieren. ). Die Wahl fiel auf Perl, weil es eben nicht nur ans Web gebunden ist wie z.b. php.
Ja und dann hab ich durch Zufall bei einem Online-Spiel ( Ultima Online ) das es da private, kostenlose Server ( Shards ) gab und die hatten eigene Scriptsprachen. Da ein wenig drin rumgebastelt und dann kam auch schon RunUO raus, also ein Server-Software-Paket basierend auf c#, mit welchen man seinen eigenen Server aufbauen konnte. Das hab ich damals gemacht und hatte ehrlich so gut wie keine Probleme mich in c# ( also den bereits vorhandenen Scripten ) zurecht zu finden. Und ja diese waren definitiv Objektorientiert und das fand ich eigentlich sehr verständlich.
Dann aber lange Jahre lang nur noch für Webseiten eingesetzt ( also 90% Datenbank-Abfragen, Foren, kleine Browsergames etc... ) und da braucht man nicht wirklich Objekte.
Jetzt hab ich Unity3D entdeckt und hey es nutzt c#....
Also ran ans Spiel 🙂
Aber natürlich bin ich von den Webseiten und der nicht Objektorientiertheit dieser doch ziemlich verhunzt... Und ich hab es ja auch nie wirklich gelernt und bin auch nicht mehr ganz der jüngste ( Baujahr 68 ).
Der Witz dabei, ich hab tatsächlich bei einigen Dingen ganz von alleine Klassen angelegt und somit Objekte erzeugt. Also z.b. hab ich beim Herstellen CraftRessources und Craftitems erzeugt auf die ich wunderbar zugreifen kann... Aber mir kam das ganze nicht in den Sinn für die Daten zu verwenden die ich vom Server lade...
Aber vielen vielen Dank für die Hilfe, ihr habt mir wirklich sehr geholfen, jetzt muß ich noch kurz darüber nachdenken wie ich es mache ( das mit den Füllem der Werte etc.. ) und dann umstricken 🙂 Bin aber noch ziemlich am Anfang, sollte also noch leicht gehen 🙂
hmm, ok also die Antwort war versteckt aber enthalten. Es geht also nicht "einfacher".
Es ist ja kein Unterschied ob ich z.b. ein Dictionary anlege mit allen Werten auf die ich dann zugreifen kann ( muß ich ja auch einmal mit allen Werten füllen, sprich einmal muß ich hergehen und die ganzen Variablen als Variablennamen und dem entsprechenden Wert dort eintragen ), oder mit einer Switch-Anweisung die auslesen kann, in beiden Fällen muß ich jede Variable die ich hab ( weit über 100 ) dort aufnehmen.
Schade, in Pearl ( ja, ja lange her ) ging das.
Oki dann weiß ich das ich beim nächsten mal keine Variablen mehr anlege, sondern gleich ein Dictionary<string, value ( int oder float, oder double, oder auch ein string... )> 🙂
Hiho,
wahrscheinlich lacht ihr mich jetzt alle aus, aber ich hab nie Programmieren gelernt und mach es dennoch ( ich denke aber sehr oft sehr sehr umständlich )...
Also folgendes Problem, nehmen wir mal als Beispiel ein RPG. Ich hab da mehrere Helden und die haben Stats und Skills. Und jeder Skill hat z.b. einen Wert ( 0-Cap ), einen Wert für die Erfahrungspunkte ( 0 bis 2 Mio ) und einen Wert für den Cap, also Beispiel:
int smity
int smithyxp
int smitycap
int carpenter
int carpenterxp
int carpentercap
...
So nun hab ich z.b. beim Craftsystem die Items definiert, also z.b. ein Stuhl der braucht carpenter zum Herstellen... Die Pfeilspitzen brauchen aber Schmieden und so weiter und so weiter...
Wie kann ich nun hergehen und fragen:
gib mir den int wert der Variablen mit namen string name aus.
Also ich lese z.b. aus dem Craftsystem ich brauche "carpenter" ( also z.b. den string skill )
wie kann ich daraus fragen int val = skill.value?
die umständliche Variante wäre mit einer Funktion mit einer switch-Anweisung also z.b.
public int GetIntValue( string name )
switch ( name )
case "carpenter": return carpenter;
case "carpenterxp": return carpenterxp;
....
Aber das geht doch bestimmt auch einfacher, oder?