TheSky Geschrieben 11. Dezember 2017 Melden Share Geschrieben 11. Dezember 2017 Hallo, ich habe (schon wieder) ein seltsames Problem mit dem Animationssystem entdeckt, das ich mir nicht erklären kann. Nehmen wir an, ich wollt die Position eines child-Objektes per Skript verändern (z.B. mit transform.localPosition). Eigentlich kein Problem. Allerdings scheint dieser Befehl nicht mehr zu funktionieren, wenn sich im Animationssystem eine Animation befindet, die die Position des Child-Objektes verändert, selbst dann, wenn diese Animation niemals abgespielt wird. Es wäre schön, wenn jemand mir jemand sagen kann, ob er dieses Verhalten reproduzieren kann, oder evtl. eine Lösung weiß. Wie das Verhalten erzeugt wird, erkläre ich an einer simplen Testszene (ich habe die Testszene auch noch mal an diesen Beitrag angehängt): -erstelle ein neues 2D-Projekt -erstellene ein neues Objekt über Assets-->create-->sprites-->square -erstellene ein neues Objekt über Assets-->create-->sprites-->Triangle -Ordne das Dreieck, den Viereck unter. Das Viereck ist nun das Parent, und das Dreieck das Child-Objekt -gib dem Parent ein kleines Skript (siehe unten), welches das Child-Objekt bei Druck auf die R-Taste an eine neue Position verschiebt. -Gib dem Parent einen Animator und erzeuge mit create-->empty einen leeren State und setze diesen als default-State Wenn nun das Skript gestartet wird, und man auf die R-Taste drückt, wechselt das Dreieck seine Position. So weit in Ordnung. -erzeuge nun eine weitere Animation, bei der die Postion des Child-Objektes etwas verändert wird. -füge die Animation dem Animator hinzu. Eine Transition ist nicht nötig. (Die Animation wird also nie abgespielt, und sollte daher eigentlich keinen Einfluss haben) Wenn man das Skipt nun erneut startet, bewegt sich das Dreieck bei Druck auf die R-Taste nicht mehr. Ist dieses Verhalten ein Bug, oder übersehe ich möglicherweise etwas? Es wäre auch schön, wenn jemand eine Lösung dafür hätte. Hier noch der Code zum Bewegen: using System.Collections; using System.Collections.Generic; using UnityEngine; public class resetChildPos : MonoBehaviour { private Transform child; // Use this for initialization void Start () { child = transform.GetChild(0).GetComponent<Transform>(); } // Update is called once per frame void Update () { if(Input.GetKeyDown("r")) { child.localPosition = (Vector2)child.localPosition + new Vector2(1,0); } } } test4.zip Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. Dezember 2017 Melden Share Geschrieben 11. Dezember 2017 Das Animationssystem wird zwischen Update und LateUpdate ausgeführt. Was auch immer du in Update machst, das Animationssystem wird es danach ändern (wenn es überhaupt mit dem Objekt zu tun hat). Wenn du also etwas, das das Animationssystem macht, nachträglich vor dem Rendern überschreiben willst, mach es in LateUpdate. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TheSky Geschrieben 11. Dezember 2017 Autor Melden Share Geschrieben 11. Dezember 2017 @Sascha Habs gerade ausprobiert. Leider scheint auch das nicht zu funktionieren. Im Gegensatz zu vorher, sieht man nun jedoch wir sich die Position bei Druck auf die R-Taste für einen Moment verändert (schätze für einen Frame). Danach wird die Position sofort wieder zurückgesetzt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TheSky Geschrieben 11. Dezember 2017 Autor Melden Share Geschrieben 11. Dezember 2017 @Sascha Ich muss mich korrigieren. LateUpdate funktioniert super. Im meinem Skript wurde die Position nur einmal geändert (und im nächsten Frame vom Animator rückgängig gemacht). Ich muss die Positionänderung selbstverständlich auch in allen weiteren LateUpdates aktualisieren, damit sie nicht rückgängig gemacht wird. Mein Fehler. (Das kommt davon, wenn man die Nacht durcharbeitet ^^ ) Danke, deine Lösung hat mir sehr weiter geholfen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 11. Dezember 2017 Melden Share Geschrieben 11. Dezember 2017 Nur als Zusatziinfo, ich glaub man kann solchen Code auch hier rein packen, ich glaub LateUpdate() kommt nach dem Aufruf dieser Methode (Hintergrund, wenn man Sachen in andere Methoden hineinpacken kann, dann sollte man es tun, so hat man LateUpdate() noch "frei" für andere Sachen):https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnAnimatorMove.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. Dezember 2017 Melden Share Geschrieben 11. Dezember 2017 Oha, schick. Den kannte ich noch gar nicht. 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.