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

05.07.2016, 22:24

Unity "Helfer" gesucht

Guten Abend,

falls jemand einen ausgeprägten Helferinstinkt besitzt dann bitte ich um eure Hilfe :P

Ich bin hobbymäßig grade an einem Unity 3D-Platformer dran, der momentane Stand der Dinge sieht so aus:

http://sendvid.com/qdvf2dqq

Der Charakter wird über einen XBox360 Controller gesteuert und kann neben dem Laufen auch schießen (wie in dem Video zu sehen). Über den linken Joystick wird die Figur bewegt über den rechten Joystick ausgerichtet/gedreht, die Kamera bewegt sich dabei dann mit. Hoch und runter guckt man dann über ein ein Kopf-Objekt.

Da ich gerne ein Spiel im N64-Stil machen möchte, ist die Steuerung natürlich noch falsch, damals gab es ja auch nur 1 Joystick, der das Ganze geregelt hat.

Nun sieht man Script für die Steuerung erstmal so aus:

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
  public class Spieler : MonoBehaviour
{
    // Bewegungsgeschwindigkeit
    public float bewegungsGeschwindigkeit = 12f;

    // horizontale Rotationsgeschwindigkeit
    public float rotationsGeschwindigkeitHorizontal = 1.7f;

    // Sprunggeschwindigkeit
    private float vertikaleSprungBeschleunigung = 0;

    // Sprunggeschwindigkeit
    public float sprungGeschwindigkeit = 15.0f;

    // Schwerkraft
    public float schwerkraft = 30.0f;

    // Referenz zum CharacterController
    private CharacterController controller;

    // Bewegungsbeschleuningung
    private Vector3 bewegungsBeschleunigung = Vector3.zero;

    // Kopf des Spielers
    public Transform spielerKopf;

    // vertikale Rotationsgeschwindigkeit
    private float rotationsGeschwindigkeitVertikal = 0.5f;

    // maximale Kopfdrehung vertikal
    public float maxKopfdrehungvertikal = 20.0f;

    // minimale Kopfdrehung vertikal
    public float minKopfdrehungvertikal = -20.0f;

    // aktuelle Kopfdrehung vertikal
    private float aktuelleKopfdrehungVertikal = 0;

    // Prüft, ob nochmal gesprungen werden kann
    bool kannDoppeltSpringen = false;

    // Wird nur beim Start des Skriptes aufgerufen
    private void Start()
    {
        // Referenz zum CharacterController
        controller = GetComponent<CharacterController>();
    }

    // Wird bei jedem Frame aufgerufen
    private void Update()
    {
        // Rotationsinputs
        Vector2 rotationsVektor = new Vector2(Input.GetAxis("RightJoystickHorizontal"), -Input.GetAxis("RightJoystickVertical"));

        // Bodenprüfung
        if (controller.isGrounded)
        {
            // Spieler bewegen
            bewegungsBeschleunigung = transform.TransformDirection(new Vector3(Input.GetAxisRaw("LeftJoystickHorizontal"), 0, -Input.GetAxisRaw("LeftJoystickVertical"))) * bewegungsGeschwindigkeit;
            // Spieler soll sich in der Luft nicht bewegen können
            vertikaleSprungBeschleunigung = 0;
            // Springen
            if (Input.GetButtonDown("XButton"))
            {
                // Sprunggeschwindigkeit
                vertikaleSprungBeschleunigung = sprungGeschwindigkeit;
                // Kann nochmal springen
                kannDoppeltSpringen = true;
            }
        }
        // Spieler in der Luft
        else if (!controller.isGrounded)
        {
            // Doppelsprung
            if (Input.GetButtonDown("XButton") && kannDoppeltSpringen)
            {
                // Sprunggeschwindigkeit
                vertikaleSprungBeschleunigung = sprungGeschwindigkeit;
                // Kann nicht mehr doppelt springen
                kannDoppeltSpringen = false;
            }
        }

        // Kopf vertikal rotieren
        aktuelleKopfdrehungVertikal = Mathf.Clamp(aktuelleKopfdrehungVertikal + rotationsVektor.y * rotationsGeschwindigkeitVertikal, minKopfdrehungvertikal, maxKopfdrehungvertikal);
        spielerKopf.localRotation = Quaternion.identity;
        spielerKopf.Rotate(Vector3.left, aktuelleKopfdrehungVertikal);

        // Schwerkraft in der Bewegung
        vertikaleSprungBeschleunigung -= schwerkraft * Time.deltaTime;

        // Spieler drehen
        transform.Rotate(Vector3.up, rotationsVektor.x * rotationsGeschwindigkeitHorizontal);

        // Bewegung und vertikale Bewegung zusammenführen
        Vector3 beschleunigung = bewegungsBeschleunigung + vertikaleSprungBeschleunigung * Vector3.up;

        // Spieler Bewegen
        controller.Move(beschleunigung * Time.deltaTime);
    }
}


Nun zu meiner eigentlichen Frage. Ich bin auf der Suche nach einem erfahrenen Unityexperten, der Lust hätte, mir bei meinem Problem zu helfen, die Steuerung des Spielers so umzubasteln, dass das Endergebnis folgenden Beispielen ähneln würde:

Super Mario 64 Klon in Unity
https://www.youtube.com/watch?v=N10nzviJQZc

Spyro 1
https://www.youtube.com/watch?v=nxGo7bToqrs

Banjo Kazooie
https://www.youtube.com/watch?v=mHA3Rqhxl8Q

Ratchet and Clank
https://www.youtube.com/watch?v=E5uD_qaF41c

Ziel ist es, das sich der Spieler über einen Joystick bewegt und gleichzeitig ausrichtet, auch die Kamera soll sich dementsprechend ausrichten.

Natürlich gibt es genügend Tutorials im Internet, diese sind aber alle nicht so, wie ich denke, wie es sein müsste :D. Bzw. manche habe ich nachgebaut und die waren nicht richtig.

Das einzige Tutorial was meiner Meinung nach das richtige ist, wäre diese Tutorialreihe hier:

https://www.youtube.com/watch?v=b0PvJ4AW…Z-x&spfreload=5

Leider werden hier vorgefertigte Assets importiert und das Script bezieht sich auf Animationen, die damit angesprochen werden und die ich nicht habe, da ich erstmal die Grundfunktionen haben möchte und mich hinterher ans Modellieren mache, also auch leider hier nicht hilfreich für mich.

Da ich ja schon etwas vorzuweisen habe, und dieses gerne nur "richtig" umbasteln möchte, bin ich auf der Suche nach jemandem, der so viel Zeit hat, das Ganze mal mit mir durchzugehen.

Ob man das über Discord bequatscht oder anders, kann man ja schauen :)

Wäre cool wenn jemand Lust hat und sich melden würde :thumbsup:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.07.2016, 12:00

War es nicht so dass man sich mit dem Joystick in Abhängigkeit der Kamerarotation bewegt, die Kamerarotation selbst dann aber mit den Schultertasten bestimmt? Hast du den Ansatz mal versucht umzusetzen? Fang doch erst mal damit an die Kamerarotation selbst statisch zu belassen. Aktuell scheint die sich ja der Bewegung her anzupassen. Das ganze muss dann eben genau umgekehrt passieren. Als grundlegendes Koordinatensystem für die Bewegung müsstest du dann das Koordinatensystem der Kamera verwenden. Die Bewegung rechnest du dann in das Weltkoordinatensystem um. Soweit ich weiß hat Unity die Funktionalität dafür schon gegeben. Danach kannst du dich dann daran machen die Kamerarotation selbst zu steuern.
„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.“

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

3

08.07.2016, 14:04

Danke für den Ansatz. Ich versuche die Kamera momentan erst einmal wegzulassen und mich auf die reine Steuerung zu konzentrieren.

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

4

08.07.2016, 14:19

Folgendes habe ich mal in einem Testprojekt gebastelt, ich denke dieses Script sollte der SuperMario / Spyro Steuerung einigermaßen nahe kommen :)

Die Bewegungssteuerungen in der Update Methode werden noch angepasst, damit mans mit dem Controller spielen kann.

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
public float bewegungsGeschwindigkeit = 10;

    public GameObject richtungsObjekt;

    void Update()
    {
        if (Input.GetKey(KeyCode.A))
        {
            Bewegen(Vector3.left);
        }
        if (Input.GetKey(KeyCode.D))
        {
            Bewegen(Vector3.right);
        }
        if (Input.GetKey(KeyCode.W))
        {
            Bewegen(Vector3.forward);
        }
        if (Input.GetKey(KeyCode.S))
        {
            Bewegen(Vector3.back);
        }
    }

    void Bewegen(Vector3 richtung)
    {
        Vector3 neueRichtung = Quaternion.LookRotation(Camera.main.transform.position - transform.position).eulerAngles;
        neueRichtung.x = 0;
        neueRichtung.z = 0;
        richtungsObjekt.transform.rotation = Quaternion.Euler(neueRichtung);
        transform.Translate(-richtung * Time.deltaTime * bewegungsGeschwindigkeit, richtungsObjekt.transform);

        Quaternion neueRotation = Quaternion.LookRotation(-richtung);
        transform.rotation = Quaternion.Slerp(transform.rotation, neueRotation * richtungsObjekt.transform.rotation, Time.deltaTime * 8);
    }

Werbeanzeige