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 :