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

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
GameTux
Messages : 37
Inscription : 11 Nov 2012 03:13

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

Message par GameTux » 14 Mars 2020 02:05

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.

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 14 Mars 2020 11:03

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");
        }
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

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

Message par jmhoubre » 14 Mars 2020 11:45

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

GameTux
Messages : 37
Inscription : 11 Nov 2012 03:13

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

Message par GameTux » 16 Mars 2020 22:16

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.

Répondre

Revenir vers « Scripting »