J'ai commencé un nouveau jeu qui ne nécessite pas de souris, laissant ainsi le mouvement au clavier. J'ai essayé d'incorporer 8 directions; haut, gauche, droite, haut-droite et ainsi de suite. Cependant, lorsque j'appuie sur plusieurs touches fléchées, la vitesse de déplacement se cumule ( http://gfycat.com/CircularBewitchedBarebirdbat ). Comment pourrais-je contrer cela?
Voici la partie pertinente de mon code:
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
la source
la source
Réponses:
Séparez votre code de sélection de direction du code de mouvement réel.
Direction
en vérifiant quelles touches sont enfoncées. Stockez-le en tant que vecteur unitaire (normalisé).Direction
avecSpeed
et avecDeltaTime
.la source
Vous devez prendre la somme des directions, normaliser cela, puis multiplier par la vitesse.
J'ai répondu tangentiellement à cela dans le cadre de ma réponse à Empêcher les mouvements diagonaux
Plus précisément:
la source
Le «vecteur de direction normalisé» est la façon dont cette tâche est généralement abordée et la façon dont je le fais souvent, mais dernièrement, j'ai simplement bloqué le vecteur de mouvement résultant. Il obtient généralement le même résultat final et le code est beaucoup plus simple:
Un code plus simple est presque toujours meilleur: E
la source
ClampMagnitude
, n'est-ce pas le même code queNormalize * Constant
dans Disquise?moveSpeed
après le serrage et éventuellement le fusionnerais avec la multiplication pardeltaTime
.