Jump to content
Unity Insider Forum

Objekt um 45 Grad drehen und zurück


Henrik

Recommended Posts

Hallo ich habe gerade angefangen mit Unity und c# Programmierung, daher bitte ich um ein bisschen Hilfe.

 

Ich habe ein 'GameObjekt' das ich mit Hilfe eines Schalters um +45 Grad drehen möchte.

Wenn ich einen anderen Schalter betätige möchte ich, dass das 'GameObjekt' sich wieder auf seine Ursprungsposition zurück bewegt. 

Ich habe es bereit Probiert über:

transform.Rotate(45 * Time.deltaTime, 0, 0);

Da habe ich aber schnell gemerkt, dass sich das 'GameObjekt' um 45 Grad pro Frame bewegt.

 

Daruafhin habe ich ein wenig Gegoogelt und dies hier gefunden:

public NewtonVR.NVRLever Control;
    float var;

    public void Update()
    {
        if (Control.LeverEngaged == true)
        {
            transform.Rotate(45 * Time.deltaTime, 0, 0);
            var angles = transform.rotation.eulerAngles;
            angles.x += 10 * Time.deltaTime;
            transform.rotation = Quaternion.Euler(angles);
        }
    }

Damit Funktionierte zumindest das runter drehen des Objekts.

Nur wie kriege ich das jetzt wieder hoch?

 

Danke schonmal für eure Hilfe

 

MfG

 

Henrik

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo und willkommen!

Im Standard-Repertoire von Unity gibt es keinen Animations-Code. Also in dem Sinne, dass du eine Code-Zeile schreiben könntest, die besagt: Drehe dich mal x Sekunden lang y Grad weit. Es gibt zwei Animationssysteme, wo du z.B. eine Steh- und eine Laufanimation drinhast, und eine Code-Zeile sagt dann "wechsle zur Laufanimation". Für eine simple Drehung vor und zurück sind beide Systeme aber etwas mehr als nötig.

Wie du schon bemerkt hast, sind die ganzen Bewegungs- und Rotations-Methoden von Unity einmalige Sachen. Etwas wird soweit weiter gedreht, und zwar sofort, und nicht über einen Zeitraum. Wenn du etwas in deinem Code über einen Zeitraum machen willst, dann hast du zwei Möglichkeiten: Entweder, du benutzt eine "Tween"-Bibliothek, oder du baust deinen Code so, dass er über mehrere Frames passiert.

Eine Tween-Bibliothek besteht aus Funktionen, die du beliebig benutzen kannst. Bewege über einen Zeitraum, drehe über einen Zeitraum, usw. Die sehen dann etwa so aus wie Transform.Rotate, aber geben dir noch einen Parameter, mit dem du bestimmten kannst, wie lange das Drehen dauern soll. Je nach Bibliothek rufst du einfach die richtige Funktion auf und dann passiert das und fertig. Da es verschiedene dieser Bibliotheken gibt und ich die eigentlich nicht benutze, kann ich dir nicht mehr sagen. DOTween ist, glaube ich, relativ beliebt.

Um ohne Tween-Bibliothek deinen Code über mehrere Frames laufen zu lassen, kannst du entweder Update benutzen oder eine Coroutine schreiben. In deinem Fall würde ich zur Coroutine raten, da sie ein ganzes Stück kompakter daherkommt.

Eine Coroutine ist in Unity eine Methode, die über beliebig viele Frames hinweg pausiert werden kann. Du lässt sie dann arbeiten wie ein Stop-Motion-Filmmacher. Drehe zwei Grad, mach ein Foto, drehe zwei Grad, mach ein Foto, ... statt ein Foto zu machen, wartest du jeweils einen Frame lang, denn zwischen zwei Update-Schritten malt Unity je einmal das Bild neu. Das ist für Anfänger aber ein bisschen krasser Stoff, von daher würde ich das nur rausholen, wenn du da Lust drauf hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay danke erstmal,

 

ich kann dir ja sicher einmal Zeigen was ich tun möchte

. Unbenannt.PNG.a196a3555f4ca0048231842692628349.PNG

 

Das ist ein Erdungstrenner :D weis nicht ob dir das was sagt.

Auf jedenfall möchte ich, dass auf betätigung eines schalters sich die 'Scheren' so hinbewegen

1902461570_Erdungstrenneroffen.PNG.ae50745d87ca606f82686b9dd05303f6.PNG

 

Und halt wieder zurück wenn ich einen anderen Schalter betätige.

Als Schalter habe ich einfach aus NewtonVR den Lever benutzt.

Habe auch geschafft das sich die beiden GameObjekte nach unten bewegen bis auf wie auf dem unteren Bild zu sehen.

Nur das Hoch fehlt noch und da fehlt mir jeglicher ansatz xD

Eventuell könntest du mir da ja auf die Sprünge helfen

 

LG Henrik

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du dir Tweens mal angeschaut?

Ansonsten ginge vielleicht auch eine simple Update-Methode, wenn ich mir das so ansehe.

public Vector3 targetEuler;
public float speed = 10f;

private void Update()
{
  transform.localEulerAngles = Vector3.MoveTowards(transform.localEulerAngles, targetEuler, speed * Time.deltaTime);
}

Wenn du "Target Euler" im Editor oder per Script änderst, dann bewegt sich das Objekt, auf dem dieses Script ist, mit der gegebenen Geschwindigkeit dahin. Eigentlich will man eher Quaternions benutzen, aber Eulerwinkel machen das für's Erste einfacher.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...