2016-06-13 8 views
2

Zwei animierte Auto Objekt sind beide enthält Starrkörper und Box Collider und einen Skript mit OnTriggerEnter Ereignisse.prüfen, welches Objekt hat mit einem anderen Objekt kollidiert, während Scripts gleiche

Jetzt möchte ich überprüfen, welches Auto zu einem anderen Auto schlug, während beide Autos laufen. Bedeutet wenn Ein Treffer zu B oder B Treffer zu A, da beide dasselbe Skript und dasselbe Ereignis haben, dann werden beide Ereignisse zum Auslöser. Wie man es identifiziert, wer schlug ???

Erinnern Sie empfehlen mir nicht Raycast zu verwenden, um es

Zum Beispiel ist teuer machte ich zwei Würfel hinzugefügt Box Collider und Starrkörper und ein Skript, das (oder Scheck)

void OnTriggerEnter(Collider c) { 
     Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name); 

    } 

enthält Wenn ich nun beide Objekte trigge, bleibt die Reihenfolge des Triggers gleich, egal, ob ich ein Objekt an B oder B an A trage. Wie werde ich es unterscheiden?

+0

Schwierige Dinge zu übernehmen. Ich schlage vor, was Sie versucht haben und erklären, wo Sie blockiert haben. –

+0

ein Code-Snippet hinzugefügt mit einigen Details –

+0

Überprüfen Sie die Geschwindigkeit des Objekts (nehmen Sie an, dass schneller ist derjenige, der trifft) oder verwenden Sie mehr Colliders (Sie können nur mit dem vorderen schlagen) –

Antwort

0

Ich sehe einige Möglichkeiten, von denen das ist die einfachste:

EDIT: Hinweis - RigidBidy Geschwindigkeit haben muss, ich meine, Sie müssen Objekte bewegen, mit RigidBodyAddForce oder eine andere Physik-basierte Bewegung mit.

  1. Überprüfen der Geschwindigkeit. Getting RigidBody von jedem Auto und Überprüfung der velocity - die mit höheren velocityVector3 ist derjenige, der trifft. Beachten Sie, dass Sie hier die Projektion verwenden müssen.

    void OnTriggerEnter(Collider c) 
    { 
        Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name); 
    
        Vector3 directionB = this.transform.position - c.transform.position; 
        Vector3 directionA = c.transform.position - this.transform.position; 
    
        Vector3 rawVelocityA = this.GetComponent<Rigidbody>().velocity; 
        Vector3 rawVelocityB = c.GetComponent<Rigidbody>().velocity; 
    
        Vector3 realSpeedA = Vector3.Project (rawVelocityA, directionA); 
        Vector3 realSpeedB = Vector3.Project (rawVelocityB, directionB); 
    
        if (realSpeedA.magnitude > realSpeedB.magnitude) 
        { 
         Debug.Log ("A hit B"); 
        } 
        else if (realSpeedB.magnitude > realSpeedA.magnitude) 
        { 
         Debug.Log ("B hit A"); 
        } 
        else 
        { 
         Debug.Log ("A hit B and B hit A"); 
        } 
    } 
    

EDIT: Da Sie nicht Physik mit Autos zu bewegen, müssen Sie Geschwindigkeit auf eine andere Weise

Ich schlage vor, so etwas berechnen:

Haben Sie ein Skript SpeedCalculator .cs auf jedem Auto.

public class SpeedCalculator : MonoBehaviour 
{ 
    public float Velocity 
    { 
     get 
     { 
      return velocity; 
     } 
    } 
    private float velocity; 

    private Vector3 lastPosition; 

    void Awake() 
    { 
     lastPosition = transform.position; 
    } 

    void Update() 
    { 
     velocity = transform.position - lastPosition; 
     lastPosition = transform.position; 
    } 
} 

Und dann statt Geschwindigkeit der Einnahme von RigidBody nehmen es von SpeedCalculator:

void OnTriggerEnter(Collider c) 
{ 
    Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name); 

    Vector3 directionB = this.transform.position - c.transform.position; 
    Vector3 directionA = c.transform.position - this.transform.position; 

    Vector3 rawVelocityA = this.GetComponent<SpeedCalculator>().Velocity; 
    Vector3 rawVelocityB = c.GetComponent<SpeedCalculator>().Velocity; 

    Vector3 realSpeedA = Vector3.Project (rawVelocityA, directionA); 
    Vector3 realSpeedB = Vector3.Project (rawVelocityB, directionB); 

    if (realSpeedA.magnitude > realSpeedB.magnitude) 
    { 
     Debug.Log ("A hit B"); 
    } 
    else if (realSpeedB.magnitude > realSpeedA.magnitude) 
    { 
     Debug.Log ("B hit A"); 
    } 
    else 
    { 
     Debug.Log ("A hit B and B hit A"); 
    } 
} 
+0

die lösung hat nicht funktioniert ich teste es auf zwei cubes es szene zeige es alwasy zeigt A hit B und B hit A –

+0

Das ist Überraschung für mich, da ich nicht weiß, was hier falsch sein könnte - warum die Länge von beiden realSpeed Vektoren ist gleich. Bist du sicher, dass der rigidBody Geschwindigkeit hat? Ich habe gefragt, was sie nicht hatten. Ich werde die Antwort bearbeiten. –

+0

es gibt keine Geschwindigkeit, wie ich dir gesagt habe Ich überprüfe es in der Szenenansicht, indem ich den Richtungspfeil verschiebe Ich bewege das Objekt nur zur Überprüfung des Codes –

Verwandte Themen