Jump to content
Unity Insider Forum

Movetowards Ende


Kojote

Recommended Posts

Grüße!

@malzbie hatte mir vor ein paar Tagen netterweise diese Objektpositionierung geschrieben:

if (hexagonverbindungPositionieren == true) {
            // Kurz aufs Startobjekt legen
            hexagonverbindung.transform.position = aktivesHexagon1Koordinate;
            // Jetzt schiebe ich mich in die Mitte zwischen die 2 Objekte
            hexagonverbindung.transform.position = Vector3.MoveTowards(aktivesHexagon1Koordinate, aktivesHexagon2Koordinate, Vector3.Distance(aktivesHexagon1Koordinate, aktivesHexagon2Koordinate) / 2);
            // Damit ich mich zum Ziel hin ausrichen kann
            hexagonverbindung.transform.LookAt(aktivesHexagon2Koordinate);
            // Jetzt ziehe ich mich in die länge
            hexagonverbindung.transform.localScale = new Vector3(0.1f, 0.1f, Vector3.Distance(aktivesHexagon1Koordinate, aktivesHexagon2Koordinate) - 0.1f);
            // Beendigung und Koordinatenwechseln
            if() {
                hexagonverbindungPositionieren = false;
                moegoechkeitspruefung = true;
            }
        }

Diese funktioniert sehr gut, Programmbedingt muss ich jetzt, sobald die Positionierung fertig ist, ein weiteres Event aufrufen, was abhängig von der Beendigung der Positionierung ist.

Wenn ich einen Zielpunkt hätte, den ich genau kenne, könnte ich ja mit Equals abfragen, ob die Positionierung beendet ist, jedoch an diesem Script fällt mir gerade echt nicht ein, wie ich abfrage, ab die Verbindung ihre Position erreicht hat (leere if-Abfrage).

Habt ihr ne Idee? :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe dir zwar Teile von dem Code da oben in einem anderen Thread gepostet, trotzdem verstehe ich nicht was du machen willst und was es mit dem Code da oben zu tun hat.
Der Code da oben kennt einen Startpunkt und einen Zielpunkt. Ein Gameobjekt richtet sich aus, setzt sich in die Mitte und verlängert sich soweit, dass Startpunkt und Zielpunkt über das Objekt verbunden werden. Das passiert sofort und ist eine Sache für sich. Über diesen Code kannst du nichts abfragen, denn es gibt keine Rückmeldung und auch keine Dauer.
Ich sehe auch nicht welche Bedingung da abhängig gemacht werden könnte. Die Bedingung "Verbunden" ?
Der Code funktioniert nur, wenn ein Startpunkt und auch ein Zielpunkt bekannt ist. Also musst du wohl schon vorher irgendwas erfragen.

Erkläre einfach mal genau, was und wie es bei dir passieren soll.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also du meinsst, dass Objekt ist sofort da, wo es hingehört? Eigenartig, ich starte mit:

moegoechkeitspruefung = true;

ein Fixedupdate um ein Raycast zu senden, ob weitere Züge möglich sind. Mich haut es ständig an der Stelle heraus, wo positioniert werden soll. Stoppe ich den Boolean kurz, und schalte ihn dann, funktioniert alles ohne Probleme. Ich habe darauf getippt, dass die Positionierung noch nicht fertig war. OK, muss ich weiter schaun.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja da hast du scheinbar ein Verständnisproblem im Bezug auf MoveToward und den Zeitpunkten wann etwas passiert.
Ich wills dir mal erklären.
Mit MoveToward bewegt man ein Objekt von einem Startpunkt in Richtung Ziel. Und zwar macht man das über ein Parameter in festgelegter Schrittweite. Wie groß die Schrittweite ist, ist frei einstellbar.. Ich habe ab im Code genau die Hälfte der Länge ermittelt und somit wird in dem Frame ein Hopser gemacht, der exakt die halbe Strecke überwindet. Ich schreibe "in dem Frame" weil ich davon ausgehe, dass du den Code in der Update drin hast.

Dein Raycast wird aber im FixedUpdate ausgeführt. Das kann zu einem ganz anderen Zeitpunkt passieren und da ist vielleicht deine Funktion noch garnicht abgearbeitet. Denn die Fixedupdate wird zyklisch und unabhängig von deiner Framerate abgearbeitet. Natürlich wird das Ergebnis erst mit einem neuen Frame sichtbar, trotzdem ist die Berechnung in der Fixedupdate nicht synchron mit der Update. Außerdem, wird die FixedUpdate (wenn sie denn vom Zyklus her dran ist) immer "vor" der Update ausgeführt.

Kannst du hier sehen:

https://docs.unity3d.com/Manual/ExecutionOrder.html

Somit solltest du einfach am Ende des Codeblocks eine "fertig" variable setzen und die dann auch als Bedingung für deinen Raycast nutzen.
Mach also einfach die If-Aabfrage weg und setze deine 2 Variablen direkt unter den Codeblock.

Was hat dich an der Stelle raus, wo positioniert werden soll? Welche Meldung bekommst du? Sind denn bei der Positionierung auch schon Start und Ziel bekannt?
 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 11.10.2017 um 20:16 schrieb malzbie:

Mit MoveToward bewegt man ein Objekt von einem Startpunkt in Richtung Ziel. Und zwar macht man das über ein Parameter in festgelegter Schrittweite. Wie groß die Schrittweite ist, ist frei einstellbar.. Ich habe ab im Code genau die Hälfte der Länge ermittelt und somit wird in dem Frame ein Hopser gemacht, der exakt die halbe Strecke überwindet. Ich schreibe "in dem Frame" weil ich davon ausgehe, dass du den Code in der Update drin hast.

@malzbie - ich hätte noch einmal eine Frage zu MoveTowards. Du sagst, es arbeitet seine Strecke gleich ab. Wie verhällt sich das dann, wenn ich MoveTowards eine Geschwindigkeit verpasse, multipliziert mit Time.DeltaTime. Würde nun MoveTowards erst einmal abgearbeitet werden und hällt den nachfolgenden Programmblock auf, bis er seinen Punkt erreicht hat oder würde er in jedem Frame immer nur ein Stück bewegt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Solange sich dein Startpunkt nicht verändert passiert sichtbar nur ein Hopser.
Nur weil du da Time.deltaTime nutzt, bedeutet es noch nicht, dass du eine "Geschwindigkeit" bekommst.

Nochmal: MoveTowards ist einzig und allein eine Verschiebung eines Vectors von einem Startpunkt zu einem Zielpunkt. Und das in einem Teilabschnitt, der natürlich auch mit Time.Deltatime multipliziert werden kann. Mehr passiert da in dem Frame nicht. Eine Bewegung über mehrere Frames passiert nur, wenn die Position deines Objektes als Startpunkt genommen wird.
Also wenn :
 

Vector3 start=transform.position; // hier nehme ich meine Objekt-Position als Startpunkt

transform.position= Vector3.MoveTowards(start,ziel,teilstück);  // Das Ergebnis von der Berechnung wird meine Position 

Dann würde bei jedem Durchlauf start neu gesetzt, weil es ja meine nun veränderte Position ist. Und jetzt sieht es so aus als bewegt sich das Objekt in jedem Frame ein Stück weiter in Richtung B.

Wenn du aber:
 

Vector3 start = irgendwas.transform.position; // hier nehme ich irgendeine Position als Startpunkt

transform.position= Vector3.MoveTowards(start, ziel,teilstück); // auch hier wird das Ergebnis zu meiner Position

Dann wird dein Objekt irgendwo (abhängig vom Teilstück) zwischen Start und Ziel positioniert. Da nun aber Start bei jedem Durchlauf immer der selbe Punkt ist (er ändert sich ja nicht), bleibt dein Objekt genau da stehen. Bei jedem Durchlauf wird natürlich die Berechnung wieder ausgeführt. Sie kommt aber auch immer zum selben Ergebnis.

Du siehst, dieser Vector3 Befehl dient ersteinmal nur dazu ein Ergebnis zu liefern. Und zwar einen Punkt im Raum zu ermitteln, der genau auf einer Linie zwischen 2 definierten Punkten liegt. Was du dann mit dem Ergebnis machst, bleibt dir überlassen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...