Jump to content
Unity Insider Forum

Bewegen von Child-Objekten nicht möglich


TheSky

Recommended Posts

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

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

@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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...