Page 1 sur 1

Détecter une collision "trigger" entre deux objet spécifiques ?

Publié : 14 Mars 2020 02:05
par GameTux
Salut,

Alors je sais comment détecter un objet qui entre en collision "trigger" avec l'objet qui contient le script, mais moi j'aimerai pouvoir détecter quand deux objets spécifiques entre en collisions donc en les "sélectionnant" avec des :

Code : Tout sélectionner

public GameObject Objet1;
public GameObject Objet2;
Actuellement j'ai ça qui permet donc de détecter quand un objet entre en collision avec l'objet qui contient le script :

Code : Tout sélectionner

    
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "Objet2")
        {
            Debug.Log("Collision Detected");
        }
}
Donc le problème c'est que là il détecte la collision entre l'objet qui contient le script et "Objet2" mais moi j'aimerai pouvoir spécifier un "Objet1" parce que j'aimerai pouvoir mettre le script sur un autre objet et non pas sur "Objet1".

Voilà j'espère que vous avez compris ma question.

Merci.

Re: Détecter une collision "trigger" entre deux objet spécifiques ?

Publié : 14 Mars 2020 11:03
par Max
Bonjour,

De ce que j'ai compris de ta problématique, les tags ne seraient-ils pas une des solutions ?

Code : Tout sélectionner

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("typeObject1"))
        {
            Debug.Log("Collision Detected");
        }

Re: Détecter une collision "trigger" entre deux objet spécifiques ?

Publié : 14 Mars 2020 11:45
par jmhoubre
Bonjour,

j'ai une solution, pas forcément la plus simple.

Sur la scène, des GameObjects avec Collider, Rigidbody et le script "ObjectToTest". Un empty avec le script TestTrigger.

TestTrigger maintient une queue dans laquelle les objets viennent enregistrer les collisions. Sa méthode Update scrute la queue et quand elle n'est pas vide, dépile une collision et la traite (ici on l'affiche). Il définit aussi une structure à adapter : ici juste les colliders des 2 objets impliqués et le moment de la collision :

Code : Tout sélectionner

using System.Collections.Generic;
using UnityEngine;

public class TestTrigger : MonoBehaviour {

    private static Queue<TriggerCollision> m_CollisionsQueue;

    private void Start () {
        m_CollisionsQueue = new Queue<TriggerCollision> ();
    }

    private void Update () {
        TriggerCollision triggerCollision;

        while (m_CollisionsQueue.Count > 0) {
            // Traitement des collisions.
            triggerCollision = m_CollisionsQueue.Dequeue ();
            triggerCollision.PrintTriggerCollider ();
        }
    }

    public static void AddCollision (TriggerCollision _TriggerCollision) {
        m_CollisionsQueue.Enqueue (_TriggerCollision);
    }
}

public struct TriggerCollision {
    private Collider transmitterCollider;
    private Collider involvedCollider;
    private float timeOfCollision;

    public TriggerCollision (Collider _transmitterCollider, Collider _involvedCollider, float _timeOfCollision) {
        transmitterCollider = _transmitterCollider;
        involvedCollider = _involvedCollider;
        timeOfCollision = _timeOfCollision;
    }

    public void PrintTriggerCollider () {
        Debug.Log ("Collision entre " + transmitterCollider.gameObject.name + " et " + involvedCollider.gameObject.name + " à " + timeOfCollision);
    }
}
ObjectToTest alimente la queue.

Code : Tout sélectionner

using UnityEngine;

public class ObjectToTest : MonoBehaviour {

    private Collider m_Collider;
    
    private void Start () {
        m_Collider = GetComponent<Collider> ();
    }

    private void OnTriggerEnter (Collider other) {
        TriggerCollision triggerCollision = new TriggerCollision (m_Collider, other, Time.time);
        TestTrigger.AddCollision (triggerCollision);
    }
}
Il faut traiter les doublons, mais cela fonctionne avec un nombre quelconque d'objets :
Image

Re: Détecter une collision "trigger" entre deux objet spécifiques ?

Publié : 16 Mars 2020 22:16
par GameTux
Merci pour la réponse, en effet c'est pas facile facile, je pensais qu'il y avait un moyen plus simple de le faire donc bon finalement j'ai fait autrement.

J'ai mis le script de détection de collision trigger dans l'objet 1 en gros j'ai fait une détection tout ce qu'il y a de plus banal sauf que j'ai en plus ajouter un "bool" du genre

Code : Tout sélectionner

Collision = true;
quand il y a collision et je vais ensuite récupéré l'information dans mon autre script avec un

Code : Tout sélectionner

if (Objet1.GetComponent<Monscript>().Collision == true)
{
// faire des truc
}
Et voilà c'est pas compliquer mais je pensais qu'il y avait encore plus simple.