Hi,
bei einem Unityspiel versuche ich die Steuerung an den alten Spielen Super Mario 64, Spyro, etc. anzulehnen. Die Kamera folgt dem Spieler und richtet sich relativ aus, damit man bei der Rotation auch direkt die Hindernisse ins Sichtfeld bekommt, damit man reagieren kann. Dreht man sich aber um 180 Grad und läuft quasi mit der Figur zu sich selbst hin, fängt die Kamera an zu ruckeln, da sie sich nicht mitdreht. Laufe ich aber schräg oder seitlich kann sie sich noch passend drehen.
Hier einmal das Video dazu:
https://sendvid.com/aquy54le
Das Kamerascript fällt momentan recht kurz aus, da ich bis aufs Rückwärtslaufen ja schon den gewünschten Effekt bekomme
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public GameObject target;
public float damping = 1;
Vector3 offset;
void Start()
{
offset = target.transform.position - transform.position;
}
void LateUpdate()
{
float currentAngle = transform.eulerAngles.y;
float desiredAngle = target.transform.eulerAngles.y;
float angle = Mathf.LerpAngle(currentAngle, desiredAngle, Time.deltaTime * damping);
Quaternion rotation = Quaternion.Euler(0, angle, 0);
transform.position = target.transform.position - (rotation * offset);
transform.LookAt(target.transform);
}
|
Falls es an einer fehlerhaften Steuerung liegen sollte, wovon ich nicht ausgehe, da ich mich ohne Kamerascript problemlos frei bewegen und rotieren kann, hier noch das Script, womit die Figur gesteuert wird:
|
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
102
103
104
105
106
107
108
109
|
// movementSpeed
public float speed = 5;
// jumpSpeed
public float jumpPower = 15;
// multiplier while jumping
public float airMultiplier = 0.25f;
// rotating
protected float rotationSpeed = 450.0f;
// camera object
public Transform cameraTransform;
// velocity
private Vector3 velocity;
// character
private Transform thisTransform;
// char Controller
private CharacterController character;
// character transform
private Transform characterTransform;
// Starting Point
void Start()
{
// Reference
thisTransform = GetComponent<Transform>();
// Reference
character = GetComponent<CharacterController>();
// Reference
characterTransform = character.transform;
}
// Character Look Direction
void FaceMovementDirection()
{
// direction to look
Vector3 targetDirection = character.velocity;
targetDirection.y = 0.0f;
// direction to move
Vector3 moveDirection = characterTransform.forward;
// rotate
if (targetDirection != Vector3.zero)
{
moveDirection = Vector3.RotateTowards(moveDirection, targetDirection, rotationSpeed * Mathf.Deg2Rad * Time.deltaTime, 1000);
moveDirection = moveDirection.normalized;
thisTransform.forward = moveDirection;
}
}
void Update()
{
// inputs
Vector3 movementInputs = new Vector3(0, 0, 0);
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
movementInputs.z = 1.0f;
}
else if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
movementInputs.z = -1.0f;
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{
movementInputs.x = -1.0f;
}
else if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{
movementInputs.x = 1.0f;
}
// movement
Vector3 movement = cameraTransform.TransformDirection(movementInputs);
movement.y = 0;
movement.Normalize();
movement *= speed * ((movementInputs.x != 0.0f || movementInputs.z != 0.0f) ? 1.0f : 0.0f);
// ground check
if (character.isGrounded)
{
// jump
if (Input.GetKeyDown(KeyCode.Space))
{
velocity = character.velocity;
velocity.y = jumpPower;
}
}
else
{
// get back on the ground
velocity.y += Physics.gravity.y * Time.deltaTime;
movement.x *= airMultiplier;
movement.z *= airMultiplier;
}
movement += velocity;
movement += Physics.gravity;
movement *= Time.deltaTime;
// move
character.Move(movement);
// don't move in the air
if (character.isGrounded)
velocity = Vector3.zero;
// rotate the character
FaceMovementDirection();
}
|
Falls jemand eine zündende Idee hat, wäre ich ihm sehr dankbar