Jump to content
Unity Insider Forum

Spielkarte um 180° in gesetzter Zeit drehen - Animation oder Script


3ncrypt0

Recommended Posts

Hi zusammen,

in einem kleinem Kartenspiel, muss der User Karten, welche vorher verdeckt sind, umdrehen. Dazu habe ich folgende Variante versucht:

void OnMouseUp(){
	StartCoroutine(RotateMe(Vector3.right * 180, .6f));
}

IEnumerator RotateMe(Vector3 byAngles, float inTime)
    {
        var fromAngle = transform.rotation;
        var toAngle = Quaternion.Euler(transform.eulerAngles + byAngles);

		for (var t = 0f; t < 1; t += Time.deltaTime / inTime)
        {
			transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t);
			yield return null;
        }
        StartCoroutine(WaitToSee());
    }

Das funktioniert auch halbwegs gut, nur leider endet die Rotation nie bei 180° oder 0° sondern weicht immer ein wenig ab, was dazu führt, dass Karten schräg dargestellt werden.

Eine weitere Variante welche ich getestet habe und welche ich persönlich auch besser finde, da die Rotationsanimation besser gestaltet werden kann, sind ganz normale Animationen. Die Karten werden bei Spielbeginn instanziiert. Ich habe auf einer Karte eine Animation erstellt und wollte diese auf alle weiteren Karten in den Prefabs übertragen, allerdings habe ich auch eine Positionstransformation auf Y erstellt. X&Z sind dementsprechen auch in der Animation erhalten. Fazit: Alle Karten werden sobald die Animation startet, auf die gleiche Position verschoben -_- 

Kann ich die X&Z Achsen von der Animation ausnehmen?

 

Danke und VG

EDIT:

Habe gerade eben festgestellt, dass mein ChildObject mit der Animation nicht auf zero im parent lag - dann kann das mit der Animation natürlich nichts werden. (Jedes mal wenn ich einen Thread erstelle, finde ich meist ein paar Minuten später selber die Lösung...egal wie oft ich vorher nachgeguckt habe...sorry) - Was mich aber noch stört ist, dass die Animation mit rund 1sek Verzögerung startet ich aber keine Angegeben habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Beim Script kommt die Abweichung davon, dass t beim letzten Schleifendurchlauf mit hoher Wahrscheinlichkeit nicht genau 1 ist, sondern darunter. Und in deinem Fall häuft sich das ja auch noch, weil du immer draufaddierst statt feste Winkel als Ziel anzugeben.

Der Trick bei Coroutinen für Abläufe von a nach b ist, am Ende nochmal auf b zu setzen.

for(vat time = 0; time < duration; time += Time.deltaTime)
{
  SetTo(time / duration);
}
SetTo(duration);

Also in deinem Fall nach der Schleife

transform.rotation = toAngle;

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Stunden schrieb Sascha:

Beim Script kommt die Abweichung davon, dass t beim letzten Schleifendurchlauf mit hoher Wahrscheinlichkeit nicht genau 1 ist, sondern darunter. Und in deinem Fall häuft sich das ja auch noch, weil du immer draufaddierst statt feste Winkel als Ziel anzugeben.

Der Trick bei Coroutinen für Abläufe von a nach b ist, am Ende nochmal auf b zu setzen.


for(vat time = 0; time < duration; time += Time.deltaTime)
{
  SetTo(time / duration);
}
SetTo(duration);

Also in deinem Fall nach der Schleife


transform.rotation = toAngle;

 

Ah okay! Super Danke! Gut zu wissen - Verwende nun zwar Animationen, aber ich werde es bestimmt noch einmal benötigen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...