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

27.07.2016, 19:57

Unity - Kamera ruckelt beim Rückwärtslaufen

Hi,
bei einem Unityspiel versuche ich die Steuerung an den alten Spielen Super Mario 64, Spyro, etc. anzulehnen. Die Kamera folgt dem Spieler und richtet sich relativ aus, damit man bei der Rotation auch direkt die Hindernisse ins Sichtfeld bekommt, damit man reagieren kann. Dreht man sich aber um 180 Grad und läuft quasi mit der Figur zu sich selbst hin, fängt die Kamera an zu ruckeln, da sie sich nicht mitdreht. Laufe ich aber schräg oder seitlich kann sie sich noch passend drehen.

Hier einmal das Video dazu:

https://sendvid.com/aquy54le

Das Kamerascript fällt momentan recht kurz aus, da ich bis aufs Rückwärtslaufen ja schon den gewünschten Effekt bekomme

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public GameObject target;
    public float damping = 1;
    Vector3 offset;

    void Start()
    {
        offset = target.transform.position - transform.position;
    }

    void LateUpdate()
    {
        float currentAngle = transform.eulerAngles.y;
        float desiredAngle = target.transform.eulerAngles.y;
        float angle = Mathf.LerpAngle(currentAngle, desiredAngle, Time.deltaTime * damping);

        Quaternion rotation = Quaternion.Euler(0, angle, 0);
        transform.position = target.transform.position - (rotation * offset);

        transform.LookAt(target.transform);
    }


Falls es an einer fehlerhaften Steuerung liegen sollte, wovon ich nicht ausgehe, da ich mich ohne Kamerascript problemlos frei bewegen und rotieren kann, hier noch das Script, womit die Figur gesteuert wird:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// movementSpeed
    public float speed = 5;
    // jumpSpeed
    public float jumpPower = 15;
    // multiplier while jumping
    public float airMultiplier = 0.25f;
    // rotating
    protected float rotationSpeed = 450.0f;
    // camera object
    public Transform cameraTransform;
    // velocity
    private Vector3 velocity;
    // character
    private Transform thisTransform;
    // char Controller
    private CharacterController character;
    // character transform
    private Transform characterTransform;

    // Starting Point
    void Start()
    {
        // Reference
        thisTransform = GetComponent<Transform>();
        // Reference
        character = GetComponent<CharacterController>();
        // Reference
        characterTransform = character.transform;
    }

    // Character Look Direction
    void FaceMovementDirection()
    {
        // direction to look
        Vector3 targetDirection = character.velocity;
        targetDirection.y = 0.0f;
        // direction to move
        Vector3 moveDirection = characterTransform.forward;

        // rotate
        if (targetDirection != Vector3.zero)
        {
            moveDirection = Vector3.RotateTowards(moveDirection, targetDirection, rotationSpeed * Mathf.Deg2Rad * Time.deltaTime, 1000);
            moveDirection = moveDirection.normalized;
            thisTransform.forward = moveDirection;
        }
    }

    void Update()
    {
        // inputs
        Vector3 movementInputs = new Vector3(0, 0, 0);

        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
        {
            movementInputs.z = 1.0f;
        }
        else if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
        {
            movementInputs.z = -1.0f;
        }

        if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
        {
            movementInputs.x = -1.0f;
        }
        else if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
        {
            movementInputs.x = 1.0f;
        }

        // movement
        Vector3 movement = cameraTransform.TransformDirection(movementInputs);
        movement.y = 0;
        movement.Normalize();
        movement *= speed * ((movementInputs.x != 0.0f || movementInputs.z != 0.0f) ? 1.0f : 0.0f);

        // ground check
        if (character.isGrounded)
        {
            // jump
            if (Input.GetKeyDown(KeyCode.Space))
            {
                velocity = character.velocity;
                velocity.y = jumpPower;
            }
        }
        else
        {
            // get back on the ground
            velocity.y += Physics.gravity.y * Time.deltaTime;
            movement.x *= airMultiplier;
            movement.z *= airMultiplier;
        }

        movement += velocity;
        movement += Physics.gravity;
        movement *= Time.deltaTime;

        // move
        character.Move(movement);

        // don't move in the air
        if (character.isGrounded)
            velocity = Vector3.zero;

        // rotate the character
        FaceMovementDirection();
    }


Falls jemand eine zündende Idee hat, wäre ich ihm sehr dankbar :)

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

30.07.2016, 16:25

Hi,

dieser Thread bzw. dieser Post: http://forum.unity3d.com/threads/how-to-…20/#post-894690 sollte dir bei deinem Problem helfen können. :)
WIP Website: kevinheese.de

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

3

31.07.2016, 18:22

Hey,
danke für den Link, leider wird das Ganze so verändert, dass es nicht mehr "richtig" ist. Die Kamera bleibt nun steif immer hinter der Figur, wobei sie sich ja mitbewegen soll und nicht immer nur hinter dem Spieler bleiben soll.

Das Ganze sollte so aussehen:

https://sendvid.com/y8s22rfj

Dabei sieht man ja den Fehler beim Rückwärtslaufen, nur diesen möchte ich gerne beseitigen, ansonsten ist das genau das, wie ichs haben will :)

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

4

31.07.2016, 22:23

Nachtrag:
Ich glaube ich bin auf des Rätsels Lösung gekommen. Das Script

C#-Quelltext

1
2
3
4
5
6
7
8
9
public Transform target;
    public float smoothTime = 0.3f;
    private Vector3 velocity = Vector3.zero;
    void Update()
    {
        Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10));
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
        transform.LookAt(target);
    }


Führt dann zu diesem Verhalten (Kameraentfernung etc. muss noch gemacht werden, aber das sind ja Spielereien)

https://sendvid.com/s5rfb9cj

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

01.08.2016, 09:51

Es gibt übrigens fertige Skripte die solche Dinge lösen können. Du musst mal bei den Assets gucken. Damit sparst du dir vielleicht etwas arbeit.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige