loui1337 Geschrieben 23. Juli 2020 Melden Share Geschrieben 23. Juli 2020 Moin Moin alle zusammen! Ich bin ein ziemlicher Anfänger in Unity und C# und hätte da mal eine Frage: Wie man es von den Typischen Clicker Spielen kennt, wird einem nicht die genaue Anzahl an z.B. Cookies angezeigt, sondern eine art Abkürzung wie zum beispiel anstatt 100.000.000 Cookies nur 100M Cookies. Das habe ich auch versucht, bin aber gescheitert... könnte mir da vielleicht jemand helfen? if(CookieCount >= 1000000) { InternalCookies = CookieCount / 1000000; followingLetter = "M"; } else if(CookieCount >= 0) { InternalCookies = CookieCount; followingLetter = ""; } Allerdings zeigt er bei mir ab 100001 nichts mehr an... man muss dazusagen das InternalCookies und CookieCount doubles sind. Am besten fände ich es, wenn man in eine Methode eine Zahl eingibt und diese dann Verändert mit Buchstabe zurückgibt... Daran habe ich mich auch schon versucht, bin aber auch gescheitert! Ich hoffe das mir da jemand helfen kann:) Lg Loui Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 24. Juli 2020 Melden Share Geschrieben 24. Juli 2020 Versuch mal dein Ergebnis abzurunden damit du wieder eine gerade Zahl heraus bekommst.https://docs.unity3d.com/ScriptReference/Mathf.Floor.html Und wenn InternalCookies vom Typ Integer wäre kannst du auch gleich das nutzen: https://docs.unity3d.com/ScriptReference/Mathf.FloorToInt.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 24. Juli 2020 Autor Melden Share Geschrieben 24. Juli 2020 Okay vielen Dank, aber mein ziel war eigentlich das es nur eine Nachkommastelle ausgibt... da wird es ja ohne Nachkommastelle ausgegeben. Zweites Problem: ich hab schon so viel versucht aber es gibt immer einen Fehler aus wenn ich versuche die zahl in der umgewandelt in einem string zurück zugeben. Das ich dann dort im Textfeld nur noch "Cookies: " + methode(Cookies); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 24. Juli 2020 Melden Share Geschrieben 24. Juli 2020 Man kann sich da was zusammenwursteln, aber wenn man die Math-Klasse von C# benutzt, die hat dafür beim Runden einen Parameter. Math.Round(cookies, 1); vor 16 Minuten schrieb loui1337: aber es gibt immer einen Fehler aus Niemals "funktioniert nicht" oder "gibt einen Fehler aus" ohne da auch drauf einzugehen. Was für Code? Welche Fehlermeldung? Wenn du deiner Methode sagst, dass sie einen String zurückgeben soll... private string Methode(...) ...und dann auch bei jedem return-Statement nur Strings (oder implizit zu String konvertierbare Werte) zurückgibst... return "Hallo"; return 42 + ""; ...dann geht das auch, was du da beschreibst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 24. Juli 2020 Autor Melden Share Geschrieben 24. Juli 2020 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class CookieDisplay : MonoBehaviour { //public CookieCount public static double CookieCount; //Text to show the CookieCount public GameObject cookieDisplay; //internal CookieCount public string NumberAndLetter(double number) { double InternalNumber; string IfollowingLetter; if(number >= 1000) { InternalNumber = number / 1000; Math.Round(InternalNumber, 1); string IfollowingLetter = "K"; } else if(number >= 0) { InternalNumber = number; IfollowingLetter = ""; } return InternalNumber + IfollowingLetter; } void Update (){ cookieDisplay.GetComponent<Text>().text = "Cookies: " + NumberAndLetter(CookieCount); } } Fehlermeldungen : Assets\Scripts\CookieDisplay.cs(27,11): error CS0136: A local or parameter named 'IfollowingLetter' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter Assets\Scripts\CookieDisplay.cs(35,10): error CS0165: Use of unassigned local variable 'InternalNumber' Assets\Scripts\CookieDisplay.cs(35,27): error CS0165: Use of unassigned local variable 'IfollowingLetter' Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 24. Juli 2020 Melden Share Geschrieben 24. Juli 2020 string IfollowingLetter; if(number >= 1000) { InternalNumber = number / 1000; Math.Round(InternalNumber, 1); string IfollowingLetter = "K"; } Du definierst in diesem Ausschnitt gleich zu Anfang eine Variable, und dann in der letzten Zeile definierst du eine Variable mit demselben Namen. Das ist nicht erlaubt. Ich nehme an, du willst den Wert der Variablen ändern, anstatt eine neue zu definieren. Dafür einfach das "string" in der letzten Zeile entfernen. CS0165 bedeutet, dass du eine Variable definierst, ohne ihr einen Wert zuzuweisen (soweit okay), sie dann aber benutzt wird an einer Stelle, an der unter Umständen nach wie vor kein Wert zugewiesen wurde. Beispiel: int number; if (something) { number = 5; } Debug.Log(number); Wenn "something" false sein sollte, wird "number" kein Wert zugewiesen, bevor mit der Debug-Zeile eine Anweisung kommt, in der der Wert aber vorhanden sein muss, weil er ausgelesen werden soll. Mögliche Lösungen: int number = 0; // Default-Wert zuweisen, dann ist egal, was kommt if (something) { number = 5; } else // Alle Fälle abdecken und in jedem einen Wert zuweisen { number = 0; } if (something) { number = 5; ... // Wert nur dann auslesen, wenn wir auf einem Pfad sind, auf dem zuvor eine Zuweisung passiert Debug.Log(number); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 24. Juli 2020 Autor Melden Share Geschrieben 24. Juli 2020 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class CookieDisplay : MonoBehaviour { //public CookieCount public static double CookieCount; //Text to show the CookieCount public GameObject cookieDisplay; //internal CookieCount public double InternalCookies; public string followingLetter; public string NumberAndLetter(double number) { double InternalNumber; string IfollowingLetter; if(number >= 1000) { InternalNumber = number / 1000; Math.Round(InternalNumber, 1); IfollowingLetter = "K"; } else { InternalNumber = number; IfollowingLetter = ""; } return InternalNumber + IfollowingLetter; } void Update (){ cookieDisplay.GetComponent<Text>().text = "Cookies: " + NumberAndLetter(CookieCount); } } das mit der Methode hat schonmal geklappt! Aber wenn es eine zahl ist die mehr als eine Nachkommastelle hat wenn man sie durch 1000 teilt dann steht auf einmal wieder nichts da... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 24. Juli 2020 Melden Share Geschrieben 24. Juli 2020 Math- und Mathf-Methoden ändern deine Variablenwerte nicht, sie geben das Ergebnis zurück. Du musst also schreiben: InternalNumber = Math.Round(InternalNumber, 1); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 24. Juli 2020 Autor Melden Share Geschrieben 24. Juli 2020 Aber ich verstehe nicht warum es ab 1001 Cookies nichts mehr angezeigt wird..... Dann steht in dem Textfeld nur noch "Cookies: ". Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 24. Juli 2020 Melden Share Geschrieben 24. Juli 2020 Das was du da in deinem letzten Code gezeigt hast ist ja nicht vollständig. Du rufst in der Update die Methode auf und übergibst dabei einen Wert, der in CookieCount drin sein sollte. Aber welchen Wert hat denn CookieCount? Die Methode an sich funktioniert jedenfalls, wenn du sie so veränderst, wie es Sascha geschrieben hat. Ich habe es eben getestet. Somit hast du entweder ein Problem mit der Variable CookieCount beim Übergeben, oder aber dein Textfeld ist nicht groß genug um alles anzeigen zu können. Mach doch einfach mal ein Debug.Log in die Update mit rein. Debug.Log(NumberAndLetter(CookieCount); Dann kannst du mal die Ausgabe in der Console mit der Ausgabe von deinem Textfeld vergleichen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 25. Juli 2020 Autor Melden Share Geschrieben 25. Juli 2020 Okay, bei 999 hört es einfach auf 1 auf zu addieren. Hat jemand eine Ahnung warum? using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class CookieDisplay : MonoBehaviour { //public CookieCount public static double CookieCount; //Text to show the CookieCount public GameObject cookieDisplay; //internal CookieCount public double InternalCookies; public string followingLetter; public string NumberAndLetter(double number) { double InternalNumber; string followingLetter; if(number >= 1000) { InternalNumber = number / 1000; followingLetter = "K"; } else { InternalNumber = number; followingLetter = ""; } InternalNumber = Math.Round(InternalNumber, 1); Debug.Log(InternalNumber); return InternalNumber + followingLetter; } void Update (){ cookieDisplay.GetComponent<Text>().text = "Cookies: " + NumberAndLetter(CookieCount); } } es hört einfach auf bei 999 drauf zu addieren. Kann mir jemand helfen das es dann wenn es 1200 Cookies beispielsweise sind 1,2K anzeigt? Aber es sollte erst ab 1300 1,3K anzeigen... Es soll also NICHT aufrunden. Ich weiß jetzt echt nicht mehr weiter. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. Juli 2020 Melden Share Geschrieben 25. Juli 2020 Du kannst bei Math.Round eine Rundungsmethode (aufrunden/abrunden/kaufmännisch) übergeben. Wo genau wird denn nicht weitergezählt? Dass nach 1.0K erstmal für 50 Stück nichts kommt ist ja logisch. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 25. Juli 2020 Autor Melden Share Geschrieben 25. Juli 2020 Nein, auch wenn ich die Cookieanzahl ungeändert in der Konsole ausgebe, hört es bei 999 auf... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 26. Juli 2020 Melden Share Geschrieben 26. Juli 2020 Dann liegt das Problem nicht in diesem Code, schließlich findet hier nicht die Erhöhung der eigentlichen Zahl statt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 26. Juli 2020 Autor Melden Share Geschrieben 26. Juli 2020 Das hier ist der andere Code der die zahl einfach nur um 1 erhöht. Mehr Scripts greifen nicht auf die Variable zu. using System.Collections; using System.Collections.Generic; using UnityEngine; public class makeCookie : MonoBehaviour { public void ClickTheButton () { CookieDisplay.CookieCount += 1; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 26. Juli 2020 Melden Share Geschrieben 26. Juli 2020 Hab die Scripts mal bei mir reinkopiert, funktioniert alles einwandfrei. In der Konsole zeigst du halt dieselbe Zahl an, die auch im Text angezeigt wird. Da kommen nach "999" also noch 50 "1" dazu, bevor 100 "1.1" in der Konsole auftaucht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 26. Juli 2020 Autor Melden Share Geschrieben 26. Juli 2020 Okay das hatte ich garnicht bedacht xD. Und jetzt meine wahrscheinlich letze frage zu dem Thema: ich wöllte gern das es nicht rundet sondern eigentlich nur die erste Dezimalstelle anzeigt. vor 20 Stunden schrieb Sascha: Du kannst bei Math.Round eine Rundungsmethode (aufrunden/abrunden/kaufmännisch) übergeben. Wo genau wird denn nicht weitergezählt? Dass nach 1.0K erstmal für 50 Stück nichts kommt ist ja logisch. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 26. Juli 2020 Melden Share Geschrieben 26. Juli 2020 Das ist ja auch runden. Was man umgangssprachlich unter runden versteht, ist das Abschneiden aller Nachkommastellen - aber wenn man eine oder mehrere übrig lässt, ist das auch runden. Und genau das tun wir mit dem Parameter "1". Oder meinst du, dass nur die erste Dezimalstelle angezeigt wird? Verstehe nicht, warum man das wollen würde, aber dafür kannst du zweimal runden: Einmal mit einer Dezimalstelle, einmal ohne, und dann die beiden voneinander abziehen. Du hast z.B. 123,45. Du rundest auf eine Nachkommastelle (123,4) und einmal auf keine (123) und kriegst beim Subtrahieren (123,4 - 123) nur die eine Nachkommastelle (0,4). Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 27. Juli 2020 Melden Share Geschrieben 27. Juli 2020 @Sascha Er will genau das, was ich mir oben mit Mathf.Floor schon gedacht habe. Immer abrunden! Gut, ich wusste ja nicht, dass er zusätzlich eine Nachkommastelle angezeigt haben will. Diese Infos kommen immer so nach und nach. @loui1337 Das hier brauchst du: Math.Round(InternalNumber, 1, MidpointRounding.ToEven); Zum Verstehen: Das normale Runden, ist ja so, dass ab 0.5 aufgerundet wird. Um das zu umgehen, muss man der Funktion angeben was passieren soll, wenn die Mitte, also 0.5 erreicht wurde. Und das macht MidpointRounding.ToEven. Fast alle dieser Mathe-Funktionen, ob nun Unityeigen oder eben die von c#, haben extra Argumente, um gewisse Dinge zu steuern. Diese Argumente müssen nicht unbedingt genutzt werden. Wenn du sie nicht nutzt, wirde eben von einem Standard ausgegangen. Solche Dinge werden dir öfters passieren. Du suchst nach einer Funktion, Methode oder Klasse, die dir etwas berechnen oder allgemein helfen soll. Wenn du sie gefunden hast, wirst du sie wahrscheinlich nur so nutzen, wie du es in einem Beispiel gesehen hast. Hauptsache du kommst erst einmal vorran. Schau dir aber trotzdem jedes Mal die Parameter dieser kleinen Helferleins an. Du wirst erkennen, dass da meist ganz viele zusätzliche Dinge drin sind, wie eben diese zusätzliche Parameter die genutzt werden können, aber eben nicht müssen. Und gerade solche zusätzlichen Parameter machen diese Funktionen mächtig und ersparen dir viel Arbeit, wenn du weißt dass sie da sind. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 27. Juli 2020 Autor Melden Share Geschrieben 27. Juli 2020 Nein, mir geht es darum das wenn beispielsweise 1050 Cookies hat man nicht angezeigt bekommt das man 1,1K hat. Es soll erst wenn man 1100 Cookies hat 1,1K angezeigt bekommen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 27. Juli 2020 Melden Share Geschrieben 27. Juli 2020 Hallo Also soll immer abgerundet werden. Warum sagst du, dass du das nicht willst, wenn du es dich willst. Normalerweise wird ab 5 aufgerundet. Also bei 1.5 auf zwei und bei 15 auf 20. Du willst, dass immer abgerundet wird. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 27. Juli 2020 Autor Melden Share Geschrieben 27. Juli 2020 Oh da hab ich garnicht dran gedacht😆 Wie rundet man denn ab? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 27. Juli 2020 Melden Share Geschrieben 27. Juli 2020 Hallo Genau das hat @malzbiedoch geschrieben. Lies dir das mal durch. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Juli 2020 Melden Share Geschrieben 27. Juli 2020 Eigentlich mit MidpointRounding.ToZero (glaube ich), aber offenbar ist das zu neu für Unity, zumindest in der Standard-.NET-Einstellung. Von daher: Exkrement drauf, einfach -0.5 rechnen bevor du das in Math.Round reinschmeißt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 27. Juli 2020 Autor Melden Share Geschrieben 27. Juli 2020 @Sascha wie meinst du das? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.