Jump to content
Unity Insider Forum

Der schwere Anfang


Uana

Recommended Posts

Hallo zusammen,

mein Name ist Ilja.

Zur zeit versuche ich programmieren zu lernen, was erlich gesagt nur mässig klapt.

Da hoffe ich doch mal hier ein bischen Hilfestellung zu bekommen. Danke schon mal im vorraus.

Nun das erste Problem: Ich versuche einen float in einen string zu casten.

                                           float playerHeight= 1,82f;

                                           string playerHeightText=playerHeight.ToString();

Nun die Frage: Wieso wird die Variable nicht in den ( ) von ToString übergeben?

Inder RoundToInt Methode kommts auch in die Klammern.

                                           float playerHeight= 1,82f;

                                           int playerHeightText=Mathf.RoundToInt(playerHeight);

 

Mit freundlichen Grüßen

Ilja

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Uana!

Ich versuche mal, das zu erklären, ohne zu tief in die Materie zu gehen.

ToString und RoundToInt sind so genannte Methoden. Eine Methode ist, wie vielleicht bekannt, eine Ansammlung von Anweisungen, die ausgeführt werden, wenn die Methode aufgerufen wird. In C#, wie in Java und noch anderen objektorientierten Sprachen, muss es immer "jemanden" geben, der die Methode ausführt. Dieser "jemand" ist (sagen wir, fürs Erste) immer ein Objekt. Ein Objekt ist ein Ding, das das Programm sich merkt, und es gehört zu einer Klasse (auch das sei nur erst einmal so hingestellt). So könnte es z.B. die Klasse "Auto" geben und im Programm sind zu irgendeinem Zeitpunkt fünf Objekte dieser Klasse, also fünf Autos, vorhanden. Jedes deiner Scripts, die du in Unity schreibst, ist übrigens auch eine Klasse, darum steht da am Anfang "class". Und jedes Mal, wenn du dein Script auf ein GameObject ziehst, erstellst du damit ein neues Objekt dieser Klasse.

Wenn du deiner Auto-Klasse jetzt beibringen willst, loszufahren, dann baust du eine neue Methode, die da heißt "Losfahren". Im Rumpf der Methode (also zwischen den { } ) definierst du, was passieren soll, wenn "jemand" zu einem Auto-Objekt kommt und sagt "Losfahren". Es könnte z.B. heißen, dass der Wert der Geschwindigkeit geändert wird. Um jetzt ein Auto losfahren zu lassen, braucht man eine Variable, die sich "das Auto gemerkt hat" (wieder nur halb wahr, aber erstmal okay). Wir nennen diese Variable mal "meinAuto". Dann verwendet man die Punktnotation, um die Methode aufzurufen:

meinAuto.Losfahren();

Die Notation besteht ganz grob aus zwei Teilen: Vor dem Punkt und nach dem Punkt. Vor dem Punkt steht eine Variable, die beschreibt, welches Auto überhaupt etwas machen soll. Und rechts vom Punkt steht der Methodenname, der beschreibt, was das Auto machen soll. Also kurz: Wer etwas macht und was gemacht werden soll.

Methoden können aber noch etwas komplexer definiert werden. Manchmal will man nicht einfach nur etwas gemacht haben, sondern will noch spezifizieren können, wie es gemacht wird. Dazu gibt es Parameter. Beim Definieren der Methode, also beim Entwickeln von "Losfahren", kann man einbauen, dass beim Aufrufen zusätzliche Informationen gegeben werden sollen. In unserem Beispiel könnte es sein, dass das Auto wissen muss, wohin es eigentlich fahren soll. Dann würde, sobald die Methode entsprechend umdefiniert wurde, der Aufruf z.B. so aussehen:

meinAuto.Losfahren(hamburg);

Wer oder was "hamburg" ist, ist gerade egal. Wichtig ist, dass ein Methodenaufruf eigentlich aus drei Teilen besteht: Dem ausführenden Objekt, Punkt, dem Methodennamen, und dann in Klammern den Parametern. Oder anders: Wer, was und wie. Da fehlt nur noch das "wann", aber das gibt's nicht - das ist immer "jetzt".

Um nach alledem auf dein Beispiel zurückzukommen...

"playerHeight" ist eine Variable (wie "meinAuto"). Diese Variable merkt sich zwar kein Objekt der Sorte "Auto", sondern eine Zahl, aber das ist für die Erklärung nicht weiter wichtig. Wichtig ist, dass man mit allen Dingen, seien es jetzt Objekte oder Zahlen, in C# einige wenige Dinge machen kann. Und eine davon ist, einen String zu generieren, der dieses Objekt repräsentiert. Das macht die Methode "ToString", die auf allen Objekten oder Werten aufgerufen werden kann (außer "null").

Die Zahl kümmert sich also darum, dass ein String zurückgegeben wird, der sie repräsentiert. Das war's dann aber auch schon fast mit Methoden, die man auf Zahlenwerten aufrufen kann. "ToString" kennen Zahlen auch nur, weil eben alle Dinge diese Methode kennen. Groß mathematisch etwas machen kann man über Methodenaufrufe erstmal nicht mit ihnen. Es gibt also kein

meineZahl.RoundToInt()

Deshalb kommt Unity ins Spiel und bietet eine Klasse namens "Mathf" an. Warum das geht, ist wieder so ein Thema für sich, aber es sei gesagt: Es gibt Methoden, die man eben doch nicht auf spezifischen Objekten aufruft, sondern einfach so mithilfe der Klasse. In diesem Fall schreibt man den Klassennamen vor den Punkt, und es entsteht:

Mathf.RoundToInt(meineZahl)

Hier ist die Zahl nicht das Ding, das sich um die Aufgabe kümmert, sondern die Mathf-Klasse. Die Zahl wird hier als Parameter benutzt, so wie weiter oben "hamburg" beim Auto. Am Ablauf ändert sich ansonsten nicht wirklich etwas. Die Mathf-Klasse nimmt die Zahl und macht irgendetwas damit, und gibt dann einen Wert zurück.

Lange Erklärung, kurze Zusammenfassung: Manchmal kümmert sich ein Ding selbst um die Aufgabe, manchmal hat man ein anderes Ding, das das Ding in die Hand nimmt und sich stattdessen darum kümmert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...