Hallo,
ich versuche eine Steuerung für einen 3D Platformer hinzubekommen. Das funktioniert auch schon recht gut soweit. Ich habe dazu aber noch ein Problem. Nachdem man eine Taste loslässt, setzt sich der Spieler wieder in seine Ursprungsrotation zurück. Habs mal aufgenommen:
https://sendvid.com/1tca5sw5
Die gesamte Steuerung ist recht überschaubar:
|
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
|
private Rigidbody rigid;
private float movementSpeed = 20;
private float jumpPower = 50;
private float gravity = 5;
private float distanceToGround;
private float groundCheckSpacing = 0.1f;
private float smoothRotation = 50;
private float verticalVelocity;
Vector3 movement;
private void Start()
{
rigid = GetComponent<Rigidbody>();
distanceToGround = GetComponent<Collider>().bounds.extents.y + groundCheckSpacing;
}
private void FixedUpdate()
{
if (GroundCheck())
{
verticalVelocity = -gravity;
if (Input.GetButtonDown("Jump"))
{
verticalVelocity = jumpPower;
}
}
else
{
verticalVelocity -= gravity;
}
movement.x = Input.GetAxis("Horizontal") * movementSpeed;
movement.y = verticalVelocity;
movement.z = Input.GetAxis("Vertical") * movementSpeed;
Transform tempTransform = Camera.main.transform;
tempTransform.position = new Vector3(tempTransform.position.x, transform.position.y, tempTransform.position.z);
tempTransform.LookAt(transform);
movement = tempTransform.TransformDirection(movement).normalized * movementSpeed;
rigid.velocity = movement;
if (movement.magnitude != 0)
{
Quaternion targetRotation = Quaternion.LookRotation(new Vector3(movement.x, 0, movement.z));
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, smoothRotation);
}
}
private bool GroundCheck()
{
return Physics.Raycast(transform.position, -Vector3.up, distanceToGround);
}
|
Die Bewegung des Charakters soll also relativ zur Ausrichtung der Kamera errechnet werden.