C# - Rigidbody , mon object s'envole sur une collision

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
dacid
Messages : 9
Inscription : 21 Mars 2014 10:26

C# - Rigidbody , mon object s'envole sur une collision

Message par dacid » 25 Avr 2014 17:04

Bonjour à tous,

En gros, j'ai un hélico qui bouge sur un terrain selon mes pression touches.
Mon hélico à un rigidBody, ainsi que quelques éléments de ma scène.

Code : Tout sélectionner

	void Update () {
        if (Input.GetKey(KeyCode.LeftArrow)) {
            this.transform.rotation *= Quaternion.AngleAxis(speed/5, Vector3.down);
        } else if (Input.GetKey(KeyCode.RightArrow)) {
            this.transform.rotation *= Quaternion.AngleAxis(speed/5, Vector3.up);
        }
        if (Input.GetKey(KeyCode.UpArrow)) {
            this.transform.Translate(0, 0, (Time.deltaTime * speed));
        } else if (Input.GetKey(KeyCode.DownArrow)) {
            this.transform.Translate(0, 0, -(Time.deltaTime * speed));
        }
        if (Input.GetKey(KeyCode.PageUp)) {
            this.transform.position += Vector3.up * Time.deltaTime * speed;
        } else if (Input.GetKey(KeyCode.PageDown)) {
            this.transform.position += Vector3.down * Time.deltaTime * speed;
        }
    }
Dès que l'hélico touche un autre objet, il part en sucette.
Il s'envole et tourne dans tous les sens.

Ce que je veux, c'est qu'il se bloque lors d'une collision, mais qu'il ne bouge plus.

J'ai essayé de cocher et décocher une multitude de chose, mais sans succès.

Pouvez vous m'éclaircir ?

Merci d'avance.

AOBI
Messages : 71
Inscription : 11 Avr 2014 11:13

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par AOBI » 28 Avr 2014 11:32

je suis novice mais je m'amuse sur un sujet similaire
Je vais dire peux être une bêtise sur la méthode qui n'est pas forcément la bonne et voire la seul

Pour mon Quadcopter j'ai fait une sorte de reset de position comme ci dessous :
JS

Code : Tout sélectionner

transform.localRotation = Quaternion.AngleAxis(0, Vector3(1,1,1)); // reset position
ce reset je l'utilise pour qu'il revienne à une position initial l'hors d'inclinaisons
j'édit car le problème qu'engendre ce genre de reset fait tel quel est un genre de sursaut vue qu'il revient pratiquement instantanément à son état d'origine.
J'essaie de lisser le mouvement ci puis-je dire sans grand succès pour le moment

Code : Tout sélectionner

transform.localRotation =  Quaternion.Slerp(transform.localRotation , Quaternion.AngleAxis( 0,  Vector3(1,1,1)),  Time.time *  vitesse );
la doc à un exemple interressant
https://docs.unity3d.com/Documentation/ ... Slerp.html

dacid
Messages : 9
Inscription : 21 Mars 2014 10:26

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par dacid » 28 Avr 2014 13:28

Bonjour AOBI,

Merci pour ta réponse, mais ce n'est pas vraiment ce que je recherche.
Ton script remet ton élément à sa position initiale lors d'une collision, c'est bien ça ?

Moi, je veux que l'élément s’arrête sur une collision. Puis que l'utilisateur puisse faire une marche arrière et on oublie le bobo.

Seulement lorsqu'une collision se produit, mon élément part dans tous les sens et on perd la main dessus.
J'ai essayé de figer les X, Y et Z, mais du coup, il passe au travers de tout. Les collisions ne se font plus.

Faut-il gérer les collisions à la main ?

Avatar de l’utilisateur
Solup
Messages : 249
Inscription : 20 Mars 2013 18:41
Localisation : Toulouse (31)

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par Solup » 28 Avr 2014 14:24

Il faut que tu coches la case isKinematic sur le rigidbody.
Et finit l'objet qui s'envole dans tous les sens.

La doc officielle:
http://docs.unity3d.com/Documentation/C ... dbody.html
Is Kinematic If enabled, the object will not be driven by the physics engine, and can only be manipulated by its Transform. This is useful for moving platforms or if you want to animate a Rigidbody that has a HingeJoint attached.

dacid
Messages : 9
Inscription : 21 Mars 2014 10:26

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par dacid » 28 Avr 2014 14:45

Oui, j'avais essayé de le faire sur l'hélico, mais du coup, il passe au travers de tout.
Les collisions ne se font plus.

AOBI
Messages : 71
Inscription : 11 Avr 2014 11:13

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par AOBI » 28 Avr 2014 15:43

l'exemple avec ma ligne Quaternion slerp ou LocalRotation c'est pas terrible
Par contre l'example de la doc sur le Vector3 Slerp cela décrit un arc de cercle entre le point de départ et le point d' arrivé le centre du cercle étant le milieu des 2 et le tous avec une vitesse d'exécution, je trouve l'effet pas trop mal mais à travailler

Avatar de l’utilisateur
ZeroKcm
Messages : 175
Inscription : 09 Juil 2013 21:16

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par ZeroKcm » 28 Avr 2014 16:02

Si tu veux bloquer ton helico lors d'un événement, il faut par exemple supprimer son rigidbody
Destroy(rigidbody);

Il va s'arrêter net :)

Tu remets ce component lorsque tu voudras remettre sa physique en route. (AddComponent)

dacid
Messages : 9
Inscription : 21 Mars 2014 10:26

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par dacid » 28 Avr 2014 16:11

Bonjour ZeroKcm,

Merci pour ta participation.

Tu veux dire que pour chaque collision, il faut :
- Enlever son rigidBody.
- Le remettre dans un endroit proche ou il n'y a plus de collision.
- Le remettre d'aplomb.
- Remettre le rigidBody.

Ca me parait compliqué... Je veux un comportement d'hélico standard, sauf qu'il n'est pas américain, il n'explose pas dès qu'il rencontre le moindre objet.
Et qu'il reste droit.

C'est si hors normé ?

Avatar de l’utilisateur
Solup
Messages : 249
Inscription : 20 Mars 2013 18:41
Localisation : Toulouse (31)

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par Solup » 28 Avr 2014 16:24

C'est normal, le rigidbody te permet de faire de la physique (collision) via le moteur physique de unity.
En cochant le isKinematic, tu "désactives" le calcul de physique sur ton rigidbody, donc normal que ton hélico passe à travers.
Il te faut un collider (box/sphere/etc...) en plus de ton rigidbody.

Moi par exemple, j'ai une "caisse" qui me sert de plateforme (qui se déplace). Sur cette caisse, j'ai un BoxCollider, qui me permet de détecter les collisions ainsi qu'un Rigidbody avec isKinematic de coché. Les collisions sont détectées et la caisse ne vole pas dans tous les sens au moment de l'impact.

Après du côté de ton helicopter bien entendu tu dois avoir de quoi détecter une collision (Collider ou CharacterController, voir un mix des 2).

Ah et pour information, pour déplacer un "personnage" (comme ton hélicopter), mieux vaut utiliser le CharacterController et sa fonction Move() / SimpleMove() que faire des translate:
https://docs.unity3d.com/Documentation/ ... oller.html
https://docs.unity3d.com/Documentation/ ... .Move.html

dacid
Messages : 9
Inscription : 21 Mars 2014 10:26

Re: C# - Rigidbody , mon object s'envole sur une collision

Message par dacid » 28 Avr 2014 17:08

Merci, Je vais regarder ça en profondeur.

Mais mon hélico a bien un collider qui est un représenté par un rectangle qui l'englobe.

Pour les déplacements, c'est un peu plus compliqué qu'un personnage car il y a un 3ème axe...

Répondre

Revenir vers « (C#) CSharp »