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