Page 1 sur 3

[DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 13 Nov 2020 20:43
par adrenachrom
Salut les gens
Petite question anodine mais qui m'embête depuis un moment déjà:
J'ai un script de déplacement très banal sur mon personnage qui utilise le joystick d'une manette. Mais j'ai remarqué un détail très irritant: mon personnage se déplace moins vite en diagonale que sur les côté ou vers l'avant et l'arrière.
En y réfléchissant, ça s'explique assez facilement par le fait que lorsqu'on est en diagonale, les axe x et y ne renvoient pas une valeur maximale comme ils le feraient sur leur axe respectifs. Petite illustration:
Image

J'ai eu beau me triturer les méninges, je ne vois pas comment régler ce souci pour que les valeurs obtenues soient toujours situées dans une fourchette entre 0 et 1.
Auriez-vous quelques conseils?
Merci d'avance :coeur:

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 13 Nov 2020 21:04
par jmhoubre
Tu normalises le vecteur input et tu multiplies par la vitesse. Quelque chose comme :

Code : Tout sélectionner

Vecteur 3 input = new Vector3(Input.GetAxis("Horizontal", 0f, Input.GetAxis("Vertical"));
input.Normalize();
Vecteur3 move = input * speed * Time.DeltaTime;

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 14 Nov 2020 01:26
par adrenachrom
Merci pour ta réponse Jmhoubre
Alors j'ai déjà essayé le normalize mais cette méthode pose un souci, c'est que du coup je perds la variation de vitesse de mon perso puisque la valeur du joystick deviens binaire et ne varie plus entre 0 et 1 :/

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 14 Nov 2020 04:18
par jmhoubre
Montre ton code, ce sera plus simple que de faire des suppositions.

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 14 Nov 2020 07:24
par adrenachrom
Ah ui bien vu, j'aurais dû faire ça dès le début

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{


    private float speed = 4f;
    private Vector3 movement = Vector3.zero;

    private Rigidbody player;

    private void Start()
    {
        player = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        movement = new Vector3(h*speed, 0, v * speed);
        movement.Normalize();
        movement = transform.InverseTransformDirection(movement);


        player.velocity = movement;


    }
}

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 14 Nov 2020 13:18
par jmhoubre
Bonjour,

normaliser, cela veut dire mettre la norme du vecteur à un. Si tu multiplies par speed, et qu'après tu normalises, c'est assez étrange. Mais enfin, tu as peut-être un besoin particulier.

Logiquement, tu devrais récupérer les inputs dans Update, et pas dans le fixedUpdate. A quoi te sers de référencer le composant rigidbody ?

J'essaierai le code dans l'après-midi.

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 14 Nov 2020 16:55
par jmhoubre
Re,

je n'ai pas remarqué que la vitesse sur la diagonale est différente de celle sur les côtés. En fait, elle ne varie (du moins dans le code que tu as fourni). Pour t'en convaincre, ajoute un champ UI Text (GameObject > UI > Text), place le à un endroit de l'écran où il ne te gêne pas, et ajoute ceci dans ton code :

Code : Tout sélectionner

using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
	[SerializeField] private Text rigidbodySpeed = null;

	private void Update ()
	{
	        rigidbodySpeed.text = $"{player.velocity.magnitude.ToString ("0.00")}";
	}
}
En revanche, je confirme ce que j'ai écrit précédemment : ton champ speed à 4f ne sert à rien dans ton code. Passe le en public pour le modifier dans l'inspecteur en mode Play, modifie-le en cours de jeu et observe le comportement de la vitesse du rigidbody affichée à l'écran : elle ne change pas. Tu dois déplacer la multiplication par la vitesse dans la ligne dans laquelle tu modifies la vélocité.

Je te propose le code suivant (j'ai modifié movement en direction, c'est plus cohérent il me semble) :

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
	[SerializeField] private Text rigidbodySpeed = null;
	[SerializeField] private float speed = 4f;

	private Vector3 direction = Vector3.zero;
	private Rigidbody player;

	private void Start ()
	{
		player = GetComponent<Rigidbody> ();        
	}

	private void Update ()
	{
		rigidbodySpeed.text = $"Rigidbody speed : {player.velocity.magnitude.ToString ("0.00")}";

		float h = Input.GetAxis ("Horizontal");
		float v = Input.GetAxis ("Vertical");
		direction = new Vector3 (h, 0, v);
		direction.Normalize ();
		
	        //movement = transform.InverseTransformDirection (movement); Ne sert à rien pour mes tests.
	}

	void FixedUpdate ()
	{
		player.velocity = direction * speed;
	}
}

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 16 Nov 2020 21:46
par adrenachrom
Re,
Merci pour tes réponses et ta correction :)
Alors j'ai testé ta version du code et j'ai toujours le souci dont je parlais plus haut. Pour résumer:

- Si je n'utilises pas NORMALIZE, alors me valeur X n'est pas la même quand elle est pile sur son axe et quand elle est en diagonale ( pareil pour Y bien entendu ). Essaye de vérifier la valeur pure que renvoie le joystick, tu verras par toi-même.

Image

- Si j'utilise NORMALIZE alors du coup la valeur max devient 1 et la valeur mini devient 0, et ça ça fonctionne pour la diagonale MAIS du coup, la valeur ne sera plus que de 0 ou de 1 UNIQUEMENT; je ne peux plus faire varier la vitesse de mon personnage en fonction de la pression sur le joystick ( genre moins le joystick est poussé plus le personnage se déplacera lentement ). Je comprends tout à fait l'utilisation de NORMALIZE mais je pense qu'elle ne résoudra pas mon problème.

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 16 Nov 2020 22:27
par Aelhan
Bonsoir, à mon avis si j'ai bien compris ton problème ce n'est qu'une histoire de trigo, il faut que tu calcules ton angle entre l'axe horizontal des x et la position du joystick, ainsi la valeur que tu veux doit être x*cos(angle) et y*sin(angle). Mais en fait ça revient un peu à ce qu'est censé faire normalize. Pourrais tu essayer de schématiser des exemples de ce que tu voudrais pour différentes position de joystick ? Ce sera sans doute plus facile de se rendre compte de ce que tu veux, mais je pense que seule la trigo a une chance de résoudre ton dilemme

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 16 Nov 2020 23:53
par jmhoubre
Sur ton rigidbody, la case UseGravity est cochée ou décochée ?
Sinon, je ne vois pas trop ce qu'il y a. Chez moi je n'ai pas ce souci, difficile de comprendre ce qui se passe chez toi.