Jump to content
Unity Insider Forum

Sascha

Administrators
  • Content Count

    11,425
  • Joined

  • Last visited

  • Days Won

    555

Everything posted by Sascha

  1. Ist die Menge an Spielern potentiell unbegrenzt? Wo liegt ansonsten das Maximum?
  2. Kommt drauf an, wie du "sich lohnen" definierst. Beim Pooling geht es darum, dass beim Löschen von Objekten Müll entsteht, und du über den klassischen Garbage Collector nur sehr wenig Kontroller hast. Der kommt dann irgendwann an und nimmt sich einfach die Zeit, den Müll wegzuräumen. Und je mehr Müll du dann hast, desto größer die Auswirkungen. Das kann sich z.B. in einem kurzen Stocken des Spiels manifestieren. Unity bau aktuell an einem intelligenteren GC, mit dem sich die Spielregeln wieder ändern könnten, aber... mal sehen, wie das so wird. Pooling lohnt sich meiner Meinung nach bei jedem Objekttypen, der ansonsten mehrfach instanziiert und wieder gelöscht wird. Nach dem Motto "Klein Vieh macht auch Mist".... und weil ich mein Pooling-Paket benutze, mit dem es einfach so gut wie kein Mehraufwand ist, knall ich einfach Pooling auf alles drauf, das diesen Kriterien entspricht. Nicht mehr gerendert: Ja. (Stichwort Frustum Culling) Nicht mehr verarbeitet: Alle Komponenten auf dem Objekt arbeiten noch. Sogar der Renderer, der ja feststellen muss, ob er jetzt wieder mit rendern anfangen muss. Wäre sonst ja auch doof - Stell dir vor, die Tiere laufen permanent nach Norden - verschwinden aus dem Bild, du schaust nach einer Minute wieder hin - und sie sind nicht weiter gekommen. Da es super doof wäre, wenn Unity ungefragt deine Spielmechanik ändert (also deine Tierwanderung stoppt), nur weil die Kamera woanders hinzeigt, macht Unity da einfach gar nichts außer Draw Calls zu stoppen. Oh, und die Animator-Komponente hat ein Häckchen, das bestimmt, ob Animationen off-screen weiterlaufen. Aber alles weitere musst du machen. Glücklicherweise ist das nichtmal schwer. Wenn es wirklich nur um das Sparen von Ressourcen geht, wenn ein Objekt nicht mehr gerendert wird, dann kannst du MonoBehaviour.OnBecameVisible und MonoBehaviour.OnBecameInvisible nutzen. Das ganze GameObject solltest du keinesfalls deaktivieren, weil der Renderer sonst aufhört zu evaluieren, ob das Objekt wieder sichtbar geworden ist. Es sei denn, du hast ganze Bereiche, die du als Ganzes deaktivieren willst. So wie bei Paper Mario die Inneneinrichtung der Häuser - da könntest du die Tür als Trigger benutzen, alle Objekte im Haus zu aktivieren und zu deaktivieren. Letzteres ist 1:1 Pooling. Und dazu hab ich ja schon was gesagt ^^ Klar, wenn die Objekte eher unterschiedlich als gleich sind, wird Pooling etwas weniger interessant. Je unterschiedlicher die Objekte sind, desto mehr Initialisierungsarbeit musst du leisten... das heißt sowohl mehr Arbeit für dich (was doof wäre), aber auch mehr Arbeit für das Programm. Und je mehr das Programm bei der Pooling-Variante arbeiten muss, desto geringer ist der Performancegewinn gegenüber stumpfem Instanziieren. Heißt nicht, dass man bei ein bisschen Initialisierungscode gleich Pooling vom Tisch wischen sollte - der GC ist nach wie vor einer der größten Halunken in Sachen Performance kaputt machen.
  3. Naja, Splatmap-Shader halt... Hier hast du ein Tutorial:https://catlikecoding.com/unity/tutorials/rendering/part-3/
  4. Quaternion.LookRotation nimmt einen Blickrichtungs-Vektor und gibt dir die Rotation zurück, die ein Objekt haben muss, um in eben diese Richtung zu "gucken". Knackpunkt ist hier das Wort "Richtung", denn wenn du die Einschlagsposition des Rays übergibst, dann ist das nicht dasselbe wie eine Richtungsangabe. Nehmen wir an, der Vektor entspricht (-1,1), dann steht das für "oben links". Wenn dein Schiff sich aber nicht am Nullpunkt befindet, sondern z.B. auf Position (-1, 2), dann müsste das Schiff ja in Richtung (0,-1) schauen, also nach unten. Um die Richtung rauszukriegen, die da reingehört, musst du vom Zielpunkt den Ausgangspunkt, also die Position des Schiffes, abziehen. Quaternion rotation = Quaternion.LookRotation(hit.point - transform.position); So nebenbei: Wenn du Plane.Raycast benutzt statt Physics.Raycast, dann kannst du den Collider löschen und umgehst eine Menge potentiellen Ärgers.
  5. Keine Satzzeichen, kein Code, kein "wie ich das bisher versucht habe", keine Fehlermeldungen, nichts. Du machst es uns ganz schön schwer. Da du nicht darauf eingehen willst, was genau schief läuft, kann ich nur eine ganz allgemeine Antwort geben: Überlege dir, ob du die Input-Felder wirklich erzeugen willst. In vielen Fällen ist es sinnvoller, dass Dinge schon von vornherein da sind, aber ausgeblendet sind. Statt sie zu erzeugen, blendest du sie dann einfach ein. Das machst du mit dem Häckchen ganz oben links im Inspektor und dann mit GameObject.SetActive(true).
  6. Scripts, die in der geladenen Szene sind, kriegen Awake, OnEnable und Start aufgerufen. Scripts, die durch DontDestroyOnLoad den Szenenwechsel überlebt haben, hatten früher ein Event, auf das sie reagieren konnten, heute benutzt man dafür das Event SceneManager.sceneLoaded.
  7. Gibt verschiedene Pakete. Die kostenlosen fand ich alle auf die eine oder andere Weise doof, darum hab ich mein eigenes geschrieben, mit dem ich sehr zufrieden bin. Benutzt du Odin oder so? Denn vanilla würde man da ja nichts serialisiert kriegen oder im Editor manipulieren können. Sobald du keine einzelnen Objekte mehr hast, sondern beliebig viele und da entsprechend skalieren willst, kannst du z.B. RuntimeSets benutzen, wo sich jeder relevante Miniboss einträgt. Dein Health Bar-Bereich im UI muss dann natürlich (so oder so) die Anzahl der sichtbaren Health Bars regulieren. Da du in so einem Fall sowieso in der Regel nicht einfach nur mehrere gleiche Health Bars anzeigen willst, sondern irgendwie noch darstellen willst, welche Bar zu welchem Boss gehört, hast du damit dann direkt Zugriff auf beliebige weitere Eigenschaften der Zielobjekte. Wenn es um GameObjects geht, benutze ich gar keine mehr. Ausnahmslos.
  8. Wie kommst du darauf, dass der Farbbereich 0-100 sei? Der Color-Struct geht von 0-1 und die HSVToRGB-Methode erwartet Parameterwerte ebenfalls von 0-1.
  9. Glaub mir: Die Funktion, die ich dir verlinkt habe, nimmt dir den Hauptteil der Arbeit ab. Kannst dir ja einfach mal das Beispielscript kopieren und damit rumspielen.
  10. Wenn man vier Dinge gleichzeitig macht! 😁
  11. Für die erste Frage hast du bereits ein Thema geöffnet. Bleibe für alles weitere bitte bei einem Thema pro... Thema.
  12. Ich kann da jetzt den ganzen Tag blind raten, aber wäre halt besser, wenn du da einfach mal debugst. Dein Script, das du gepostet hast, ist halt in Ordnung. Wenn das nicht tut, dann hast du es offenbar nicht in der Szene. Oder es ist inzwischen anders, als du es gepostet hast.
  13. Klar, geht alles. Musst halt nur schauen, wie viel Aufwand das ist. Wenn du statt RBG HSV nimmst, kannst du mit dem H-Wert den Farbton bestimmten, S steht für Sättigung und V sozusagen für die Helligkeit. Du baust also einen Farbwert mit einem H-Wert zwischen Gelb und Braun. Du kannst auch den S-Wert vom H-Wert abhängig machen, um da eine Linie mit einem anderen Winkel durch das Farbspektrum durchzuziehen. Am Ende generierst du den Farbwert dann mit Color.HSVToRGB.
  14. Zum einen gibt's natürlich den stinknormalen Test, dass du das Spiel laufen lässt und schaust, wie gut das geht. Dann gibt's aber noch Unitys Profiler, mit dem man Frame für Frame schausn kann, was wieviel gekostet hat. Und zuletzt kannst du noch die Performance von zwei Dingen, die dasselbe auf unterschiedliche Art tun, mit einem Benchmark testen. Dafür hab ich mal eine kleine Klasse geschrieben, die man dafür benutzen kann. Und weil ich vergessen habe, den Post auch abzusenden, war malzbie jetzt schneller
  15. Was hast du denn jetzt überhaupt geändert?
  16. Dann ist wohl noch mehr in der Klasse, als du gepostet hast. Das, oder du hast doch irgendwie Escape gedrückt. Vielleicht ist deine Tastatur kaputt oder so. Kannst ja mal ein Debug.Log einfügen und das im Editor testen. void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { Debug.Log("Escape gedrückt."); Application.Quit(); } }
  17. Also, an dem Ding kann es eigentlich nicht liegen, das ist in Ordnung. Wenn du dieses Script rausnimmst, sollte der Fehler dadurch nicht behoben sein.
  18. Poste mal bitte den ganzen Code, aber bitte in die Box, die sich öffnet, wenn du auf <> drückst (über dem Textfeld im Forum).
  19. Das hier ist kein Whatsapp, du darfst gerne beliebig lange mit deinen Beiträgen brauchen xD
  20. Ja, dann poste doch mal den Code, der das tut.
  21. Warum sollte das Spiel abstürzen, weil das Beenden mit Escape nicht funktioniert hat? Du musst ja irgendeinen Code in deinem Programm ausführen, der das irgendwie verursacht hat. Und wiederum irgendeinen Code, der eigentlich beim Drücken der Escape-Taste das Spiel hätte beenden sollen. Hätte jetzt gedacht, es handelt sich dabei um denselben Code.
  22. Hm, da ist leider nicht viel drin. Da musst du jetzt debuggen. Mach mal eine Kopie deiner Szene, und dann löschst du da irgendein Objekt raus, das ein Script draufhat. Dann buildest du das Spiel. Wenn es immer noch abstürzt, löschst du das nächste Objekt mit Script und buildest wieder. Sobald es nicht mehr abstürzt, weißt du, dass das letzte Objekt, das du gelöscht hast, das mit dem Script ist, das das Problem verursacht. Dann kannst du mal schauen, was da genau für Scripte drauf waren. Und die kannst du dann genauer unter die Lupe nehmen.
  23. Nein. Schau mal, da sind so Überschriften. Package Manager Editor Player Unter jeder dieser Überschriften ist eine Tabelle, die die Pfade auflistet, unter denen du beim jeweiligen Betriebssystem die Log File findest. Du bist mit Windows unterwegs. Also schaust du bei "Player" in der Tabelle unter "Windows".
  24. Sietzen = "Sie" sagen Dutzen = "Du" sagen
×
×
  • Create New...