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

08.01.2017, 13:41

Unity - Relative Bewegung zur Kamera - Rotation wird nach dem Input wieder resettet

Hallo,

ich versuche eine Steuerung für einen 3D Platformer hinzubekommen. Das funktioniert auch schon recht gut soweit. Ich habe dazu aber noch ein Problem. Nachdem man eine Taste loslässt, setzt sich der Spieler wieder in seine Ursprungsrotation zurück. Habs mal aufgenommen:

https://sendvid.com/1tca5sw5

Die gesamte Steuerung ist recht überschaubar:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 private Rigidbody rigid;
    private float movementSpeed = 20;
    private float jumpPower = 50;
    private float gravity = 5;
    private float distanceToGround;
    private float groundCheckSpacing = 0.1f;
    private float smoothRotation = 50;
    private float verticalVelocity;
    Vector3 movement;

    private void Start()
    {
        rigid = GetComponent<Rigidbody>();
        distanceToGround = GetComponent<Collider>().bounds.extents.y + groundCheckSpacing;
    }

    private void FixedUpdate()
    {
        if (GroundCheck())
        {
            verticalVelocity = -gravity;
            if (Input.GetButtonDown("Jump"))
            {
                verticalVelocity = jumpPower;
            }
        }
        else
        {
            verticalVelocity -= gravity;
        }

        movement.x = Input.GetAxis("Horizontal") * movementSpeed;
        movement.y = verticalVelocity;
        movement.z = Input.GetAxis("Vertical") * movementSpeed;

        Transform tempTransform = Camera.main.transform;
        tempTransform.position = new Vector3(tempTransform.position.x, transform.position.y, tempTransform.position.z);
        tempTransform.LookAt(transform);
        movement = tempTransform.TransformDirection(movement).normalized * movementSpeed;

        rigid.velocity = movement;

        if (movement.magnitude != 0)
        {
            Quaternion targetRotation = Quaternion.LookRotation(new Vector3(movement.x, 0, movement.z));
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, smoothRotation);
        }
    }

    private bool GroundCheck()
    {
        return Physics.Raycast(transform.position, -Vector3.up, distanceToGround);
    }


Die Bewegung des Charakters soll also relativ zur Ausrichtung der Kamera errechnet werden.