Je m'initie actuellement à Unity et je galère depuis plusieurs minutes sur un problème de collision tout bête (la honte
...).
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 ?
Tu peux ajouter un RigidBody aux murs, sans gravité et avec toutes les contraintes par exemple.
Ça ne marche pas non plus désolé
...
Tu as des contraintes sur le cube ?
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.
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.
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é
...
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.
Ma version d'Unity n'est pas à jour
... Je dl la nouvelle version (4.1.5) et je te réponds demain
(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 ^^.
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. "
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))
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!
Merci pour vos conseils ! J'ai finalement réussi à obtenir ce que je voulais
!
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
).
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 ?
Ben au final le script ne contient plus de traitement de collision, seulement le déplacement du Cube
.
Après quand je voudrais traiter des collisions spécifiques (ramasser un objet en passant dessus par exemple), j'utiliserai la fonction OnControllerColliderHit.
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
!
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.
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...
Bonjour, Clique sur ton objet (selectionne le ) vas dans select et active generate collider
Le sujet date de plus d'un an, merci de ne pas remonter des vieilles questions