Jump to content
Unity Insider Forum

malzbie

Moderators
  • Posts

    5,364
  • Joined

  • Last visited

  • Days Won

    396

malzbie last won the day on January 13

malzbie had the most liked content!

1 Follower

About malzbie

  • Birthday 10/30/1968

Profile Information

  • Gender
    Male
  • Location
    Kassel, Hessen, Deutschland

Recent Profile Visitors

30,230 profile views

malzbie's Achievements

Advanced Member

Advanced Member (3/3)

1.6k

Reputation

  1. 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
  2. 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.
  3. Haha! Ja wer wer war denn DAS? Mach dir nichts draus. Solche Dinge passieren einfach. Schön dass du den Fehler gefunden hast.
  4. 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.
  5. 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?
  6. 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?
  7. 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 }
  8. 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.
  9. 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.
  10. 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.
  11. 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.
  12. 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.
  13. Wo siehst du die Animation? In welchem Fenster? Ist die Ziege an sich denn im Sceneview zu sehen?
  14. 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.
  15. 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.
×
×
  • Create New...