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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 13 Nov 2020 20:43

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:
Dernière édition par adrenachrom le 17 Nov 2020 10:58, édité 1 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 320
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 13 Nov 2020 21:04

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;

adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 14 Nov 2020 01:26

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 :/

Avatar de l’utilisateur
jmhoubre
Messages : 320
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 14 Nov 2020 04:18

Montre ton code, ce sera plus simple que de faire des suppositions.

adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 14 Nov 2020 07:24

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;


    }
}

Avatar de l’utilisateur
jmhoubre
Messages : 320
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 14 Nov 2020 13:18

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.

Avatar de l’utilisateur
jmhoubre
Messages : 320
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 14 Nov 2020 16:55

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;
	}
}

adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 16 Nov 2020 21:46

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.

Aelhan
Messages : 98
Inscription : 11 Déc 2019 23:00

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

Message par Aelhan » 16 Nov 2020 22:27

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
Celui qui pose une question risque cinq minutes d'avoir l'air bête.
Celui qui ne pose pas de question restera bête toute sa vie.

Avatar de l’utilisateur
jmhoubre
Messages : 320
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 16 Nov 2020 23:53

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.

Répondre

Revenir vers « (C#) CSharp »