0

Dies war ursprünglich ein Beitrag auf Einheit "Antworten", aber die Moderatoren nehmen ihre süße Zeit Genehmigung, so dass ich es hier auf der weit überlegenen Stapel Überlauf jubeln ... denken Sie daran, das ist ein Unity-Engine-Problem in C# -Skript ... offensichtlich ...Einheit Einfach 2D Collider Sensor Skript Reihenfolge der Ereignisse Ausgabe

Also ich versuche, ein einfaches Skript zu machen, um alle 2D-Collider zu verfolgen, die eine bestimmte 2D berühren Trigger Collider. Es soll eine generische öffentliche 2D-Collider-Liste aller 2D-Collider erhalten, die den 2D-Collider des aktuellen Frames berühren, auf den andere Scripts zugreifen können, um andere Dinge zu tun. Ich habe mehrere Implementierungen ausprobiert und festgestellt, dass die Einheit aufgrund der Reihenfolge der Ereignisse Dinge ausführt, die schwerer sind als es scheint (für mich jedenfalls). Die anderen Skripte, die die Collider-Liste aus dem Sensor-Skript verwenden, greifen nur während ihres update() auf die Liste zu, und logisch sieht es so aus, als sollte die Liste zu diesem Zeitpunkt korrekt gefüllt sein, aber ich muss falsch liegen, weil dies eindeutig nicht der Fall ist. Hier ist mein aktuellster und bester Versuch, kann mir jemand sagen, wo ich falsch liege? (Es gibt auch eine Bool, um sicherzustellen, nur neue Beschleuniger hinzugefügt werden, dass ein Teil ist irrelevant, was ich frage ... Ich denke, es trotzdem ...)

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class SimpleColliderSensor : MonoBehaviour { 

    public bool repeatsallowed; 
    public List<Collider2D> sensedobjs; 
    bool clearlist; 

    public void init() 
    { 
     clearlist = false; 
     repeatsallowed = false; 
     sensedobjs = new List<Collider2D>(); 
    } 

    void FixedUpdate() 
    { 

    } 

    void Update() 
    { 

    } 

    void LateUpdate() 
    { 
     clearlist = true; 
    } 

    void OnTriggerEnter2D(Collider2D c) 
    { 
     OnTriggerStay2D(c); 
    } 

    void OnTriggerStay2D(Collider2D c) 
    { 

     if (clearlist) 
     { 
      sensedobjs.Clear(); 
      clearlist = false; 
     } 


     if (repeatsallowed) 
     { 
      sensedobjs.Add(c); 
     } 
     else 
     { 
      if (!sensedobjs.Contains(c)) 
      { 
       sensedobjs.Add(c); 
      } 
     } 
    } 

    void OnCollisionStay2D(Collision2D c) 
    { 
     OnTriggerStay2D(c.collider); 
    } 

    void OnCollisionEnter2D(Collision2D c) 
    { 
     OnTriggerStay2D(c.collider); 
    } 

} 

es „Clear“ scheint nur festgelegt werden konnte in update und es würde genauso funktionieren, aber ich habe verschiedene Dinge ausprobiert, also ist es jetzt spät dran. Wie auch immer, die Liste enthält oft Kollisionen, mit denen es kollidieren sollte, aber einige Collider. Und ja, die Sensor- und Sensee-Collider sind so eingestellt, dass sie in den Physik-2D-Projekteinstellungen kollidieren. Ich sollte das wahrscheinlich erwähnen. Ich würde jede Einsicht schätzen, die jemand hat. Sorry, so ausführlich. Vielen Dank.

Antwort

0

Ich denke, dass Sie nichts in der Reihenfolge annehmen können, in der Sie OnTriggerEnter2D aufgerufen werden, und ob sie vor oder nach anderen Update-Funktionen aufgerufen werden.

Sie können die Unity Script Lifecycle Chart sehen hier http://docs.unity3d.com/Manual/ExecutionOrder.html

Aber das einzige, was wir daraus ist Schluss, dass OnTriggerEnter2D wird, bevor die Update-Funktion von einem bestimmten Skript aufgerufen werden, ohne Erwähnung von dem, was die anderen sind dabei.

So wäre meine Vermutung, dass die einzige Art und Weise, dass jedes Skript, um sicherzustellen, wird die genaue Anzahl von Beschleunigern zu sehen, dass Ihr Auslöser berührt ist die Liste für den vorherigen Rahmen

Sie müßten zwei Listen zu überprüfen: Eine, in der Sie die Collider speichern und eine, die die Collider des letzten Frames enthält (auf die von anderen Scripts zugegriffen werden soll) Sie können Time.time oder Time.frameCount verwenden, um festzustellen, in welchem ​​Frame Sie sich befinden.

Sie sollten in der Lage sein, die Implementierungsdetails

zu verstehen