Comecei um novo jogo que não requer mouse, deixando o movimento para o teclado. Eu tentei incorporar 8 direções; para cima, esquerda, direita, direita e assim por diante. No entanto, quando eu pressiono mais de uma tecla de seta, a velocidade de movimento se acumula ( http://gfycat.com/CircularBewitchedBarebirdbat ). Como eu poderia neutralizar isso?
Aqui está parte relevante do meu 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
fonte
fonte
Respostas:
Separe seu código de seleção de direção do código de movimento real.
Direction
verificando quais teclas foram pressionadas. Armazene-o como um vetor unitário (normalizado).Direction
comSpeed
e comDeltaTime
.fonte
Você precisa tomar a soma das direções, normalizar isso e multiplicar pela velocidade.
Respondi tangencialmente a isso como parte da minha resposta a Impedir o movimento diagonal
Especificamente:
fonte
O "vetor de direção normalizada" é como essa tarefa geralmente é abordada e como eu frequentemente a faço, mas ultimamente eu tenho simplesmente pressionado o vetor de movimento resultante. Geralmente, obtém o mesmo resultado final e o código é muito mais simples:
Código mais simples é quase sempre melhor: E
fonte
ClampMagnitude
faz, não é o mesmo código queNormalize * Constant
no disquise?moveSpeed
depois da fixação e possivelmente a mesclaria com a multiplicação pordeltaTime
.