Jump to content
Unity Insider Forum

malzbie

Moderators
  • Posts

    5,366
  • Joined

  • Last visited

  • Days Won

    396

Everything posted by malzbie

  1. Ja, das habe ich gemeint. Ich wollte es halt ein bisschen einfacher schreiben. Aber du hast Recht, das ist missverständlich ausgedrückt.
  2. Ja, du kannst dann von überall in über jede Szene in deinem Spiel auf diese Variable zugreifen. Static bedeutet, dass diese Variable überall bekannt ist und überall existiert. Aus diesem Grund darf diese Klasse nur einmal im Spiel vorhanden sein. Du kannst also nicht allen deinen Spielfiguren dieses Script zuweisen. Wenn du aber einfachnur Globale Variablen sammeln willst, dann ist das recht praktisch. Denn das Script braucht keinem GameObjekt zugewiesen werden und sollte es auch nicht. Erzeuge es und lass es einfach in deinem Projektordner liegen. Wie gesagt: Die Variablen sind immer und überall bekannt. Das bedeutet auch, dass sie die Werte immer behalten. Wenn du also, wie in deinem Beispiel, die Lebenspunkte dort ablegen willst, dann musst du daran denken, dass bei einem Szenenwechsel, wo ja alles in der neuen Szene mit Grundwerten beginnt, deine Lebenspunkte nicht verändert werden. Die haben immer noch den selben Wert. Du musst die Werte also manuell zurückstellen! Das ist der erste Nachteil. Der zweite Nachteil ist, dass du die Werte der Variablen nicht im Inspector sehen kannst, was bei einer Fehlersuche sehr hinderlich sein kann. Und selbst wenn du dieses Script nur als Container für alle Möglichen Grundwerte nutzen willst, musst du immer in das Script rein gehen um Werte anzupassen. Mal schnell im Inspector etwas zu ändern ist nicht möglich. Vor- und Nachteile gleichen sich also ungefähr aus.
  3. Ne, dafür sind diese Methoden nicht gut. OnEnable() Wird immer dann ausgeführt, wenn das Script eingeschaltet wird (Häkchen im Inspector). Also entweder wenn das Script von außen mit .enable=true eingeschaltet wird oder aber das komplette GameObject aktiviert wird und das Script am GameObject nicht deaktiviert war. Das passiert wirklich nur beim Einschalten. Das nutzt du am Besten um dich irgendwo anzumelden und gewisse Eigenschaften einzustellen. Genauso ist das mit dem OnDisable(). Das wird kurz vor dem ausschalten des Scripts, oder dem deaktivieren des GameObjects gemacht. Hiermit kann sich dann das Objekt abmelden. Das ist aber nur einmal in einem Zyklus und bringt dir nichts um eine Animation ablaufen zu lassen, denn gleich danach ist das GO deaktiviert und somit weg. Das OnEnable() könnte aber für eine Einfluganimation gut genutzt werden. Wenn du aber so eine Animation ablaufen lassen willst, dann kannst du ja eine public Methode im Script des UI Eelementes erstellen, wo du von außen reinspringst, anstatt das Canvas von außen zu deaktivieren. In der Methode wird dann ne Animation gestartet, die das Objekt verschwinden lässt. Jetzt musst du aber trotzdem das UI Element deaktivieren. Also brauchst du was, dass nach der Animation das Canvas deaktiviert. Entweder weisst du wie lange die Animation abläuft und du startest eine Coroutine, die genau so lange wartet und danach das Canvas deaktiviert, oder du baust dir noch eine public Methode, in die die Animation per Event rein springt und dort dann das Canvas deaktiviert wird. Hier ist mal eine Liste von allen Monobehavior-Methoden. Diese On... Methoden sind ja Message-Methoden, die (wenn sie im Script sind) dir mitteilen, dass dieses oder jenes jetzt gerade aufgetreten ist Awake, Start und Update gehören auch dazu, denn in dem Moment, wo sie aufgerufen werden, ist etwas passiert. https://docs.unity3d.com/ScriptReference/MonoBehaviour.html Und hier ist der Ablauf dieser ganzen Events und deren Reihenfolge. Das ist wichtig zu wissen. https://docs.unity3d.com/Manual/ExecutionOrder.html
  4. Das kann schon normal sein, aber da ich sowas nie selber gebaut habe, weiss ich es nicht. Du kannst dich ja mal mit dem neuen Inputsystem vertraut machen. Da hast du Objekte oder Komponenten im Spiel, die all deine Inputs übernehmen. Die sollten, wenn sie beim Szenenwechsel aktiv bleiben, komplett durchgängig funktionieren. Aber ich muss dir sagen, so mächtig das neue Inputsystem auch ist, so schwierig ist es zu verstehen. Es gibt mindestens 3 unterschiedliche Arte, das Sytem einzubinden und alle haben Vor- und Nachteile. Ich nutze jedenfalls das neue System und bin zufrieden damit.
  5. Haha! Ja wer wer war denn DAS? Mach dir nichts draus. Solche Dinge passieren einfach. Schön dass du den Fehler gefunden hast.
  6. Doll! Also nach dem, was du da schreibst, bleibt eigentlich echt nur die Möglichkeit, dass das Canvas zwar geschlossen wird, aber trotz allem danach sofort wieder geöffnet wird. Bist du dir sicher, dass es nur einen Ort gibt, von dem aus das Canvas wieder geöffnet wird? Wird das nur über einen Button gemacht oder ist da eine Variable mit im Spiel? Wenn du das Canvas GameObject deaktivierst/aktivierst, dann gib ihm doch mal ein kleines Script, mit OnEnable und OnDisable Funktionen. In beiden Funktionen führst du ein Debug.Log aus. Mit unterschiedlichen Texten und vielleicht der Time.time, um zu sehen, wann etwas passiert ist. Ach so. Du hast scheinbar Schwierigkeiten damit, wann etwas enalbled und wann etwas activated wird. Kurze Erklärung dazu: Enabled werden nur Komponenten, die an einem Gameobject dran hängen. Also die Dinger, die ein Häkchen Im Inspector haben. Scripte, Audiosources, Collider, Meshrenderer usw. Manche Komponenten kannst du nicht Enablen/Disablen. Das sind z.B. Transform, Material und Rigidbody. Aktivated werden komplette GameObjects ! Wenn du ein Canvas erzeugst, dann baut Unity dir ein GameObject mit mehreren Canvas-Components zusammen. Du kannst jetzt die Canvas Hauptkomponente disablen, und lässt alle anderen Komponenten, wie den CanvasScaler und den GraphicRaycaster an, oder du deaktivierst das ganze GameObject mit all seinen Komponenten da drin. Das bleibt dir überlassen. Es ist aber eben ein Unterschied, ob man nur eine Komponente disabled und den Rest laufen lässt, oder ob man das ganze GameObject deaktiviert. Wenn du das GameObject aktivierst/deaktivierst, musst du eine Referenz zum Objekt gebildet haben, weil es sonst, wenn deaktiviert, nicht mehr gefunden werden kann. Ich persönlich deaktiviere das ganze Canvas GameObject, denn dann ist alles aus.
  7. Hmmm.... Also wenn er da bei beiden Fällen dein "Hier" rauswirft, er also in beiden Fällen in die Methode ChangeToTransportMenu rein springt, dann muss es auch gehen. Es sei denn, die CloseAll() Methode macht nicht das was sie soll. Du sprichst von allen geöffneten Menüs. Woher weiß er denn welches Menü offen ist? Ist da vielleicht der Fehler?
  8. Was heisst denn bei dir schließen? Das Canvas disablen? Wenn du ein debug.log bekommst, dann ist ja in dieser einen Sache alles in Ordnung. Also muss von einer anderen Seite aus noch etwas anstehen, was das Schließen unterbindet, oder aber sofort nach dem schließen wieder öffnet. Kannst du das Öffnen ausschließen?
  9. Ich gehe davon aus, dass es an der ständigen Umrechnung von Quaternion (was ein Vector4 ist) zu Euler (was ein Vector3 ist) und umgekehrt liegt. Da wird es immer leichte Ungenauigkeiten geben. Warum machst du es nicht so wie mit der Position? Du willst doch scheinbar nur um die X Achse lerpen, es soll also zur -90 hin gehen. Nimm dir also einmalig die Ausgangsrotation deines Objektes, z.B. in der Start(), und speichere sie in einer Vector3 Variable ab. Jetzt lerpst du nur den x Wert dieses Vector3 und übergibst ihn dann wieder der Variable. Diesen nutzt du dann für dein Objekt. Also so etwa: Vector3 myEulers; // hier speichere ich die Grundausrichtung rein float targetRotation= -90f; void Start(){ myEulers= transform.localEulerAngle; // hier hole ich mir die Grundausrichtung vom transform. Aber die lokalen Werte, falls es ein Kindobjekt ist } void Update(){ myEulers.x=Mathf.Lerp(myEulers.x, targetRotation, 10*Time.DeltaTime); // nur das x vom Vector3 wird gelerpt. transform.localEulerAngles= myEulers; // jetzt alles dem transform übergeben }
  10. Entweder du nimmst einen Shader, der Beidseitig funktioniert, oder aber du erzeugst dir ein Kugel in einem 3d Programm, wie z.B. Blender, und drehst da einfach die Normalen der Flächen um.
  11. Um es kurz zu erklären: die FixedUpdate hat einen eigenen Zyklus, der in der Theorie frameunabhängig ist. Bei diesem Zyklus werden alle physikalischen Dinge abgearbeitet. Also Collider, Rigidbodies, Kollisionen und Kräfte, die auf einen Rigidbody wirken. Wenn aber der Rechner so schwach ist, dass diese FixedUpdate Rate nicht geschafft werden kann, dann ist sie auch abhängig von der Performance.
  12. Es sorgt dafür, dass sofort aus der FixedUpdate zurück gesprungen wird und somit die nachfolgende Abfrage und das setzen der Velocity gar nicht erst bearbeitet wird. Alles, was da in dieser FixedUpdate drin steht, soll nur gemacht werden wenn isGrounded true ist. Sonst eben nicht.
  13. Das ist echt seltsam. Wenn die Ziege im "Game View" nicht sichtbar wäre, dann könnte es am Culling liegen, weil man einstellen kann ob eine Animation nur laufen soll, wenn sie im Camerafocus ist. Dann würde die Animation in beiden Fenstern nicht ablaufen. Da bei dir aber die Animation stoppt, wenn dein Sceneview an ist, kann es eigentlich nur an Editordingen liegen, die erst dann angezeigt werden, wenn der Scene View aktiv ist. Was da aber die Animation beeinflussen kann, weiss ich echt nicht. Dein Wasser ist ja auch irgendwie animiert. Machst du das auch mit dem Animator? oder tauschst du da per Script die Sprites aus? Weil das ist ja ständig animiert und hört nicht auf, wenn SceneView aktiviert wird.
  14. Ich kann mir da keinen Reim drauf machen, aber ich habe etwas im Mutterforum dazu gefunden. https://forum.unity.com/threads/animation-plays-correctly-in-scene-view-but-not-in-play-mode-or-on-device-possible-unity-bug.328254/ Und zwar kann es zu Problemen kommen, wenn das zu animierende Objekt ein Scaling hat. Es also nicht in den Importeinstellungen aufs richtige Maß gebracht wurde, sondern direkt am Objekt. In dem Beispiel oben, hat der User ein negatives Scaling auf einer Achse gehabt. Sowas kann passieren, Passiert mir auch manchmal wenn ich Collider scale. Da ist man gerne mal im negativen. Vielleicht ist es das ja. Schau einfach mal.
  15. Wo siehst du die Animation? In welchem Fenster? Ist die Ziege an sich denn im Sceneview zu sehen?
  16. Willkommen! Ja, ein RPG will eigentlich jeder mal bauen. Das ist auch möglich, selbst als Einzelperson. Aber eben nur bis zu einen gewissen Punkt, weil man nicht gegen 10, 50 oder 200 Leute Studios ankommen kann. Trotzdem, bleib dran und hab Spaß dabei.
  17. Das Speichern, also das Ablegen der Daten auf einen Datenträger sollte man so wenig wie möglich tun. Vorallem nicht, wenn es um große Datenmengen geht. Bei einem Wechel einer Szene finde ich das aber in Ordnung, solange der Wechsel nicht ständig passiert. Aber es hängt natürlich davon ab, ob es ein automatisches Speichern sein soll oder ob du den Spieler entscheiden lassen willst, wann und ob gespeichert wird. Es könnte ja sein, dass, je nach Art des Spiels, der Spieler sich dazu entscheidet nicht zu speichern weil etwas schief gelaufen ist. Wenn du außerdem nur eine einzelne Datei erzeugen willst, also nicht für jede Szene extra, dann musst du die Daten eben im Ram ablegen, z.B. als JSON String oder in einer Liste / Array / Dictionary, und dann mit den anderen Daten der anderen Szenen zusammen abspeichern. Du könntest natürlich auch eine temporäre Datei auf dem Datenträger anlegen, die du dann beim "finalen" Speichern einfach nochmal einliest, mit den anderen Daten verknüpfst und als Savegame abspeicherst. Die Temporäre Datei würde danach gelöscht werden. Ich persönlich würde das aber nicht machen. Trotzdem gibt es viele Spiele, die beides unterstützen. Ein Autosave, der automatisch den Fortschritt speichert und nützlich ist, wenn der Rechner mal abschmieren sollte, und das manuelle Speichern der Spielstände. Genauso gibt es viele Spiele, die je Spielstand ganz viele Dateien anlegen. Das können einzelne Szenen sein und auch einzelne Wertegruppen. Unüblich ist das also alles nicht.
  18. Ich habe immer mehrere Ebenen von UI's. Manche sind Prefabs, manche nicht. Das Spielemenü ist in der Regel kein Prefab, weil es Dinge zeigt, die nicht im Spiel vorkommen werden. Diese UI liegt also nur in dieser einen Menü-Szene. Bei meiner Pinball-Collection ist das komplette Menü in einem einzigen Canvas. Was im Nachhinein gesehen gar nicht so gut ist. Bei meinem neuen Game besteht jeder Menübereich aus einem eigenen Canvas. Das finde ich gut, denn ich kann jedes einzelne Modul unabhängig von den anderen bearbeiten bzw. erstellen. Wenn ich im Game dann einen Menüpunkt auswähle, wird das entsprechende Canvas aktiviert und das Hauptmenü-Canvas deaktiviert. Und beim zurück gehen ins Hauptmenü geht's natürlich anders herum. Einige der Untermenüs habe ich zu Prefabs gemacht und nutze die dann auch im Spiel selbst. Im Spiel selbst, sind mehrere UI's, also Canvases. Eins für das Pausemenü und ein paar andere für die Spielerinfos, die man so braucht. Alle liegen in der Szene gebündelt in einem Empty Gameobject. Dieses Gameobject bietet sich an zum Prefab zu werden, wenn das Spiel aus mehreren Szenen bestünde. Bei mir gibt es aber nur eine Szene. Bei meinen Flippern ist die ingame UI ein Prefab und jeder Tisch hat dann dieses Prefab in seiner Szene. Die UI's einmalig bei Spielstart zu erstellen und dann über alle Szenen am Leben zu erhalten sehe ich jetzt nicht als Vorteil an, denn bei mir sind das keine Datencontainer. Meine Daten werden static in einem Sammelscript abgelegt. Das brauche ich eh um relevante Daten zu speichern. Die UI's additiv hinzu zu laden finde ich auch nicht sehr nützlich, weil man dann im Nachgang möglicherweise diese UI mit anderen UI's oder Objekten verknüpfen müsste. Das alles bezieht sich auf zweidimensionale UI's, also Overlays. Dreidimensionale UI's (Canvases) würde ich mit den dazugehörigen Objekten zusammen als Prefab abspeichern, denn die stehen meist direkt mit diesen einzelnen Objekten in Bezug. Ich meine hier speziell irgendwelche Computerterminals, bei denen diese UI's angezeigt werden und mit denen man auch interagiert.
  19. Was heisst denn außerhalb der Map? Die Kamera zeigt natürlich immer den Player, egal wo er ist, denn sie folgt ihm ja. Soll die Kamera ihm aber nicht immer folgen, weil der Player z.B. in ein Loch gefallen ist, dann musst du irgendwie definieren, wo die Bewegungsgrezen der Kamera sind. Erklär doch mal den Aufbau deiner Spielszenen. Sind das immer einzelne Screens oder ist das eine offene, große Spielewelt? Wann ist man außerhalb der Map?
  20. malzbie

    Weihnachten 2021

    Auch wenns schon fast vorbei ist, wünsche ich euch auch allen ein frohes Fest und ein paar ruhige Tage zum Zocken, für die Familie, für Dinge die schon lange gemacht werden wollen und zum enspannen.
  21. Was immer sein kann: Du hast das neu erzeugte Script mit einem Namen versehen, der ein Leerzeichen drin hat. Also Red Mine anstatt RedMine. Leerzeichen geht aber für einen Klassennamen nicht und deswegen macht er in der Klasse RedMine draus. Scriptname und Klassenname müssen aber identisch sein, sonst findet Unity das dingen nicht. So kenne ich es jedenfalls wenn nur eine Klasse im Script drin ist.
  22. Da nicht jeder, der mit Unity anfängt, auch programmieren kann, habe ich mir gedacht da muss ich mal eine Videoreihe zu machen. Ich habe ja schon viele Tutorials gemacht, aber so richtig aufwendig waren sie nie. Bis heute! Hier ist mal ein aufwendiges Video, was dir alles zu den booleschen Operatoren zeigen wird. Wo kommen sie her, was mache sie, wo gibt es Unterschiede und wie wendet man sie an. Viel Spaß beim schauen.
  23. Also wenn ich es jetzt richtig verstanden habe, dann kennst du momentan nur dem Weg über eine Public Variable, wo du per Hand die Audiosource einfügst. Du möchtest das aber entweder automatisieren oder sogar auf ein anderes Objekt mit einer Audiosource zugreifen. Wenn dein NPC wärend der Erstellung auch eine Audiosource Komponente bekommt, dann kannst du per Script über GetComponent die AudioSource einer Variable übergeben. private AudioSource audioSource; void Start(){ audioSource= GetComponent<Audiosource>(); // ich suche auf meinem GameObjekt und wenn ich eine AudioSource finde, übergebe ich sie der Variable if(audioSource !=null){ audioSource.Play(); } else{ print("keine AudioSource gefunden"); } Man kann natürlich auch in Vater oder KinderObjekten suchen. Siehe hier: https://docs.unity3d.com/ScriptReference/GameObject.html Genauso kannst du auch ein fremdes GameObject einbinden, welches die Audiosource bei sich hat. Dieses fremde Objekt muss natürlich ersteinmal identifiziert werden. Das geht am leichtesten über einen TAG, nach dem du in der Szene suchst. Also das AudioObjekt muss diesen zu suchenden TAG haben. private AudioSource audioSource; void Start(){ audioSource = GameObject.FindGameObjectWithTag("NPCSound").GetComponent<AudioSource>(); // Hier wird nach dem TAG NPCSound gesucht und sobald ein GameObject mit diesem Tag gefunden wurde, // wird dessen AudioSource als Referenz der Variable übergeben. Und schon kann sie genutzt werden. } Wenn es das nicht war, dann musst du nochmal genauer erklären was du hast und was du willst.
  24. Überladen finde ich die UI nicht. Ich hätte sie nur nicht so aufgeteilt bzw. gestaltet. Mach du ruhig mal wie du es dir vorstellst. Es ist ja dein Baby. Dass du dein Spiel für dich selbst machst verstehe ich. Es besteht immer die Gefahr, dass jemand dein Spiel nicht mag und es dir dann auch sagt. Da gibt es die Angst missverstanden bzw. gekränkt zu werden. Wenn dein Spiel fertig ist und du es gelungen findest, dann solltest du trotzdem den Schritt wagen und es anderen zum Spielen geben. Denn egal welches Spiel es ist. Es wird immer Leute geben, die es nicht mögen. Aber es wird auch viele geben die damit Spaß haben werden. Und das ist dann dein Lohn!
  25. Ja ja! Wie groß der Aufwand ist, erkennt man oft erst mittendrin. Wenn du dein Spiel nicht nur für einen kleinen Kreis bauen willst, dann ist die Lokalisierung ein Zahnrad im Spiel, welches du nie aus den Augen lassen solltest. Gerade wenn du ein textlastiges Spiel baust. Aber das hast du ja gemerkt. Jetzt zum Spiel, also zu den Bildern die du zeigst. Es hat einen netten 2D Adventure-Look. Pixelart mögen viele Leute. Ich auch. Leider wird der Look durch die Textboxen zerstört. Es ist nicht nur das Rechteckige aussehen mit den feinen Randlinien, sondern viel mehr der Font in den Boxen. Die Sache ist die: Mit dem Look versetzt du den Spieler in die gute alte 2D Zeit zurück, wo die Auflösung gering war. Mit der kleinen und nicht pixeligen Schrift brichst du mit dem Look. Du hast riesige Textboxen für den winzigen Font. Gerade im Inventar fällt der Bruch besonders auf. Die Objekte sind grob pixelig aber die Buttons und der Text sind modern, kalt und lieblos. Früher hat man solche Buttons gerne ohne Bechriftung erstellt und stattdessen Piktoramme gewählt. Ein Bild hat dabei sogar den Vorteil, dass es von sich aus schon lokalisiert ist. Man könnte ja zusätzlich mit Tooltips arbeiten. Warum du an den Rändern diese 2 Chararktereigenschaften Wissen und Angst angebracht hast, weiß ich leider nicht. Dass man die ständig sieht scheint wichtig zu sein. Aber muss der Text um 90° gedreht sein und müssen diese Werte von einander getrennt sein? So finde "ich" das jetzt nicht schön. Ich würde alle Playerinfos bündeln und sie dem Look des Spiels anpassen. Evtl. mit Objekten die über den Füllstand dem Spieler Informationen geben. Vielleicht ist ja die ganze UI ja noch ein Prototyp. Dann wäre es Ok, weil dann geht es hauptsächlich um die Funktion. Aber ich glaube, dass du inzwischen weiter bist und die Funktion längst gewährleistet ist. Deswegen solltest du das Optische anpassen. Die genutzten Grafiken können ja weiterhin ersteinmal Dummys sein. Hauptsache es passt zusammen und kann arrangiert werden. Und noch was! Pixelspiele wurden früher mit dem Joystick gespielt. Dein Spiel bietet sich geradezu dafür an. Schön auf dem Sofa sitzen und ohne Tastatur und Maus das Spiel steuern. So wie du deine UI aufgebaut hast, glaube ich nicht, dass du einen Gamepad eingeplant hast. Wäre dann aber eine Überlegung wert. Fazit: Ich finde es soweit ganz gut, mir gefällt aber die UI und vor allem die Schriftgröße nicht. Weitermachen!
×
×
  • Create New...