Jump to content
Unity Insider Forum

OnTriggerEnter per RayCast


Wattsefakk

Recommended Posts

Nabend Leuts,

warum löst ein Raycast von einem Objekt nicht OnTriggerEnter bei einem anderen Collider aus? Oder bin ich da auf dem falschem Weg? 
Folgendes soll Funktionieren: Der Spieler schaut auf ein Objekt und dieses Objekt soll das erkennen ob es angeschaut wird. Also dachte ich nehme einen RayCast der in die Blickrichtung den Spielers geht und fertig nur werden im Objekt wedewr OnTriggerEnter noch OnCollisionEnter ausgelöst. Das Objekt hat sowohl einen Collider der auf Trigger gestellt ist als auch einen Rigidbody...

Wisst ihr was ich falsch mache?

Link zu diesem Kommentar
Auf anderen Seiten teilen

OnTrigger / OnCollision wird meines Wissens wirklich nur dann aufgerufen, wenn zwei Collider interagieren.

Aber du kannst von deinem Player aus auf dem Hit-Objekt eine Methode aufrufen. ( theoretisch müsste es auch möglich sein z.B. 'OnCollisionEnter' aufzurufen )

Ich würde wahrscheinlich dafür ein 'IHitable' interface schreiben, das du deinem Objekt gibst o.ä.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Trigger funktioniert nur mit einem anderen Trigger oder Collider und auch nur dann wenn mindestens ein Rigidbody im Spiel ist.

Ein Raycast ist zwar auch ein physikalisches Element, aber eben kein Körper.

Trotzdem kannst du den Raycast nutzen um dem anderen Objekt zu sagen, dass es angegschaut wird.

Du bekommst ja über Raycast.Hit alle Informationen des getroffenen Objektes. Und da du es in dem Moment kennst, könntest du ihm z.B. mit SendMessage eine Info übergeben.

SendMessage ist zwar nicht besonders performant, aber ersteinmal der einfachste Weg um das ganze zu testen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Raycast ist quasi nur ein "Prüfstrahl" und löst keinerlei Interaktionen der Physikengine aus. Du kannst aber auf dein zu erkennendes Objekt einfach ein Skript (Klasse) legen und dieser Klasse eine Methode verpassen, die dann die gewünschte Aktion auslöst:

RaycastHit hit;

 if (Physics.Raycast(transform.position, transform.forward, out hit, 100.0f)) 
  {
     Skript meinSkript = hit.transform.gameObject.GetComponent<Skript>();
     if (meinSkript!=null) {
        meinSkript.Getroffen(); // Methode "Getroffen" der Klasse Skript ausführen
     }
  }


Wie Mr 3D bereits schrieb kann man dieser Klasse auch zusätzlich ein Interface verpassen und somit verschiedene Klassen detektieren (die dann alle dieses Interface implementieren müssen) und du prüfst dann nicht mehr auf "Skript" (also nicht nur auf eine bestimmte Klasse) sondern auf ein "Interface":

RaycastHit hit;

hit.transform.gameObject

 if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f)) 
  {
     IDetectRaycast detectRay = hit.transform.gameObject.GetComponent<IDetectRaycast>();
     if (detectRay!=null) {
        detectRay.Getroffen(); // Methode "Getroffen" des Interfaces IDetectRaycast ausführen   
     }
  }
  

Interface "IDetectRaycast":

using UnityEngine;
using System.Collections;

// Einfaches Interface welches eine Methode verlangt.
public interface IDetectRaycast
{
    void Getroffen();
}

Klasse "PersonDetect":

using UnityEngine;
using System.Collections;

public class PersonDetect : MonoBehaviour, IDetectRaycast
{
    // Benötigte Methode des IDetectRaycast interface
    public void Getroffen()
    {
        print(this.gameObject.name + " wurde getroffen!");
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...