Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

18.01.2017, 20:06

Unity - Objekt nach erledigter Arbeit zerstören

Hallo,
ich habe einen Türmechanismus (2 Türhälften, die aufklappen) gebaut. Da die Türen nicht mehr geschlossen werden sollen, könnte ich, der Sauberkeit halber, das Objekt, das diesen Mechanismus steuert, zerstören. Dabei möchte ich abgleichen, ob die Türen ihren Rotationswinkel erreicht haben.

Zum Script

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    public Transform pivotLeftTransform;
    public Transform pivotRightTransform;

    int openAngle = 90;
    bool startOpen = false;
    int smooth = 2;

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Player")
        {
            startOpen = true;
        }
    }

    void Update()
    {
        if (startOpen)
        {
            OpenDoor(pivotLeftTransform, openAngle);
            OpenDoor(pivotRightTransform, -openAngle);

            if (pivotLeftTransform.localEulerAngles.y >= openAngle && pivotRightTransform.localEulerAngles.y <= -openAngle)
            {
                Destroy(gameObject);
            }
        }
    }

    private void OpenDoor(Transform pivotTransform, int rotationAngle)
    {
        Quaternion doorRotationOpen = Quaternion.Euler(0, rotationAngle, 0);
        pivotTransform.localRotation = Quaternion.Slerp(pivotTransform.localRotation, doorRotationOpen, smooth * Time.deltaTime);
    }


Die Abfrage

C#-Quelltext

1
pivotLeftTransform.localEulerAngles.y >= openAngle && pivotRightTransform.localEulerAngles.y <= -openAngle
scheint wohl nicht zu funktionieren. Ich weiß, dass dort floats abgeglichen werden. Aber laut Inspector, erreicht die Tür nach gewisser Zeit auch die 90 Grad, glatt.

Nun habe ich mal gewisse Rotationen rumprobiert, localRotation, rotation, eulerAngles und localEulerAngles. Die Bedingung wird aber nie gültig. Scheitert es jetzt an den floats oder kann man das noch auf andere Weise prüfen?

Danke :)

2

18.01.2017, 21:06

Vielleicht hilft das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
public float convertToOtherFormat(float angle) {
        angle %= 360;

        if(angle > 180) {
            angle -= 360;
        }

        return angle;
    }


Dann hat man von 0 bis -180 und von 0 bis +180
Irgendwie sowas.

HLSL-Quelltext

1
2
3
                 0  
            -90     90
              +/-180


Dann kann man bessere Abfragen machen. Vielleicht hilft das.

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

3

18.01.2017, 21:35

Die Antwort von TypeOverride könnte helfen. Bin mir gerade nicht sicher, meine aber, dass die Winkel immer zwischen 0 und 360 Grad liegen. Du kannst dir ja einfach mal jeden Frame beide Winkel mit Debug.Log(...) ausgeben lassen.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

18.01.2017, 22:03

Ich würde die Bewegung zeitabhängig machen. So wie du Lerp verwendest weißt du doch gar nicht wie lange die Bewegung dauert.

Lerp interpoliert zwischen einem Start- und Endwert mit Hilfe eines Faktors der von 0 bis 1 geht. Wenn ich die vergangene Zeit seit dem Triggern als Faktor nehme, bekomme ich eine Bewegung die in 1 Sekunde von Start bis Ende geht. Das kann ich ganz einfach per Division auf beliebige Zeit x anpassen. Und wenn man die Zeit eh hat kann man das Objekt auch nach den x Sekunden zerstören.


Alternativ eine Tween Bibliothek wie HOTween oder iTween nutzen. Die nehmen die die ganze Interpolation ab und dann sieht das ca. so aus (Korrektheit nicht garantiert, da aus dem Kopf geschrieben):

C#-Quelltext

1
HOTween.To(pivotLeftTransform, timeToRotate, "rotation", Vector3(0,90,0)).OnComplete(Destroy));

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

5

19.01.2017, 06:58

Laut Debugger wird der float ja gegen Ende hin immer "genauer", ich habe es jetzt erstmal mit einem Toleranzwert machen müssen.

Sieht also so aus:

C#-Quelltext

1
if (pivotLeftTransform.localEulerAngles.y >= openAngle - 0.1f && pivotRightTransform.localEulerAngles.y <= 360 - openAngle + 0.1f)


Finde ich jetzt nicht ganz so sauber, aber da das Objekt danach ja eh zerstört wird, wird das wohl erstmal reichen.

Danke :)

Werbeanzeige