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

06.10.2016, 22:16

Bewegung soll sich zur aktuellen Ausrichtung der Kamera anpassen

Guten Abend,
ich habe mich mal an einer überschaubaren Steuerung versucht, die sich ähnlich zu den alten N64 Spielen verhalten soll. Als neueres Spiel würde ich z.B. das Spiel "Ben and Ed" oder GTA5 etc. nennen. Die Steuerung die ich zusammengebastelt habe regelt über den linken Joystick (oder WASD) die Bewegung des Spielers und zugleich die Rotation. Über den rechten Joystick (bzw. die Maus) kann man die Kamera um den Spieler schwenken.

Die Steuerung gefällt mir sehr gut, leider rätsel ich noch an einer Bedingung, die ich noch nicht eingebaut habe. Guckt man mit dem Spieler grade aus, dreht die Kamera auf der X-Achse um 180 Grad, sodass sie das Gesicht des Spielers anguckt, und bewegt sich vorwärts, läuft der Spieler in die Kamera rein.

Normalerweise müsste der Spieler sodann aber seine Bewegungsrichtung neu ausrichten und von der Kamera "weglaufen".

Da das Ganze möglicherweise schwammig oder ungenau beschrieben wurde habe ich es mal aufgenommen:

https://sendvid.com/q2hy6zrw

Bis 0:28 wird die eigentliche Steuerung gezeigt. Danach schwenke ich die Kamera zur Seite, bewege mich nach vorne, der Spieler läuft also nach links. Eigentlich müsste er hoch laufen, ursprünglich (ohne Kamera) also nach rechts. Schwer zu beschreiben :/ ....

Bei den damaligen Spielen wie z.B. Mario 64 war die Bewegung und die Kameraführung auf einen Joystick gebündelt, sicherlich entspannter aber auch fehleranfälliger. Ich glaube die Nutzung eines 2. Joysticks zur manuellen Bewegung der Kamera ermöglicht eine bessere Umsicht.

Hier mal meine beiden Scripte:

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 class PlayerMovement : MonoBehaviour
{
        private CharacterController controller;
        private float rotationSpeed = 450;
        private float movementSpeed = 8;
        private float jumpPower = 5;
        private float gravity = 10;
        float verticalVelocity = 0;
        private void Start()
        {
                controller = GetComponent<CharacterController>();
        }
        private void Update()
        {
                Vector3 input = new Vector3(Input.GetAxisRaw("LeftJoystickHorizontal"), 0, -Input.GetAxisRaw("LeftJoystickVertical"));
                if (controller.isGrounded)
                {
                        if (Input.GetButton("AButton"))
                        {
                                verticalVelocity = jumpPower;
                        }
                }
                if (input != Vector3.zero)
                {
                        transform.eulerAngles =
                                Vector3.up * Mathf.MoveTowardsAngle(transform.eulerAngles.y,
                                Quaternion.LookRotation(input).eulerAngles.y,
                                rotationSpeed * Time.deltaTime);
                }
                verticalVelocity -= gravity * Time.deltaTime;
                input.y = verticalVelocity;
                controller.Move(input * movementSpeed * Time.deltaTime);
        }
}


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
public class CameraFollow : MonoBehaviour
{
    Transform playerTransform;
    float distance = 10;
    float currentX = 0;
    float currentY = 0;
    float minY = 20;
    float maxY = 70;
    void Start()
    {
            playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
    }
    private void Update()
    {
            currentX += Input.GetAxisRaw("RightJoystickHorizontal");
            currentY += -Input.GetAxisRaw("RightJoystickVertical");
            currentY = Mathf.Clamp(currentY, minY, maxY);
    }
    void LateUpdate()
    {
            Vector3 direction = new Vector3(0, 0, -distance);
            Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);
            transform.position = playerTransform.position + rotation * direction;
            transform.LookAt(playerTransform.position);
    }
}


Vielen Dank für Vorschläge :)

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

2

09.10.2016, 00:58

Hi,

hab grad mal GTAV gestartet und analysiert, wie da das Kamera-Lauf-Verhalten ist. Es ist eigentlich ganz einfach: Mit dem Laufstick oder WASD gibts du an, wie sich der Spieler relativ zur Kamera bewegt. Guckst du in Blickrichtung der Charakters und drückst W, dann läufst du nach vorne. Drückst du D, dann versucht deine Figur nach rechts aus dem Bild zu laufen. Damit das nicht passiert fährt die Kamera im "Anhängermodus" dem Spieler hinterher oder von ihm weg. Wenn die neue Kameraposition und Ausrichtung berechnet ist, dann wird die Laufrichtung wieder relativ zur Kamera angepasst. Wird die Maus oder der Kamerastick bewegt, dann dreht sich die Kamera um den Spieler als Zentrum herum.

Bei dieser Art der Bewegung gibt es also keinerlei Bedingungen. Dein Spieler wird einfach relativ zur Kamerarichtung bewegt, dann wird die Kamera wieder auf korrekten Abstand zum Spieler gebracht und als letztes noch relativ zu dieser Position gedreht - so wie es die Maus oder der Kamerastick angeben. Das Ganze dann in Endlosschleife.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.