CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Unity : problème de collision

grimmjow_13
grimmjow_13
Niveau 9
08 juin 2013 à 18:55:57

Je m'initie actuellement à Unity et je galère depuis plusieurs minutes sur un problème de collision tout bête (la honte :snif: ...).

Voilà la situation :

La scène possède une salle créée sur Maya et importée sur Unity (pour l'instant, il ne s'agit que d'un cube avec la face supérieure (le "toit") retirée. La salle possède un Mesh Collider.
Dans cette salle, il y a le personnage, représenté pour l'instant par un Cube créé cette fois-ci sur Unity. Le cube possède un Box Collider (Is Trigger coché), un Rigid Body (Use Gravity et Is Kinematic décochés) et un script. Dans ce script, je détecte l'appui sur les flèches directionnelles pour faire se déplacer le Cube.
Le cube représente le personnage Joueur mais la vue est fixe (liée à une caméra braquée sur la salle).

J'aimerais que mon personnage ne puisse pas travers les murs de la salle quand il se déplace.
J'ai au début ajouté la fonction "OnTriggerEnter(Collider collider)" dans le script du Cube. La collision avec les murs de la salle sont bien détectées. Le problème, c'est que l'information de collision seule ne me suffit pas: il me faut aussi la direction de la collision, car il faut que quand le personnage touche un mur, il ne puisse plus se déplacer en direction de ce mur mais puisse encore se déplacer en s'éloignant ou en longeant le mur. Or un objet de type Collider ne contient pas cette information de direction de collision.
Après avoir fait quelques recherches, il semble qu'il faille utiliser non pas "OnTriggerEnter" mais "OnCollisionEnter" qui prend en entrée un object Collision (et non Collider) contenant notamment des ContactPoints. J'ai remplacé OnTriggerEnter par OnCollisionEnter dans le script du Cube et mis un print à l'entrée de la fonction. Mais quand je teste la scène, mon personnage arrive à traverser les murs SANS qu'il y ait appel à OnCollisionEnter !

Mes paramètres semblent pourtant corrects (tous les objets de la scène ont un collider et le Cube joueur possède un RigidBody). Pourriez-vous me dire pourquoi OnCollisionEnter n'est pas appelée ?

maskah
maskah
Niveau 13
08 juin 2013 à 20:05:35

Tu peux ajouter un RigidBody aux murs, sans gravité et avec toutes les contraintes par exemple.

grimmjow_13
grimmjow_13
Niveau 9
08 juin 2013 à 22:48:25

Ça ne marche pas non plus désolé :( ...

maskah
maskah
Niveau 13
08 juin 2013 à 23:28:14

Tu as des contraintes sur le cube ?

grimmjow_13
grimmjow_13
Niveau 9
08 juin 2013 à 23:34:12

Tu parles des Constraints dans son composant RigidBody ? Si oui, aucune des 3 case X, Y, Z de Freeze Position et Freeze Rotation ne sont cochées.

maskah
maskah
Niveau 13
08 juin 2013 à 23:34:18

Mais de toute façon, indépendamment des contraintes sur le cube. Les murs et le cube ayant un RigidBody, OnCollisionEnter devrait être appelée.

Construit tes murs avec 2,3 Cube sous Unity pour voir. Ça devrait marcher.

grimmjow_13
grimmjow_13
Niveau 9
08 juin 2013 à 23:40:56

Le Cube joueur a bien un BoxCollider et un RigidBody (sans "Use Gravity" ni "Is Kinematic" et "Collision Detection = discrete").

J'ai ajouté un deuxième Cube joueur (copie de l'autre Cube joueur qui se déplace avec des touches différentes) ainsi qu'un Cube simple avec un Box Collider (testé avec et sans RigidBody). Mais OnCollisionEnter n'est jamais appelé :-( ...

maskah
maskah
Niveau 13
09 juin 2013 à 00:01:12

https://mega.co.nz/#!dZgUxJ4b!H8qOe1dBrPjIVoYh5sMqrTz4d0RKiFKmlIEeBb-ZEFU

J'ai testé, ça marche comme prévu. Je te laisse l'archive. Compare avec ton projet.

Une fois le projet ouvert, lecture et déplace le player directement dans la scène.

grimmjow_13
grimmjow_13
Niveau 9
09 juin 2013 à 00:22:17

Ma version d'Unity n'est pas à jour :-p ... Je dl la nouvelle version (4.1.5) et je te réponds demain :ok: (en tout cas merci pour ton aide).

En attendant j'utilise une petit "astuce" : quand un cube se déplace, il se tourne toujours dans la direction de mouvement, que je stocke dans un vecteur _viewDirection. Lorsque OnTriggerEnter est appelé et que le collider correspond à la salle, j'attribue à un vecteur _collideDirection la valeur -_viewDirection et à un booléen _collide la valeur true. Enfin, dans la méthode Update du Cube joueur, lorsqu'il faut déplacer le personnage, je n'effectue le déplacement que si _collide vaut false ou si le produit scalaire de la direction de déplacement et de _collideDirection est supérieur strict à 0.
L'astuce n'est pas parfaite (visuellement, le cube peut ne pas se déplacer alors que sa direction de déplacement devrait être valide du point de vue logique; et il reste à voir ce que ça donnera avec des collisions avec des objets de forme plus complexe) mais je m'en contente jusqu'à ce qu'on trouve la solution ^^.

Shorinji
Shorinji
Niveau 9
09 juin 2013 à 11:55:02

salut,
As tu essaye d'utiliser un character controller sur ton perso? J'ai l'impression que tu te complique la vie pour rien, a moins que j'ai loupe une subtilite..

http://docs.unity3d.com/Documentation/ScriptReference/CharacterController.html

" A CharacterController allows you to easily do movement constrained by collisions without having to deal with a rigidbody.

A CharacterController is not affected by forces and will only move when you call the Move funtion. It will then carry out the movement but be constrained by collisions. "

hapliniste
hapliniste
Niveau 9
09 juin 2013 à 13:16:00

Tu change directement la position (genre transform.position.x) dans ton script?

Quand on utilise les RigidBody il faut utiliser les forces il me semble, genre RigidBody.AddForce(new Vector3(1.0f, .0f, .0f)) :ok:

Sinon, je me demande si c'est pas la case "Is Trigger" qui cause ça, cherche sur google, ya beaucoup d'aide sur les forums et autres sites!

grimmjow_13
grimmjow_13
Niveau 9
09 juin 2013 à 13:35:06

Merci pour vos conseils ! J'ai finalement réussi à obtenir ce que je voulais :ok: !

La solution utilisée : Mettre un Character Controller sur les Cubes joueurs (ce qui remplacent leur Box Collider). J'avais déjà essayé ça avant mais les Cubes joueurs traversaient toujours les murs de la salle. En fait oui il fallait juste décocher la case "IsTrigger" de l'objet Salle !
Du coup je déplace mon cube en utilisant le composant CharacterController (controller.Move(...)).

Merci encore ! Je posterai sur ce topic la prochaine fois que j'aurai une question sur Unity (histoire de ne pas en créer un nouveau à chaque fois :-p ).

-Adridu84-
-Adridu84-
Niveau 10
09 juin 2013 à 13:35:10

Normalement, décocher la case "IsTrigger" suffit. Is trigger désactive le collider. Pourquoi irait tu t'embêter à refaire tout un script pour sa ?

grimmjow_13
grimmjow_13
Niveau 9
09 juin 2013 à 13:45:00

Ben au final le script ne contient plus de traitement de collision, seulement le déplacement du Cube :-p .

Après quand je voudrais traiter des collisions spécifiques (ramasser un objet en passant dessus par exemple), j'utiliserai la fonction OnControllerColliderHit.

grimmjow_13
grimmjow_13
Niveau 9
23 juin 2013 à 14:40:08

Salut à tous,

J'aurais une nouvelle question concernant Unity (ça n'a plus de rapport avec les collisions mais j'évite de créer un nouveau topic à chaque fois). Ça concerne l'importation d'assets créées avec Maya (j'ai fait plusieurs rechercher sur mon problème mais les solutions que j'ai testées non pas l'aire de marcher).

J'ai crée un maillage de personnage en 3D sur Maya puis je l'ai animé en lui "bindant" un Skeleton. Je chercher maintenant à exporter ce personnage et ses animations pour l'utiliser dans Unity. Le problème est qu'en important le fichier mb dans Unity, l'animation ne se fait pas correctement : le personnage est toujours en "bind pose" (la pause par défaut) et fait juste quelques rotations (en restant en "bind pose"), je pense qu'il s'agit des rotations du joint root du Skeleton (au niveau du bassin).
J'ai essayé, dans Maya, de sélectionner mon Skeleton (en faisant Select Hierarchy sur le joint racine) et de faire Edit->Keys->Bake Simulation, ce qui créer une keyframe par frame; puis d'importer le nouveau fichier dans Unity mais toujours le même problème :-( ...

Merci pour vos futures réponses :ok: !

PS : Une des solutions serait peut-être de supprimer le Skeleton dans Maya tout en gardant l'animation du maillage de personnage. J'ai essayé de selectionner le maillage et de faire "Bake Simulation", mais si je supprime ensuite le Skeleton, le maillage disparait, et si je fais "Detach Skin", le maillage se remet en bind pose et n'a plus d'animations.

grimmjow_13
grimmjow_13
Niveau 9
27 juin 2013 à 00:38:06

J'ai essayé d'exporter en fichier FBX (en "bakant" les animations avant l'exportation et lors de l'exportation), mais j'obtiens toujours un personnage figé en bind pose qui fait quelques rotations...

GPofficiel
GPofficiel
Niveau 1
30 juillet 2014 à 10:42:31

Bonjour, Clique sur ton objet (selectionne le ) vas dans select et active generate collider

Lapintade
Lapintade
Niveau 30
30 juillet 2014 à 11:28:08

Le sujet date de plus d'un an, merci de ne pas remonter des vieilles questions

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment