Jump to content
Unity Insider Forum

SirTreffNix_Dev

Members
  • Content Count

    10
  • Joined

  • Last visited

Everything posted by SirTreffNix_Dev

  1. Vielen Dank schon mal für die Antwort. Mit Events habe ich tatsächlich noch nicht gesehen in diesem Zusammenhang. Hab mir gestern mal mehrere Lösungswege zu der Anforderung angesehen, unter anderem Unity Learn Resourcen aber alle haben im Endeffekt die UI Elemente Public bereitgestellt und auf die z.B. PlayerHealth Komponente "gezogen". Generell bin ich aber, so vermute ich, mit der Events Lösung flexibler. Werde ich mir ansehen und mal testen.
  2. Hallo zusammen, ich stelle mir aktuell die Frage was sinvoller oder effektiver ist, wenn es um das aktualisieren von UI Elementen geht. Ich möchte im Ingame UI unterschiedliche Werte meines Players anzeigen lassen (Health, Speed usw.) Ich frage mich jetzt aber ob ich auf das Canvas eine Komponente lege, die die PlayerStats abruft oder ob ich in den PlayerStats in Update auch das UI aktualisiere. Je nachdem muss ich ja entweder dem UI die PlayerStats Komponente bekannt machen oder eben den PlayerStats die entsprechenden UI Komponenten. Aus meiner Überlegung denke ich, dass es einfacher ist eine Komponente am UI zu hinterlegen, dass im Update die PlayerStats abfrägt. Hierdurch muss ich "nur" PlayerStats im UI bekannt machen und bin dann flexibler welchen Wert ich wo anzeige. Oder gibt es elegantere Lösungen? Aktuell stelle ich mir in etwa sowas für das UI Script vor: public PlayerStats playerStats; public Text playerHealth; public Text playerSpeed; void Update() { playerHealth.Text = playerStats.Health; playerSpeed.Text = playerStats.Speed; } Meine Überlegung hierbei ist auch, dass die Komponente die das UI aktualisieren soll auch zum UI gehört. Aber eventuell ist es ja auch geschickter UI Elemente immer da zu aktualiseren wo etwas mit den entsprechenden Werten passiert. Also z.B. den PlayerHealth Text aktualisieren in der Komponente die z.B. Schaden verursacht.
  3. Wenn bei deinem Spiel: Input.GetAxis("Vertical") > 0 bedeutet, dass dein Spieler vorwärts läuft, dann hast die Möglichkeit mit Mathf.Abs(Input.GetAxis("Vertical")) immer einen positiven Wert zu erhalten und dementsprechend vorwärts zu laufen.
  4. Was bedeutet du kannst die AudioSource nicht reinziehen? Taucht die Audiosource nicht im Inspector auf? Wirft die Console Fehlermeldungen?
  5. Wenn ich mir das Video ansehe, fügt er an die "Ground Plane Stage" ein Skript aus dem Unity Tutorial an. Das Script deaktiviert "Anchor Stage" in Start() was ja laut dem Tutorial deine Ground Plane Stage sein soll.
  6. Die Vererbung bietet dir ja die Möglichkeit auch Methoden der Klasse von der du erbst zu nutzen. z.B. könntest du in deiner Klasse "Mensch" Variablen für Lebenspunkte, Erfahrungspunkte usw. haben. Deine Klasse Supermensch hat dann z.B. Variablen und Methoden für Superkräfte die gewisse Dinge tun. Deine Klasse Mensch hat aber z.B. bereits Methoden um Lebenspunkte hinzuzufügen, abzuziehen usw. Diese müsstest du dann in der Klasse Supermensch nicht noch einmal schreiben sondern könntest die Methode aus der Basisklasse verwenden. Solltest du dann doch einmal eine Methode aus der Basisklasse "Mensch" ändern wollen in "Supermensch" kannst du diese "überschreiben" oder "erweitern". Override - https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/override
  7. Mit der Zeile: public SuperMensch (int dasAlter, string derName, string dieFaehigkeit) :base(dasAlter, derName, derBeruf) übergibst du dasAlter, derName, derBeruf an den Konstruktor der Basisklasse (durch die Verwendung von :base(dasAlter,derName,derBeruf) der in diesem Fall 3 Argumente erwartet. "derBeruf" ist aber unbekannt, da an den Konstruktor von SuperMensch die Variablen "dasAlter, derName, dieFaehigkeit" übergeben werden. Das sagt die folgende Fehlermeldung aus: Wenn du dann wie von dir Beschrieben "derBeruf" wieder raus nimmst, werden wieder nur zwei Argumente an den Konstruktor der Basisklasse übergeben. Dadurch erhälst du die folgende Fehlermeldung: In dem Screenshot aus deinem Tutorial sind gar keine Konstruktoren angegeben wodurch das "Problem" nicht entsteht. Der Konstruktor wird immer aufgerufen, wenn ein neues Objekt vom Typ dieser Klasse erstellt wird über z.B. SuperMensch test = new SuperMensch() Es besteht die Möglichkeit für jede Klasse mehrere Konstruktoren anzugeben. Dann wird je nachdem welche Parameter übergeben werden der richtige "ausgewählt". Wenn du nun über public Mensch() { } einen weiteren Konstruktor der Klasse Mensch hinzufügst, kann ein Objekt vom Typ Mensch entweder über Mensch test1 = new Mensch() // ohne Argumente oder mit Mensch test2 = new Mensch(100, "Superman", "fliegen") // mit Argumente erstellt werden. Da in diesem Fall, die Klasse Mensch keine Argumente zwingend erwartet (es wird ja entweder der Konstruktor ohne Argumente aufgerufen oder eben mit drei Argumenten) kann deine Klasse SuperMensch von Mensch erben ohne Argumente zu übergeben. Das ganze ist auch ganz gut unter: https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/using-constructors beschrieben. Ich hoffe ich konnte es einigermaßen verständlich beschreiben.
  8. Auf dem Screenshot von deinem Code, hat die Klasse Mensch einen Konstruktor, der drei Argumente erwartet. Durch die Vererbung musst du den Konstruktor der Basisklasse bedienen. Dieser erwartet zwingend drei Argumente. Entweder du erstellst in der Basisklasse zusätzlich einen Konstruktor, der 0 Argumente akzeptiert oder du übergibst die Argumente mit dem Schlüsselwort "base" an die Basisklasse. Vereinfacht dargestellt entweder: public class Mensch { public Mensch(int dasAlter, string derName, string derBeruf) { } public Mensch() { } } public class SuperMensch : Mensch { public SuperMensch(int dasAlter, string derName, string dieFaehigkeit) { } } oder: public class Mensch { public Mensch(int dasAlter, string derName, string derBeruf) { } } public class SuperMensch : Mensch { public SuperMensch(int dasAlter, string derName, string dieFaehigkeit, string derBeruf) : base (dasAlter, derName, derBeruf) { } }
  9. Die Meldung sagt eigentlich, dass es bereits eine Klasse mit diesem Namen gibt. Kann es sein, dass du das Script umbenannt oder verschoben hast und es diese Klassen deshalb jetzt zwei mal in deinem Projekt gibt?
  10. Ich würde vermuten, du erstellst den StreamWriter bei jedem Schleifen Durchlauf neu und überschreibt die Datei jedes mal.
×
×
  • Create New...