[MY-AL] Véhicule incontrôlable

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
Avatar de l’utilisateur
Diridium
Messages : 24
Inscription : 11 Jan 2018 10:21

[MY-AL] Véhicule incontrôlable

Message par Diridium » 15 Jan 2018 12:07

Bonjour,

Je crée un topic ici car j'ai un petit problème avec mon véhicule (gameObject) dans ma scène.
J'avais créé un script pour déplacer un véhicule (avec rotation des mesh de roues et des colliders) qui fonctionne très bien sur le premier véhicule mais j'ai voulu le réutiliser (après l'avoir modifié) sur un autre véhicule mais là il y a un hic..
Les mesh des roues ont des trajectoires incompréhensibles et le véhicule ne bouge pas. J'avais déjà eu ce problème et j'avais réussi à le contourner mais là rien n'y fait, ça ne marche pas. Si quelqu'un pourrait m'éclairer sur ce problème ça serait sympa ^^

Voici mon script :

Code : Tout sélectionner

using UnityEngine.UI;
using UnityEngine;

public class CarControllerBS : MonoBehaviour
{

    public GameObject combine;
    public Text TxtSpeed;
    public WheelCollider front_left;
    public WheelCollider front_right;
    public WheelCollider back_left;
    public WheelCollider back_right;

    public Transform FL;
    public Transform FR;
    public Transform BL;
    public Transform BR;

    public float Torque = 20000;
    public float Speed;
    public float MaxSpeed = 40f;
    public int Brake = 10000;
    public float CoefAcceleration = 5f;
    public float WheelAngleMax = 10f;
    public bool Freinage = false;

    void Start()
    {
        //Réglage du centerOfMass
        GetComponent<Rigidbody>().centerOfMass = new Vector3(0f, -3f, 0f);
    }

    void Update()
    {

        //Son du moteur
        combine.GetComponent<AudioSource>().pitch = Speed / MaxSpeed + 1f;

        //Affichage de la vitesse
        Speed = GetComponent<Rigidbody>().velocity.magnitude * 3.6f;
        TxtSpeed.text = "Vitesse (km/h): " + (int)Speed;

        //Acceleration
        if (Input.GetKey(KeyCode.UpArrow) && Speed < MaxSpeed)
        {
            if (!Freinage)
            {
                front_left.brakeTorque = 0;
                front_right.brakeTorque = 0;
                back_left.brakeTorque = 0;
                back_right.brakeTorque = 0;
                front_left.motorTorque = Input.GetAxis("Vertical") * Torque * CoefAcceleration * Time.deltaTime;
                front_right.motorTorque = Input.GetAxis("Vertical") * Torque * CoefAcceleration * Time.deltaTime;
            }
        }

        //Décélération
        if (!Input.GetKey(KeyCode.UpArrow) && !Freinage || Speed > MaxSpeed)
        {
            front_left.motorTorque = 0;
            front_right.motorTorque = 0;
            back_left.brakeTorque = Brake * CoefAcceleration * Time.deltaTime;
            back_right.brakeTorque = Brake * CoefAcceleration * Time.deltaTime;
        }

        //Direction du véhicule
        back_left.steerAngle = Input.GetAxis("Horizontal") * WheelAngleMax;
        back_right.steerAngle = Input.GetAxis("Horizontal") * WheelAngleMax;

        //Freinage
        if (Input.GetKey(KeyCode.DownArrow))
        {
            Freinage = true;
            back_left.brakeTorque = Mathf.Infinity;
            back_right.brakeTorque = Mathf.Infinity;
            front_left.brakeTorque = Mathf.Infinity;
            front_right.brakeTorque = Mathf.Infinity;
            front_left.motorTorque = 0;
            front_right.motorTorque = 0;
        }
        else
        {
            Freinage = false;
        }

        //Marche arrière
        if (Input.GetKey(KeyCode.V) && !Freinage && Speed < MaxSpeed)
        {
            MaxSpeed = 40f;
            Torque = -10000;
            front_left.brakeTorque = 0;
            front_right.brakeTorque = 0;
            back_left.brakeTorque = 0;
            back_right.brakeTorque = 0;
            front_left.motorTorque = Input.GetAxis("Vertical") * Torque * CoefAcceleration * Time.deltaTime;
            front_right.motorTorque = Input.GetAxis("Vertical") * Torque * CoefAcceleration * Time.deltaTime;
        }
        else
        {
            Torque = 20000;
        }

        //Rotation des roues
        FL.Rotate(front_left.rpm / 60 * 360 * Time.deltaTime, 0, 0);
        FR.Rotate(front_right.rpm / 60 * 360 * Time.deltaTime, 0, 0);
        BL.Rotate(back_left.rpm / 60 * 360 * Time.deltaTime, 0, 0);
        BR.Rotate(back_right.rpm / 60 * 360 * Time.deltaTime, 0, 0);

        //SteerAngle (Rotation des mesh des roues)
        BL.localEulerAngles = new Vector3(BL.localEulerAngles.x, back_left.steerAngle - BL.localEulerAngles.z, BL.localEulerAngles.z);
        BR.localEulerAngles = new Vector3(BR.localEulerAngles.x, back_right.steerAngle - BR.localEulerAngles.z, BR.localEulerAngles.z);

    }
}
(Les véhicule en question à une direction arrière)

https://imgur.com/a/9i9rW

Vous pouvez voir sur ce screen que les roues se téléportent n'importe où..

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

Re: [MY-AL] Véhicule incontrôlable

Message par boubouk50 » 15 Jan 2018 12:18

Est-ce que le setup de ton véhicule est exactement le même que le précédent?
Il faut que les pivots et axes soient identiques.
As-tu également renseigné correctement les variables publiques depuis l'Inspector?
"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

Avatar de l’utilisateur
Diridium
Messages : 24
Inscription : 11 Jan 2018 10:21

Re: [MY-AL] Véhicule incontrôlable

Message par Diridium » 15 Jan 2018 12:20

J'ai recréé des wheels colliders pour le deuxième véhicule car les roues n'ont pas les mêmes dimensions et j'ai changé toutes les variables public. Par contre dans le premier véhicule il y avait 1 mesh par roue or là, j'ai créé des groupes de mesh (il en a plusieurs dizaines) pour chaque roue. Je ne sais pas si ça à une incidence sur le script.

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

Re: [MY-AL] Véhicule incontrôlable

Message par boubouk50 » 15 Jan 2018 12:48

Ce qu'il faut, c’est le même setup pour les parties scriptées. Scale, Pivots, etc. Le même Rig.
Comme tu fais une rotation en fonction du WheelCollider pour chaque roue, il faut qu'elles soient bien en face avec les axes dans le même sens, sinon tu feras une rotation selon un axe différent et un pivot différent, ça ne peut donc pas marcher correctement.
"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

Avatar de l’utilisateur
Diridium
Messages : 24
Inscription : 11 Jan 2018 10:21

Re: [MY-AL] Véhicule incontrôlable

Message par Diridium » 15 Jan 2018 13:21

Je confirme que tout est bien en place, les mesh, les colliders tout est bien dans le bon axe.
En revanche, j'ai remarqué qu'il ne faut pas mettre de rigidbody sur les wheel collider normalement.
Donc je les ait enlevés et maintenant le véhicule avance (même si les roues partent où elles veulent).
J'ai mis des rigidbody car sinon les wheel colliders sont placés dans le mauvais axe et j'ai fait ça pour pouvoir leur faire faire une rotation.

https://imgur.com/a/KKnWS

Sur le screen on voit que les wheel colliders n'ont pas la bonne rotation :/

Est-ce que je ne devrais pas plutôt tourner le véhicule et replacer le tout en fonction de la position des wheel colliders ?

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [MY-AL] Véhicule incontrôlable

Message par Farstone » 25 Jan 2018 21:57

Essaie en regroupant les mesh de la roue en 1 objet dans ton logiciel 3D.

Répondre

Revenir vers « (C#) CSharp »