Comencé un nuevo juego que no requiere mouse, dejando así el movimiento hasta el teclado. He intentado incorporar 8 direcciones; arriba, izquierda, derecha, arriba-derecha, etc. Sin embargo, cuando presiono más de una tecla de flecha, la velocidad de movimiento se acumula ( http://gfycat.com/CircularBewitchedBarebirdbat ). ¿Cómo podría contrarrestar esto?
Aquí está la parte relevante de mi código:
var speed : int = 5;
function Update () {
if (Input.GetKey(KeyCode.UpArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
}
if (Input.GetKey(KeyCode.DownArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
unity
javascript
movement
eren_tetik
fuente
fuente
Respuestas:
Separe su código de selección de dirección del código de movimiento real.
Direction
marcando qué teclas se presionan. Almacénelo como un vector unitario (normalizado).Direction
conSpeed
y conDeltaTime
.fuente
Debe tomar la suma de las direcciones, normalizar eso y luego multiplicar por la velocidad.
Respondí tangencialmente esto como parte de mi respuesta a Prevenir el movimiento diagonal
Específicamente:
fuente
El "vector de dirección normalizado" es la forma en que generalmente se aborda esta tarea, y cómo lo hago a menudo, pero últimamente simplemente he estado sujetando el vector de movimiento resultante. Por lo general, logra el mismo resultado final y el código es mucho más simple:
El código más simple es casi siempre mejor: E
fuente
ClampMagnitude
, no es el mismo código queNormalize * Constant
en el disfraz?moveSpeed
después de la fijación y posiblemente lo fusionaría con la multiplicación pordeltaTime
.