[Résolu] [DB-AL] Problème de Collisions 2D

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
LeKraken
Messages : 9
Inscription : 25 Juin 2016 23:20

[Résolu] [DB-AL] Problème de Collisions 2D

Message par LeKraken » 25 Juin 2016 23:47

Salut !

Alors j'ai commencé à découvrir Unity il n'y pas très longtemps, et je suis en train de faire quelques tests pour un futur projet. Pour le moment je me focalise surtout sur la 2D, et, comme vous vous en doutez, je rencontre un petit problème (2 problèmes distincts pour être exact), concernant les collisions.

D'abord, deux-trois mots sur la scène. J'ai essayé de reproduire très sommairement une pièce d'un RPG vue de dessus (style Pokemon, Mother, Dragon Quest...). Il y a des murs, une porte et un personnage.
- Le personnage est un carré que je déplace avec le clavier, il a un collider2D et un rigidbody (pour les addForce) ;
- Les murs sont des rectangles, avec seulement un collider2D chacun ;
- La porte est un rectangle avec seulement un collider2D.
Globalement, quand le personnage rencontre un mur ou la porte, il se bloque bien, pas de souci à ce niveau !

Problème 1 :
J'aimerais que, en appuyant sur une touche (Espace en l'occurrence), si le personnage est contre un objet, un message s'affiche dans la console. Du coup, dans le script lié au joueur, j'ai ajouté un onCollisionStay2D, qui teste le nom de l'objet rencontré, et affiche un message en fonction.
Jusque là, ça fonctionne, sauf que, une fois que je suis contre le mur, que j'ai appuyé sur Espace et que le message s'est affiché, si je rappuie, plus rien... Pourtant la doc dit que le fonction onCollisionStay est rappelée à chaque frame... Donc là, je suis obligé à chaque fois de reculer, puis de me re "cogner" contre le mur pour faire afficher le message à nouveau.

Problème 2 :
Indépendamment de ça, comme je l'ai dit, tout se passe dans le script attaché à mon Player. Le problème, c'est que si j'essaye d'inverser le truc, ça ne marche plus ! Par exemple, si j'attache un script à la porte, avec un onCollisionStay2D qui teste le nom de l'objet rencontré (il teste ici "Player"), il n'affiche rien en console quoi que je fasse. Si ça marche dans un sens, ça devrait marcher dans l'autre, non (même si la porte ne bouge pas) ?
Alors oui, c'est vrai qu'au final peu importe, puisque ça marche dans un des deux sens (script attaché au Player), mais je trouve ça plus propre de "répartir" les fonctions, et puis même, j'aimerais comprendre pourquoi ça ne marche pas x)

Voilà, alors bon, le premier problème me parait plus handicapant, mais le deuxième plus intriguant x)
Si vous avez des réponses, je suis preneur !

Merci beaucoup !
Dernière édition par LeKraken le 30 Juin 2016 22:40, édité 1 fois.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [DB-AL] Problème de Collisions 2D

Message par Moi 1971 » 26 Juin 2016 11:20

Bonjour,
je n'ai pas de solution, mais je rencontre le même problème avec le OnTriggerStay en 3D, donc je serai intéressé par une solution. ;-)
Sinon, dans la doc il est bien mentionné que la Classe Collision est faite pour gérer les chocs et leur physique. Si tu n'as besoins que de l'information de rester présent prés d'un mur, les Ontrigger sont peut-être plus adaptés.
PS: Ce serait sympa de faire une présentation de qui tu es dans la section adaptée. ;-)
PS2: Le w-e, il y a peu de monde ici (enfin ceux qui sont capables de te répondre) il faut attendre lundi...

Avatar de l’utilisateur
LeKraken
Messages : 9
Inscription : 25 Juin 2016 23:20

Re: [DB-AL] Problème de Collisions 2D

Message par LeKraken » 26 Juin 2016 12:12

Salut !

Déjà, merci de ta réponse !

Pour ce qui est du problème 2, j'ai trouvé le problème, et je dois avouer que c'est un peu honteux : j'avais oublié la majuscule à "OnCollisionStay2D"... -___-

Par contre, le problème 1 est toujours actif, quelle que soit la configuration : avec un TriggerStay ou un CollisionStay sur le Player, ça ne marche pas, et idem avec un TriggerStay ou un CollisionStay sur le mur... J'ai fait pas mal de test, en élargissant les BoxCollider, mais toujours le même souci : à chaque fois, je dois me déplacer pour que le message s'affiche en console (attention, j'ai remarqué que si je reste collé au mur, mais que je me déplace le long de celui-ci, ça marche de temps en temps [pas à chaque fois...]. Mais dans tous les cas, en restant immobile, ça ne marche jamais).

J'attends donc lundi avec impatience ;)

D'ici là, j'irai également poster une présentation, j'avais pas du tout fait gaffe !

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [DB-AL] Problème de Collisions 2D

Message par Moi 1971 » 26 Juin 2016 13:02

Comme je l'ai dit, j'ai le même problème en 3D. Mes objets ne sont plus détectés dès que leur vitesse de déplacement est inférieur à une certaine limite ( C'est du moins comme ça que j'analyse mon problème pour l'instant).
Pour ce problème, il faut vérifier le IsKinematic. Dans la doc : http://docs.unity3d.com/Manual/CollidersOverview.html
Il est dit.
With normal, non-trigger collisions, there is an additional detail that at least one of the objects involved must have a non-kinematic Rigidbody (ie, Is Kinematic must be switched off). If both objects are kinematic Rigidbodies then OnCollisionEnter, etc, will not be called. With trigger collisions, this restriction doesn’t apply and so both kinematic and non-kinematic Rigidbodies will prompt a call to OnTriggerEnter when they enter a trigger collider.
En suite, il y a le type de collider : Static Collider, Rigidbody Collider et Kinematic Rigidbody Collider.

Avec tout ça, bien paramétré, ça devrait fonctionner.... en tout cas, chez moi c'est pas encore le cas! :o

Avatar de l’utilisateur
LeKraken
Messages : 9
Inscription : 25 Juin 2016 23:20

Re: [DB-AL] Problème de Collisions 2D

Message par LeKraken » 26 Juin 2016 13:41

En fait, j'ai l'impression que l'appel aux fonctions OnTriggerStay et OnCollisionEnter ne se font que quand "quelque chose se passe". En agrandissant mon BoxCollider2D énormément, je me rend bien compte que, tant que le cube est immobile (et donc que rien ne se passe, puisque c'est le seul objet censé bouger), aucun Trigger n'est détecté. Par contre, dès qu'il bouge (soit j'ai la touche enfoncée, soit il se déplace un peu encore après avoir relevé mon doigt de la touche, à cause de son accélération), si j'appuie plusieurs fois sur Espace, pas de souci, le message s'affiche plusieurs fois en console !

Le problème c'est qu'évidemment, j'aimerais que ça marche même quand rien ne bouge. Dans Pokemon, quand on clique sur un PC ou un panneau, on a pas besoin de se déplacer en cliquant sur A ! :lol:

La solution serait peut-être de faire bouger quelque chose ailleurs, pour "forcer" un rafraîchissement, mais bon, ça ne me paraît pas super...
Je suis vraiment preneur d'une réponse, ce problème me semble un peu handicapant pour les applications du moteur que j'ai en tête.

amphibia
Messages : 52
Inscription : 21 Juin 2016 23:16

Re: [DB-AL] Problème de Collisions 2D

Message par amphibia » 28 Juin 2016 23:52

Pourquoi ne pas déclarer un booléen qui deviendrait vrai dans la fonction OnCollisionStay et conditionner l'affichage du message en fonction de l'état de ce booléen ainsi que l'évènement d'appui sur la barre d'espace à part ?
Le booléen en question redeviendrait faux grâce à OnCollisionExit.

edit : Il me semble aussi que tu as une option propre au RigidBody qui te permet de choisir une méthode de détection des collisions continue ou discrète ;-)

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [DB-AL] Problème de Collisions 2D

Message par Moi 1971 » 29 Juin 2016 12:56

De mon côté, j'ai essayé avec le booléen. Mais le problème est toujours le même, si l'objet n'est pas détecté, le booléen passe aussitôt à false... Le booléen suit parfaitement ce qui se passe (ou pas) dans les différents OnCollision....
choisir une méthode de détection des collisions continue ou discrète ;-)
Je crois que la solution est là...

amphibia
Messages : 52
Inscription : 21 Juin 2016 23:16

Re: [DB-AL] Problème de Collisions 2D

Message par amphibia » 29 Juin 2016 16:26

Ca me paraît bizarre, même si l'objet n'est plus détecté et que l'objet ne sort pas non plus de la zone du collider il n'y a ni évènement d'entrée ni de sortie, le booléen reste vrai s'il est déclaré comme variable globale :

Code : Tout sélectionner

public class Test : MonoBehaviour
{
	private bool isCollided = false;

	void OnCollisionStay2D()
	{
		isCollided = true;
	}
	void OnCollisionExit2D()
	{
		isCollided = false;
	}
}

Avatar de l’utilisateur
LeKraken
Messages : 9
Inscription : 25 Juin 2016 23:20

Re: [DB-AL] Problème de Collisions 2D

Message par LeKraken » 30 Juin 2016 22:35

Salut !

Merci de ta réponse amphibia !
Je n'y avais pas du tout pensé, alors que ça règle complètement mon problème ! Merci beaucoup :amen:

Je vais passer le sujet en résolu du coup (même si ça a créé une tonne de nouvelles questions pour moi !).

Répondre

Revenir vers « (C#) CSharp »