[RESOLU] [DB-AL]_Rotation d'un volant d'un véhicule

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
Sam00
Messages : 26
Inscription : 07 Nov 2016 18:05

[RESOLU] [DB-AL]_Rotation d'un volant d'un véhicule

Message par Sam00 » 04 Fév 2017 19:15

Bonjour,

J'ai un volant d'un véhicule que j'ai paramétré pour qu'il tourne sur son axe Z selon si on appuie sur les flèches droite et gauche du clavier, et qui se remet a son état d'origine quand on appuie plus sur les touches (GetKeyUp).

Voici mon code jusqu'à présent:


Code : Tout sélectionner

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

public class Volant : MonoBehaviour {

    public float speed;


    void Start()
    {

    }

    void Update()
    {

        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(Vector3.forward * speed * Time.deltaTime);
        
        else if (Input.GetKeyUp(KeyCode.LeftArrow))

            transform.localRotation = Quaternion.Euler(0, -25, 90);

        if (Input.GetKey(KeyCode.RightArrow))
            transform.Rotate(-Vector3.forward * speed * Time.deltaTime);

        else if (Input.GetKeyUp(KeyCode.RightArrow))

            transform.localRotation = Quaternion.Euler(0, -25, 90);
    }
}
En l'état, ça fonctionne. Enfin je peux tourner mon volant et définir sa vitesse de rotation.

Sauf que quand je n'appuie plus sur les touches, mon volant se remet directement dans sa position initiale, sans transition (logique vu le code). Hors, je voudrais qu'on le voit tourner jusqu'à revenir dans son orientation d'origine (comme un vrai volant en fait).

J'essaie d'utiliser quaternion.identity (pour définir les valeurs de rotations initiale de mon volant), ou un quelconque moyen d'utiliser ma variable speed pour faire tourner mon volant quand je retire mon doigt du mon clavier, mais rien n'y fait.... Un petit coup de main serait le bienvenue ;)

:!: Attention à la section où vous postez. :!:
et Les balises code SVP :!:
Merci de lire la Netiquette.
Dernière édition par Sam00 le 08 Fév 2017 12:08, édité 1 fois.

Sam00
Messages : 26
Inscription : 07 Nov 2016 18:05

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par Sam00 » 04 Fév 2017 19:58

En utilisant "Input.gyro.attitude" a la place des coordonnées de mon volant peut etre ?

alex.eu
Messages : 15
Inscription : 19 Fév 2016 19:40

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par alex.eu » 05 Fév 2017 02:20

ou alors utiliser Mathf.Lerp ou Vector3.Lerp ou Quaternion.Slerp
Nan! Sans dec !

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par Max » 05 Fév 2017 11:46

alex.eu a écrit :ou alors utiliser Mathf.Lerp ou Vector3.Lerp ou Quaternion.Slerp
on peut ajouter aussi Mathf.LerpAngle par exemple...
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Sam00
Messages : 26
Inscription : 07 Nov 2016 18:05

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par Sam00 » 08 Fév 2017 11:00

Merci pour vos suggestions, j'ai essayé toutes les options, sans résultat. Mon volant se remet bien dans sa position initiale, mais directement. Dès que je relâche le bouton, il revient a sa rotation originale instantanément. Je ne suis pas bien sûr de bien comprendre comment on applique une vitesse a une rotation

Ici "speed" est la vitesse de rotation du volant quand on le tourne, "retourspeed" la vitesse de rotation du volant quand on le relache. J'ai crée une copie du volant en rotation (0,0,0) que j'ai mis dans le slot "Target", et auquel j'ai effacé le "mesh renderer" (il me sert uniquement a définir la position initiale du volant).

J'ai utilisé ici Quaternion.RotateTowards, j'ai avant tout essayé toutes vos propositions, mais dans ces cas là le resultat était identique.

Code : Tout sélectionner

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

public class Volant : MonoBehaviour
{

    public float speed;
    public float retourspeed;
    public Transform target;


    // Use this for initialization
    void Start()
    {


    }
    // Update is called once per frame
    void Update()
    {
        float step = retourspeed * Time.deltaTime;

        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(Vector3.forward * speed * Time.deltaTime);

        else if (Input.GetKeyUp(KeyCode.LeftArrow))


            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);


        if (Input.GetKey(KeyCode.RightArrow))
            transform.Rotate(-Vector3.forward * speed * Time.deltaTime);

        else if (Input.GetKeyUp(KeyCode.RightArrow))

            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);

    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par boubouk50 » 08 Fév 2017 11:17

Code : Tout sélectionner

if (Input.GetKeyUp(KeyCode.LeftArrow))
            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);
Documentation:
Returns true during the frame the user releases the key identified by name
Retourne Vrai pendant la frame ou la touche est relâchée.
Tu n'entreras dans cette boucle donc une seule fois à la relâche. Il te faudrait surement enlever cette condition (ne garder que le else) pour que le Lerp se fasse sur plusieurs frames.
"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

Sam00
Messages : 26
Inscription : 07 Nov 2016 18:05

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par Sam00 » 08 Fév 2017 11:59

Super ! C'est exactement ça ! Il faut juste enlever le GetKeyUp. Merci Beaucoup !

Code : Tout sélectionner

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

public class Volant : MonoBehaviour
{

    public float speed;
    public float retourspeed;
    public Transform target;


    // Use this for initialization
    void Start()
    {


    }
    // Update is called once per frame
    void Update()
    {
        float step = retourspeed * Time.deltaTime;

        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(Vector3.forward * speed * Time.deltaTime);

        else 


            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);


        if (Input.GetKey(KeyCode.RightArrow))
            transform.Rotate(-Vector3.forward * speed * Time.deltaTime);

        else 

            transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, step);

    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL]_Rotation d'un volant d'un véhicule

Message par boubouk50 » 08 Fév 2017 12:00

Nickel.
Si le problème est résolu, édite le titre du premier message et ajoute [RESOLU] au début stp.
"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

Sam00
Messages : 26
Inscription : 07 Nov 2016 18:05

Re: [RESOLU] [DB-AL]_Rotation d'un volant d'un véhicule

Message par Sam00 » 08 Fév 2017 12:08

Voilà qui est fait ;) Merci encore !

Répondre

Revenir vers « (C#) CSharp »