Jump to content
Unity Insider Forum

Hrungdak

Members
  • Content Count

    1,148
  • Joined

  • Last visited

  • Days Won

    47

Everything posted by Hrungdak

  1. Direkte Verwendung von Strings bringt oft Probleme mit. Ich definiere meistens eine Klasse, die nur String-Konstanten enthält: public class Constants { public const string SaveLobbyChatLog = "SaveLobbyChatLog"; public const string SaveWindowPosition = "SaveWindowPosition"; // ... } Dann kannst du deine Hashtable mit dieser Konstante abfragen: if (settings[Constants.SaveLobbyChatLog].ToString() == "Don't save") print (1); Vorteil: du kannst dich nicht mehr vertippen. Das soll ja offensichtlich ein bool-Wert werden. Warum speicherst du nicht statt des fehleranfälligen "Don't save" ein "true" oder "false"? Der Wert "SaveLobbyChatLog" sagt ja schon aus, was der Wert dann bedeutet. Und nimmst das gleich noch in die Konstanten mit auf? public class Constants { public const string SaveLobbyChatLog = "SaveLobbyChatLog"; public const string SaveWindowPosition = "SaveWindowPosition"; // ... public const string True = "true"; public const string False = "false"; } Das verändert die Abfrage auf if (settings[Constants.SaveLobbyChatLog].ToString() == Constants.False) print (1); Beim Setzen des Wertes verwendest du natürlich ebenfalls diese Konstanten: settings.Add(Constants.SaveLobbyChatLog, Constants.True); Schreibfehler ausgeschlossen.
  2. Hrungdak

    Score-Wert

    OnGui kann mehrmals pro Frame aufgerufen werden. Und bei jedem Aufruf wird der Scorewert für richtige Antworten um eins erhöht. Du solltest auch OnGui nicht mehr benutzen. Ist seit Unity 4.6(?) veraltet. Benutze die neue Unity-UI.
  3. Na die Grafiken schauen ja schon mal hammermäßig aus. Bin gespannt, wie es weiter geht. Willkommen im Forum.
  4. Warum kannst du nicht das Standardtrennzeichen ";" verwenden? Gut, das Regex im Beispiel ist nicht gerade übersichtlich, ebenso ist das Beispiel aus dem WIKI hoffnungslos überdimensioniert. Wie soll da ein Einsteiger durchblicken? Hier ist ein Link zu Stackoverflow mit einer kleinen und brauchbaren Lösung: using System.IO; static void Main(string[] args) { using(var fs = File.OpenRead(@"C:\test.csv")) using(var reader = new StreamReader(fs)) { List<string> listA = new List<string>(); List<string> listB = new List<string>(); while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(';'); listA.Add(values[0]); listB.Add(values[1]); } } } Hab ich in Unity nicht getestet, aber ich denke, das macht, was es soll. Aber du solltest dir nochmal überlegen: - den Status der Anlagen in Excel ändern - csv-Datei daraus machen - in Unity einlesen Warum nicht gleich den Status in der csv-Datei ändern? Spart dir einen Schritt. Oder die Excel-Tabelle direkt auslesen, dafür gibt es auch massig Beispiele.
  5. Gib mit Debug.Log mal die horizontalen und vertikalen Werte aus. Evtl sind die aussagekräftig. Setze mal direkt die Velocity statt AddForce, nur zum Test.
  6. Hier würde ich allerdings eher auf Directory.GetFiles() zurückgreifen.
  7. Hrungdak

    Mein 3D-Projekt

    Ich weiß ja nicht, wie es euch geht. Eine interessante Geschichte oder interessante Technik kann ich hier aber leider nicht erkennen... Der Thread ist auch schon ein halbes Jahr alt.
  8. Ach so, ich habe nicht mitbekommen, dass shot.position die Position des Projektils ist. Ich dachte, das wäre der Ausgangspunkt. Dann ergibt das natürlich Sinn.
  9. Das ist mal ein erfrischend anderer erster Post in diesem Forum. Sich mit einem Tutorial vorzustellen, macht schon was her. Willkommen. Zu deinem Code: schön und verständlich erklärt. Wenn ich alles richtig verstanden habe, geht es vor allem darum, einen Raycast in die Schussrichtung abzufeuern mit einer Länge, die der aktuellen Flugzeit des Projektils entspricht. Eine Fehlermöglichkeit sehe ich darin, dass ein Gegner in die Schussbahn läuft, nachdem das Projektil bereits an der Position vorbei ist. Der Raycast würde den Gegner trotzdem treffen. Oder habe ich da was übersehen?
  10. Das Asset Textmesh Pro gibt's jetzt kostenlos im Assetstore. Wollte ich nur mal gesagt haben. https://www.assetstore.unity3d.com/en/#!/content/84126
  11. Was klappt denn nicht? Gibt es eine Fehlermeldung? Was hast du verändert? Wenn das der Originalcode ist, sollte in dieser Zeile schon mal eine Fehlermeldung kommen: dbcon = new SqliteConnection(conn; Schließende Klammer fehlt.
  12. Tolle Sache. Ich würde gern etwas über die Technik erfahren. Welche Tools benutzt du? Wie sieht der Workflow aus?
  13. Das mit dem Unity-Button muss ich gleich mal probieren: Animator Krasse Sache. Das neue Forum macht mir zunehmend Spaß. Vielen Dank für euere Arbeit.
  14. Herzlich willkommen im Forum.
  15. Bei den Links ging es mir nur darum, zu zeigen, dass mit C# auf mySql zugegriffen werden kann. Die DB-Schicht kann damit sehr gut gekapselt werden. Über die weitere Architektur habe ich mir keine Gedanken gemacht.
  16. Herzlich willkommen und viel Spaß hier.
  17. Trotzdem kann man für eine DB-Zugriffs-Schicht natürlich auf PHP verzichten. Mit c# mysql findest du auf Google genug Beispiele, z.B. das hier.
  18. Ehrlich gesagt würde ich einfach mit 3D-Modellen und einer isometrischen Kamera arbeiten. Gleicher Effekt, weniger Stress. Das mit Turm und Monster angreifen: Das eigene Monster hat eine Attack Range. Wenn in dieser Attack Range ein Turm sein sollte, wird der eben angegriffen. Solange ein Monster in der Attackrange steht, wird dieses vor dem Turm angegriffen.
  19. So Aussagen finde ich ein wenig zu pauschal. GameObject.Find() in der Awake würde mich jetzt nicht gleich umbringen. In der Update dagegen geht es natürlich gar nicht, weil viel zu langsam.
  20. Auf #UnityTips wird das Scene-Fusion gerade heftig beworben. Vielleicht wäre das auch was.
  21. Wo kommt die Exception? Bei der ersten Zeile? Kannst du die Clone() Methode dann hier zeigen?
  22. Bau mal noch eine Prüfung mit ein: ItemBrand newItem = ItemController.CreateItem(1, 1); GameObject item = Instantiate(itemPrefab, npcObject.transform.position, npcObject.transform.rotation); Item myComponent = item.GetComponent<Item>(); if (myComponent == null) { Debug.LogError("myComponent ist null!"); return; } myComponent.SetItem(newItem); Wenn myComponent null ist, dann hat das Prefab die Komponente Item nicht. Dementsprechend kannst du auch nicht die Methode SetItem (eine Methode, die du geschrieben hast?) aufrufen.
  23. Das, was du brauchst, nennt man Deep Copy. Der Hintergrund: Datentypen in C# teilen sich in zwei Kategorien: Value- und Referenz-Typen. Value-Typen haben einfache Datentypen wie int, string, float usw. Wenn du eine Funktion aufrufst int a = 2; int b = 3; int result = myClass.Add(a, ; dann wird an MyClass.Add der Wert von a und b übergeben. In dem Fall also 2 und 3, der Aufruf wäre identisch zu int result = myClass.Add(2, 3); Auch alle struct-Typen sind Value-Typen. Im Gegensatz dazu stehen die Klassen. Wenn du eine Klasse an eine Methode übergibst, dann übergibst du eine Referenz auf diese Klasse. In der Methode arbeitest du also nicht mit einem extra für diese Methode erzeugten neuen Objekt, sondern mit dem Original-Objekt. Beispiel: class MyRefClass { int a; int b; MyRefClass(int newA, int newB) { a = newA; b = newB; } } MyRefClass test = new MyRefClass(2, 3); MyWorkingClass.DoSomethingWith(test); In der letzten Zeile wird die Methode MyWorkingClass.DoSomethingWith aufgerufen und ihr wird die Referenz auf das Objekt test übergeben. Wenn in der Methode DoSomethingWith z.B. folgender Befehl steht: test.a = 8; test.b = 0; dann sind in der originalen Klasse test die Werte verändert, nicht nur in der Methode. Die Eigenschaften von Referenz-Objekten sind z.B., dass unabhängig von der Menge an Daten in der Klasse immer nur ein "Zeiger" auf das Objekt übergeben wird und dass die Daten dieser Objekte dann entsprechend leicht manipuliert werden können. Du musst auch aufpassen, wenn du einen struct-Typ einfach in eine class umwandelst. Das hat gravierende Nebeneffekte, die nicht so ohne weiteres ersichtlich sind. Nämlich überall da, wo diese Klasse als Parameter verwendet wurde.
  24. Deine Zeile State state = new State(states[i].Zug, states[i].Parent, states[i].playerID, states[i].Value, states[i].Feld, states[i].wFiguren, states[i].sFiguren); erzeugt zwar einen neuen State, aber wie das im Konstruktor umgesetzt wird, sehe ich nicht. Wenn da so was wie public State(Zug zug, Parent parent, ...) { this.Zug = zug; this.Parent = parent; .... } steht, erzeugst du keine Kopien, sondern arbeitest auf der Original-Instanz von z.B. Zug und Parent.
×
×
  • Create New...