[Résolu] Créer un trigger qui ne détecte que les colliders ?

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
ludoxe
Messages : 26
Inscription : 23 Mars 2014 19:17

[Résolu] Créer un trigger qui ne détecte que les colliders ?

Message par ludoxe » 25 Avr 2021 22:47

Salutations!

Peut être que la réponse est évidente mais bon :-D
Je précise je suis en 2d au cas où.

J'ai un gameObject A qui a un trigger.
Un gameObject Joueur qui a un trigger de détection d'ennemi et un collider qui n'est pas un trigger.

Mon problème est le suivant :
le trigger du gameObject A s'active quand le trigger du joueur rentre dans le premier trigger... Je veux qu'il ne s'active que lorsque rentre dedans le collider du joueur qui n'est pas un trigger.

Pour l'instant j'ai fait ceci sans que ça change quoique ce soit au problème étrangement

Code : Tout sélectionner

 private void OnTriggerEnter2D(Collider2D collision)
    {
    if(collision.isTrigger == true) return ;
    
    //Some code
    
    }

Comment devrais-je procéder ?
Pourquoi ma condition ne fonctionne pas ?

Merci d'avance
Dernière édition par ludoxe le 27 Avr 2021 19:51, édité 1 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Créer un trigger qui ne détecte que les colliders ?

Message par jmhoubre » 25 Avr 2021 23:23

Bonsoir,
A est un ennemi ou pas ?
Qui porte le Rigidbody ?
Le script publié est celui de quel objet ?

As-tu regardé du côté de Layer Collision Matrix et Layer-based collision detection?

Avatar de l’utilisateur
ludoxe
Messages : 26
Inscription : 23 Mars 2014 19:17

Re: Créer un trigger qui ne détecte que les colliders ?

Message par ludoxe » 26 Avr 2021 00:04

Merci de souligner les informations que j'ai oublié de transmettre :-D

A est une couverture :
Grosso modo le joueur courre tout seul et devant une couverture, s'arrête pour se mettre à couvert.

Je resynthétise donc toutes les informations de ce que à chaque gameobject:

GameObject A :
-le script avec OntriggerEnter()
-un rigidbody
-un collider avec isTrigger = true

GameObject Joueur :
-un rigidbody
-un collider avec isTrigger = false
-un plus grand collider avec isTrigger = true

Quand le trigger de Joueur rentre dans le trigger de A, OntriggerEnter() de A est appelé.

Je veux appeler OntriggerEnter() que lorsque le collider (qui n'est pas un trigger) de Joueur entre dans le trigger de A

Edit: j'ai pas vu ton message sur les layers
Du coup oui, j'ai déjà regardé de ce côté, mais je ne pense pas que manipuler des layers soit la solution la plus adaptée pour mon problème, je ne pense pas devoir rajouter d'autres gameObject avec un collider et un trigger (sauf peut être des ennemis, mais ils seront dans ce cas quasiment identique au gameObject joueur).
De plus je prévois déjà d'utiliser les layers avec les OntriggerEnter pour une d'autres mécaniques du jeu.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Créer un trigger qui ne détecte que les colliders ?

Message par jmhoubre » 26 Avr 2021 18:35

Bonjour,
j'ai reproduit la scène. N'ayant pas de précisions sur les objects, j'ai fait ceci :
- un plane comme sol (je travaille en 3D)
- le player est une capsule, avec un CapsuleCollider (trigger = false) et un trigger de détection (j'ai pris un BoxCollider de taille 5 x 1 x 5).
- les "couvertures" sont des cubes avec un BoxCollider (que j'ai un peu surélevé pour qu'il ne touche pas le sol), un Rigidbody et ton script, que j'ai modifié :

Code : Tout sélectionner

using UnityEngine;

public class Cover : MonoBehaviour
{
    private void OnTriggerEnter (Collider collider)
    {
        Debug.Log (collider.name);
        if (collider.isTrigger == true)
        {
            Debug.Log ("Return activé.");
            return;
        }
        Debug.Log ("Trigger activé.");
    }
}
Quand le trigger de détection touche la couverture, j'ai l'affichage suivant :
UnityEngine.BoxCollider
Return activé.
Ce qui indique que le Player a bien touché la couverture avec le trigger de détection, et comme ce collider a isTrigger coché, la condition est activée.

Si tu fais ceci, tu devrais avoir réglé ton souci :

Code : Tout sélectionner

using UnityEngine;

public class Cover : MonoBehaviour
{
    private void OnTriggerEnter (Collider collider)
    {
        // Le trigger de détection a-t-il été activé ?
        if (collider.GetType () == typeof (BoxCollider))
        {
            Debug.Log ("Détection.");
            return;
        }
        else
        {
            // A ce point, le collider non trigger est activé.
            Debug.Log (collider.GetType ());
        }
    }
}
Ma console indique :
Détection
UnityEngine.CapsuleCollider
Cela fonctionne en 3D, je ne vois pas pourquoi cela ne fonctionnerait pas en 2D. Toutefois, il faut que les 2 colliders du joueur (le trigger et le non trigger) soient de type différents.

Il y a d'autres pistes de solutions que je n'ai pas creusées :
- enlever le collider de détection d'ennemi, et le remplacer par un test de présence d'ennemis dans un certain rayon avec Physics2D.OverlapCircle. Note que le test n'a pas à être dans l'Update, mais peut être fait tous les 1/4 ou 1/2 secondes (dépend des vitesses et de l'échelle du jeu), avec InvokeRepeating("Test", 0f, 0.33f).
- utiliser OnCollisionEnter2D : la couverture sera infranchissable (enlever isTrigger de son collider, passer son rigidbody en isKinematic) et ne détectera que les colliders avec isTrigger = false.
Dernière édition par jmhoubre le 27 Avr 2021 21:06, édité 1 fois.

Avatar de l’utilisateur
ludoxe
Messages : 26
Inscription : 23 Mars 2014 19:17

Re: Créer un trigger qui ne détecte que les colliders ?

Message par ludoxe » 27 Avr 2021 19:51

Merci bien, effectivement différencier les colliders par son type est une bonne idée :-D

Répondre

Revenir vers « Scripting »