Jump to content
Unity Insider Forum

Raycasting in Unity


I.Kalis

Recommended Posts

Hallo liebe Community, 

Ich arbeite zurzeit an einem RST-Game und habe ein Script geschrieben welches mich Objekte durch Buttons auf einem Boden Platzieren lässt.

Dieses Script basiert darauf, dass wenn der Button gedrückt wird, wird die durch den Raycast generierte Mausposition auch zur Position des Objektes wird, bis es platziert wurde. 

Nun habe ich  folgendes Problem: Der Layer der Objekte muss auf dem Layer IgnoreRaycast liegen, weil er sonst die Objekte immer weiter in die Höhe baut, da die Mausposition wenn das Objekt gespawnt  ist auf dem Objekt liegt und das Objekt sich immer auf die neue Mausposition aufbaut. 

Ich möchte, wenn das Objekt platziert ist, wieder darauf zurückgreifen und es zum Beispiel nochmals verschieben können. Das funktioniert aber nicht weil das Objekt vom Raycast Ignoriert wird.

kann ich irgendwie den Layer im Code ändern während der Laufzeit des Spiels ?

 

ich würde mich sehr über eine Antwort freuen und hoffe ich habe es verständlich erklärt.

mit freundlichen Grüßen 

Immanuel kalis

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 13.11.2019 um 13:14 schrieb I.Kalis:

Der Layer der Objekte muss auf dem Layer IgnoreRaycast liegen

Muss er nicht. Du kannst bei jedem Raycast eine LayerMask mitgeben, die bestimmt, welche Layer getroffen werden können. Darüber hinaus kannst du nach dem Raycast das getroffene Objekt filtern.

Eine LayerMask kannst du z.B. so benutzen:

[SerializeField]
private LayerMask layers;

private void Update()
{
  RaycastHit hit;
  if (Physics.Raycast(ray, out hit, Mathf.Infinity, layers))
  {
    // ...
  }
}

Dann kannst du im Inspektor ein Häkchen bei jedem gewünschten Layer setzen.

Da musst du aber bedenken, dass der Ray blind durch alles durchgeht, was nicht der LayerMask entspricht. Du kannst also durch ein platziertes Gebäude hindurch den Boden treffen. Üblicherweise würde man ja aber wollen, dass man einfach nicht bauen kann, wenn die Maus über einem Gebäude ist. Du würdest also eher einfach Raycasten und dann schauen, was getroffen wurde:

private void Update()
{
  RaycastHit hit;
  if (Physics.Raycast(ray, out hit))
  {
    if (CanBuildOn(hit.collider))
    {
      // ...
    }
  }
}

private bool CanBuildOn(Collider c)
{
  // Check if c is ground
}

CanBuildOn kann jetzt beliebig aussehen. Wieder ein bestimmter Layer wäre möglich, aber auch eine Komponente auf dem Boden-GameObject. Von Tags würde ich wie üblich abraten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...