[DB-AL] Reset rotation - C# joystick rotation

Modérateur : Administrateurs Suppléants

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
Dezag
Messages : 4
Inscription : 29 Juin 2018 15:17

[DB-AL] Reset rotation - C# joystick rotation

Message par Dezag » 29 Juin 2018 15:31

Hello,

dans l'optique de création d'un mini jeu, j'ai intégré deux joystick, dont un floating, qui me sert pour la rotation de mon personnage. C'est un TopDown.

Le problème est que mon personnage reset sa rotaion automatiquement, après avoir essayé plusieurs solutions je n'ai toujours pas la solution..

Code : Tout sélectionner

using UnityEngine;

public class rotation_script : MonoBehaviour
{

    protected FloatingJoystick joystick;


    // Use this for initialization
    void Start()
    {

        joystick = FindObjectOfType<FloatingJoystick>();


    }

    // Update is called once per frame
    void Update()
    {

        var rigidbody = GetComponent<Rigidbody2D>();

       // rigidbody.velocity = new Vector2(joystick.Horizontal * 3f, joystick.Vertical * 3f);

        Vector3 lookVec = new Vector3(joystick.Horizontal, joystick.Vertical, 4000);

        transform.rotation = Quaternion.LookRotation(lookVec, Vector3.back);

    }
}
Jespère que vous pourrez m'aider ! :merci:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4651
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par boubouk50 » 29 Juin 2018 15:47

Salut,

Pourquoi 4000 en Z? Cela pourrait avoir une incidence, même si c’est de la 2D. z =0;
Aussi, que retournent joystick.Horizontal et joystick.Vertical? Tu as bien des valeurs comprises entre -1 et 1? (Si elles sont normées)
Y a-t-il une possibilité de conflit avec le rigidBody2D? Je veux dire par là, est-ce que le rigidBody2D contrôle la rotation ailleurs? Ou bien est Freeze sur l'axe Z?

Sinon, tu peux essayer ceci:

Code : Tout sélectionner

Vector3 dir = new Vector3 (joystick.Horizontal, joystick.Vertical, 0);
transform.right = dir.normalized;
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Dezag
Messages : 4
Inscription : 29 Juin 2018 15:17

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par Dezag » 29 Juin 2018 16:16

Utiliser Quaternion est la seule solution que j'ai trouvé pour avoir une rotation correcte.

Avec ta solution tout fonctionne mais j'ai un décalage de 90°, en gros quand je tourne le joystick vers la droite, il s'oriente vers le haut, et de même, vers le bas, il s'oriente vers la droite, etc..
Et je n'ai rien modifié en particulier, ni même touché à l'orientation de mon personnage.

4000 est une valeur élevée permettant de n'avoir aucune déformation sur la rotation, 1000 fonctionne aussi, j'ai juste mis une valeur élevée.

Je ne m'y connais pas encore énormement en programmation C#, notamment en 2D.
Je dois faire des erreurs assez evidentes ! ^^

Il n'ya aucun freeze sur z et aucun script ne modifie la rotation du rigidbody non plus.

La rotation fonctionne tout de même très bien, le problème étant qu'elle se reset à sa position initiale dès que je relache le joystick..

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4651
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par boubouk50 » 29 Juin 2018 16:45

Dezag a écrit :
29 Juin 2018 16:16
La rotation fonctionne tout de même très bien, le problème étant qu'elle se reset à sa position initiale dès que je relache le joystick..
Oui, c'est normal.
Quand tu lâches le joystick, les deux valeurs du joysticks passent à zéro donc la rotation est calculée en fonction de ces valeurs. Il faut tester les valeurs pour éviter cela.

Code : Tout sélectionner

using UnityEngine;

public class rotation_script : MonoBehaviour
{

    protected FloatingJoystick joystick;
    private float delta = 0.01f;

    // Use this for initialization
    void Start()
    {
        joystick = FindObjectOfType<FloatingJoystick>();
    }

    // Update is called once per frame
    void Update()
    {

	if (joystick.Horizontal + joystick.Vertical > delta) { //des valeurs sont renvoyées donc modifications
        	Vector3 lookVec = new Vector3(joystick.Horizontal, joystick.Vertical, 4000);
        	transform.rotation = Quaternion.LookRotation(lookVec, Vector3.back);
        }
    }
}
Je ne sais pas comment fonctionnent les Joysticks, il est possible de supprimer le delta et de le remplacer par 0
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Dezag
Messages : 4
Inscription : 29 Juin 2018 15:17

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par Dezag » 04 Juil 2018 11:09

Super, les rotations ne se font que sur 180° comme ça, j'ai donc rajouté pour une valeur négative et tout fonctionne parfaitement !

Code : Tout sélectionner

if (joystick.Horizontal + joystick.Vertical > delta || joystick.Horizontal + joystick.Vertical < delta)
        { //des valeurs sont renvoyées donc modifications
            Vector3 lookVec = new Vector3(joystick.Horizontal, joystick.Vertical, 1000);
            transform.rotation = Quaternion.LookRotation(lookVec, Vector3.back);
        }
Mon nouveau problème, est maintenant que comme j'agis sur le rigidbody (je pense), dès qu'il y a une collision avec un autre objet, mon personnage se met à tourner sans s'arrêter ! Je cherche une solution actuellement mais si tu as une idée je suis preneur avec plaisir ! :-D

Avec le simple code :

Code : Tout sélectionner

Vector3 lookVec = new Vector3(joystick.Horizontal, joystick.Vertical, 1000);
        transform.rotation = Quaternion.LookRotation(lookVec, Vector3.back);
Le problème n'est plus, mais la rotation se reset du coup !

En tout cas merci pour ton aide ! :merci:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4651
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par boubouk50 » 04 Juil 2018 11:15

Arf, oui, c'est vrai, j'avais oublié...
Pour gérer les valeurs négatives et positives, utilise plutôt la valeur absolue, car un négatif et un positif peuvent s'annuler.

Code : Tout sélectionner

using UnityEngine;

public class rotation_script : MonoBehaviour
{
    protected FloatingJoystick joystick;
    private float delta = 0.01f;

    // Use this for initialization
    void Start()
    {
        joystick = FindObjectOfType<FloatingJoystick>();
    }

    // Update is called once per frame
    void Update()
    {

	if (Mathf.Abs(joystick.Horizontal) + Mathf.Abs(joystick.Vertical) > delta) { //des valeurs sont renvoyées donc modifications
        	Vector3 lookVec = new Vector3(joystick.Horizontal, joystick.Vertical, 1000);
        	transform.rotation = Quaternion.LookRotation(lookVec, Vector3.back);
        }
    }
}
Par contre, concernant la réaction du rigidbody face aux colliders, là c'est plutôt au niveau de ton CharacterController, je pense.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Dezag
Messages : 4
Inscription : 29 Juin 2018 15:17

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par Dezag » 04 Juil 2018 11:35

Parfait, merci beaucoup ! :)

Pour la rotation à la collision c'était juste un oubli de ma part, j'ai juste freeze les rotation en z de mon rigidbody que j'avais enlevé pour les tests de rotation..!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 4651
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] Reset rotation - C# joystick rotation

Message par boubouk50 » 04 Juil 2018 12:24

Problème résolu?

Si c'est le cas, édite le premier message et ajoute [RESOLU] en début de celui-ci pour signaler aux autres membres que la solution est trouvée, stp.
Merci.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « (C#) CSharp »