Guten Abend,
falls jemand einen ausgeprägten Helferinstinkt besitzt dann bitte ich um eure Hilfe
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
. 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