Jump to content
Unity Insider Forum

Sascha

Administrators
  • Content count

    10,933
  • Joined

  • Last visited

  • Days Won

    486

Sascha last won the day on January 19

Sascha had the most liked content!

Community Reputation

2,189 Excellent

5 Followers

About Sascha

  • Rank
    Community Manager
  • Birthday 08/13/1990

Contact Methods

  • Website URL
    http://www.indiepowered.net

Profile Information

  • Gender
    Male
  • Location
    Hamburg
  • Interests
    Programmierung

Recent Profile Visitors

32,912 profile views
  1. Sascha

    Dateien(Texturen) speichern

    Die musst du dann wohl selber machen. Dein Workflow ist aber auch etwas eigenartig... warum soll die Normal Map aus Unity kommen? Warum hast du dafür keine normal importierte Datei?
  2. Sascha

    Anzahl eines Items aus einer Liste bestimmen

    Du kannst auch eine Suppe mit einer Gabel essen.
  3. Sascha

    [Frage] GUI Optimieren

    Es gibt nicht für alles eine Anleitung. Als Programmierer muss man auch einfach mal etwas selber bauen, ohne sich dabei leiten zu lassen.
  4. Sascha

    [Frage] GUI Optimieren

    Klar... ich glaube, Canvas-Objekte machen das tatsächlich nicht von alleine, aber du kannst die Position der Objekte (nicht einmal unbedingt ihre Transform-Position, sondern einfach den Index in der Liste) verwenden, um relativ zum aktuellen Listenausschnitt festzustellen, ob die Elemente im Bild sind oder nicht. Eine geiwsse Ladezeit für die Liste bei vielen Elementen wird es dabei aber sicherlich geben. Wie das beim Scrollen mit der Performance aussehen würde, kann ich gerade nicht vorhersagen.
  5. Sascha

    [Frage] GUI Optimieren

    Vielleicht ist es einfacher, keine lange Liste zu haben, sondern Pagination zu benutzen. Also X Elemente anzuzeigen, Knöpfe zum Blättern anzubieten und dann die nächsten X Elemente anzuzeigen.
  6. Sascha

    Zufallszahlen mit Schrittgrößen

    Also ich kriege mit dem Code 1 und 3 raus, wie erwartet.
  7. Sascha

    Anzahl eines Items aus einer Liste bestimmen

    In diesem Fall solltest du keine Liste benutzen, sondern ein Dictionary. Ein Dictionary ist ein Datentyp, bei dem ein Wert zu einem Schlüssel zugewiesen werden. Typ von Schlüssel und Wert kannst du dir aussuchen. Es erlaubt dir, den Schlüssel hineinzustecken und den entsprechenden Wert herauszubekommen. Du definierst es so: Dictionary<TKey, TValue> wobei TKey der Typ des Schlüssels und TValue der Typ des Wertes ist. Da der Typ deines Items "InventoryItem" ist und der Wert eine Zahl (die Anzahl) sein soll, muss das so aussehen: Dictionary<InventoryItem, int> storedItems = new Dictionary<InventoryItem, int>(); So fragst du die Anzahl ab: storedItems[ip] // z.B. Debug.Log("Ich habe " + storedItems[ip] + " Stück " + ip); Gleichermaßen kannst du die Anzahl setzen: storedItems[ip] = 100; Wenn du ein Item anfragen willst, das aber gar nicht in der Liste ist, dann kracht es. Deshalb gibt es TryGetValue, falls du dir nicht sicher sein kannst: int amount; if (storedItems.TryGetValue(ip, out amount)) { // Es gibt dieses Item im Dictionary Debug.Log("Ich habe " + storedItems[ip] + " Stück " + ip); } else { Debug.Log("Ich habe kein " + ip + " in meinem Inventar"); } Auf diese Weise kannst du auch Dinge hinzufügen oder wegnehmen: public void ChangeAmount(InventoryItem item, int changeAmount) { int currentAmount; if (storedItems.TryGetValue(item, out currentAmount)) { // Das Item gibt's schon im Inventar var newAmount = currentAmount + changeAmount; if (newAmount > 0) { // Ändere die Anzahö storedItems[item] = newAmount; } else { // Lösche das Item aus dem Inventar storedItems.Remove(item); } } else { // Das Item ist noch nicht im Inventar if (changeAmount > 0) { // Füge das Item in das Inventar hinzu storedItems.Add(item, changeAmount); } } }
  8. Sascha

    Zufallszahlen mit Schrittgrößen

    Öh... habe schon mehrere Male etwas geschrieben, hab's dann aber wieder gelöscht, ohne es abzuschicken. Anstatt groß darüber nachzudenken, würde ich die Herangehensweise leicht ändern. public static int RandomWithSteps(int min, int max, int interval) { var range = max - min; var maxIntervalCount = range / interval; var intervalCount = Random.Range(0, maxIntervalCount + 1); return min + intervalCount * interval; }
  9. Sascha

    Dateien(Texturen) speichern

    Naja... dein Original ist eine Bilddatei die von irgendwo her kommt. Sie hat jede Menge Import Settings weil die Daten, die du hast, so oder so gemeint sein können. Deine eigene Textur hast du direkt in Unity erstellt. Die Daten, die du reingegeben hast, kommen auch so wieder heraus, wenn du die Textur benutzt. Da gibt's also kaum etwas beim Import einzustellen. Die Frage ist: Was willst du denn eigentlich mit der Textur machen? P.S. Bitte keinen Vierfachpost nächstes Mal, sondern einfach den Bearbeiten-Knopf benutzen.
  10. Sascha

    [Frage] GUI Optimieren

    Die Listen sind vermutlich recht lang? Ist nicht unüblich, mehrere "Blöcke" von Listenelementen zu haben und diese beim Scrollen wiederzuverwenden. Also... Jeder Block ist etwas länger als auf einmal angezeigt wird. Man scrollt von Block 1 zu Block 2, zu Block 3, und sobald man in Block 3 ankommt wird Block 1 genommen, inhaltlich verändert und zu Block 4 gemacht.
  11. Sascha

    Invoke ruft nicht auf

    Witzig, damit ist mein Hauptkritikpunkt in der Tat beseitigt. Man könnte also mal Performance vergleichen. Verbleibende Vorteile meines Invokers sind, dass man die gestartete Coroutine manuell wieder abbrechen kann (kann man afaik bei Invoke nicht) - und die zusätzlichen Funktionen (sind ja nicht nur Invoke und InvokeRepeating). Aber jetzt wird's Geschmackssache
  12. Sascha

    Zufallszahlen mit Schrittgrößen

    Random.Range(x, y) gibt Zahlen zwischen x und y-1 zurück, wenn beides Ganzzahlen sind.
  13. Sascha

    Anzahl eines Items aus einer Liste bestimmen

    Du hast IndexOf falsch verstanden. Wie der Name sagt, gibt es dir den (ersten) Index des Elements zurück. Wenn du also [Apfel, Apfel, Birne] hast gibt dir IndexOf(Apfel) 0 zurück und IndexOf(Birne) 2. Ist ein Element gar nicht vorhanden, wird -1 zurückgegeben, da 0 ja heißen würde, dass das Element an erster Stelle steht. Ist denn die Reihenfolge der Items in deinem Inventar überhaupt wichtig? Also - ist es wichtig dass du [Apfel, Birne, Apfel] hast oder wäre 2 Äpfel, 1 Birne auch in Ordnung?
  14. Sascha

    Dateien(Texturen) speichern

    ScriptableObject brauchste nicht, du kannst eine Textur direkt als .asset-Datei speichern. AssetDatabase.CreateAsset(myTexture, "Assets/My Texture.asset"));
  15. Sascha

    [Gelöst]Script ohne deklaration verwenden

    Ja, das geht, aber ich sage voraus, dass sich herausstellen wird, dass das nicht das gewesen sein wird, was du eigentlich wolltest. Bei Objektorientierung gibt es Vererbung und/oder Implementation als Grundkonzepte, die eine "ist-ein"-Beziehung realer Zusammenhänge wiederspiegeln. "Ein A ist ein B" ist gleichbedeutend mit "Ein B hat alle Eigenschaften, die ein A hat, vielleicht noch mehr". Wenn du deshalb eine Klasse "FeuerwehrAuto" schreibst, kannst du diese von "Auto" erben lassen, denn ein Feuerwehrauto kann alles, was ein Auto kann. class FeuerwehrAuto : Auto Da du damit definiert hast, dass "FeuerwehrAuto ist-ein Auto", kannst du überall, wo es um Autos geht, auch ein FeuerwehrAuto benutzen. Auto meinAuto = new FeuerwehrAuto(); Das geht, weil ein FeuerwehrAuto nunmal alles kann, was ein Auto kann. meinAuto.GibGas(); Allerdings reden wir hier von einem Auto, und deshalb können wir nicht die Sirene anmachen. meinAuto.SireneAn(); // Kompiliert nicht Es könnte ja sein, dass weiter oben ein anderes Auto, das kein FeuerwehrAuto ist, in der Variable referenziert wurde. Zurück zu Unity: Wenn du ein Script erstellst, dann erbt deine Scriptklasse von MonoBehaviour. class MeinScript : MonoBehaviour MonoBehaviour erbt von Behaviour, welches wiederum con Component erbt, und Component ist die Klasse, die die Funktionialität hat, dass man Objekte der Klasse als Komponenten auf GameObjects ziehen kann. Davon erben z.B. wiederum Renderer, Light und Collider. Wenn du jetzt ein beliebiges Script referenzieren willst, kannst du eine Variable vom Typ MonoBehaviour anlegen. MonoBehaviour mb = GetComponent<MeinScript>(); // oder eben public MonoBehaviour mb; Allerdings weiß der Compiler natürlich wieder nicht, ob du da ein MeinScript oder ein AnderesScript reinziehst. Deshalb kannst du keine MEthode aufrufem, die du in MeinScript definiert hast, und auch keine der Eigenschaften auslesen oder setzen. Es gibt jetzt die Möglichkeit, dein MonoBehaviour-Objekt darauf zu testen, von welcher Klasse es nun genau stammt. Als ob du zum Auto gehst und fragst "bist du ein FeuerwehrAuto?" Das ist allerdings etwas, das man niemals machen sollte. Das ist so eines des Dinge, die ganz schlechten Code ausmachen. Was du stattdessen machen kannst ist, die Gemeinsamkeiten zu nutzen, die in der Superklasse definiert sind. So ist in Behaviour die "enabled"-Eigenschaft definiert, mit der man Komponenten an und aus machen kann. Diese Eigenschaft haben alle Klassen, die von Behaviour erben, und deshalb kannst du sie benutzen, wie GibGas. Jetzt ist natürlich die Frage: Was willst du denn eigentlich damit machen?
×