Jump to content
Unity Insider Forum

Dynamische Decals wie Einschusslöcher und Blut wie positionieren und mit Ecken und Kanten umgehen?


Thariel

Recommended Posts

Hi

Mich würde interessieren, wie ihr Decals in euern Spielen handhabt oder wie ihr es tun würdet.

Habe mir darüber bisher noch keine Gedanken gemacht, hab irgendwie damit gerechnet, dass Unity da eine Built-in Lösung hat... falsch gedacht 😂

Im Moment erstelle ich einfach ein GameObject mit einem Sprite Renderer und positioniere es mit einem Raycast.

GameObject go = Instantiate(goBulletHoleTemplate, hit.point, Quaternion.LookRotation(hit.normal));
go.transform.position += go.transform.forward * 0.0001f; //flickern verhindern

Natürlich überlappt das Decal auch (noch) Ecken und Kanten:

OculusScreenshot1621184391.jpg.05e443e3b08fecdcf159e7678ca6abb8.jpg

Ich hab mir das in Serious Sam 3 VR BFE ganz genau angeschaut. Da überlappen Decals niemals eine Kante. Das Decal wird "abgeschnitten" dargestellt:

OculusScreenshot1621182890.jpg.41ae2affcb7fedb41668b6ac6169ff94.jpg

 

Ich hab keine Ahnung wie die das machen. Zum Beispiel könnte man bei jedem Decal mit 4 Raycasts prüfen, ob da wirklich überall Untergrund ist, aber dann gäbe es an Ecken keine Decals mehr und es wäre nicht besonders performant, vor allem bei einer Schrotflinte, die etwa 15 Einschusslöscher macht. Ich denke da gibt es irgend einen performanten Trick, den ich (noch) nicht kenne 😀

Hab ihr irgend welche Ideen?

Danke schon mal!

Edit: Ausserdem werden nie 2 Decals übereinander positioniert. Irgendwie wird erkannt, dass da schon ein Decal ist, aber kann mir nicht vorstellen, dass dieses Decal ein eigener Collider hat... oder überschätze ich einfach die Performance Einbusse für solchen "Kleinkram"?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi

Danke für den Tipp.

Ich hab eigentlich nicht vor, die SRP zu verlassen. Gibt sonst sicher kompatibilitäts Probleme mit anderen Assets. Ich hab es jetzt so gemacht, dass ich vor dem platzieren eines Decals mit 4 Raycasts prüfe, ob jeden der Ecken auch auf Grund liegt. Danach platziere ich das Decal und sie haben ein Box Collider, damit sie nicht überlappen. Ich sorge ausserdem, dass nie mehr als 50 Decals vorhanden sind, sonst wird das älteste wieder gelöscht. Ich denke, es sollte so von der Performance her passen. Schliesslich ist das Schiessen und die direkten Auswirkungen darauf DAS Kernelement vom Spiel, da darf man auch mal etwas in die Performance investieren.

Funktioniert jetzt alles sehr gut.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb Thariel:

Ich hab eigentlich nicht vor, die SRP zu verlassen.

Die URP (früher lightweight render pipeline) und HDRP ist eine SRP. Oder meinst du den Standard-Renderer?
Aber dann gibt es ggf. andere visuelle Probleme (lang gezogene Decals an Kanten).

Deine Lösung wird schon passen ;)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Stunden schrieb Peanut:

Schau dir mal pooling an. Das ist ein Bilderbuchbeispiel dafür :D.

Ja, da hast du recht. Vor allem auch für die Munition, Hülsen und so weiter. Muss mich mal ernsthaft damit befassen.

vor 9 Stunden schrieb SkipToPlay:

Die URP (früher lightweight render pipeline) und HDRP ist eine SRP. Oder meinst du den Standard-Renderer?
Aber dann gibt es ggf. andere visuelle Probleme (lang gezogene Decals an Kanten).

Deine Lösung wird schon passen ;)

 

Mit SRP meinte ich den Built-in Shader. Habe mich jetzt aber weiter mit URP und HDRP befasst und es gibt tatsächlich eine Menge Gründe, die für die URP sprechen, gerade auch in VR.

Habe die URP bereits aktiviert und "dein" Decal System getestet. Leider gibt es da auch Probleme. Zum Beispiel langgezogene Decals an Kanten, wenn der Projektor nicht korrekt positioniert wird. Zudem projiziert der Projektor auf alles. Wenn ein Objekt vor den Projektor gerät, wird das Decal plötzlich darauf gerendert. Hab noch kein Weg gefunden, da bestimmte Layer auszuschliessen.

Aktuell bleibe ich lieber noch bei meinem jetzigen System 😀

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Thariel:

Wenn ein Objekt vor den Projektor gerät, wird das Decal plötzlich darauf gerendert.

Gerade nicht die Möglichkeit in Unity zu schauen, ich dachte ich hätte mal was von layern gelesen. Aber man kann jedenfalls das Decal-Rendering auf bestimmten Objekten deaktivieren. Dazu auf den Shader gehen, der nicht von den Decals beeinflusst werden soll und den entsprechenden Haken entfernen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich finde das sehr Interessant. 

Also ich kenne das von 3D Gamestudio als Partikel mit Lebenszeit.

Aber das zu übertragen... Ohje mal sehn wenn ich auch soweit bin. Ansonsten hab ich gerade einen Interessanten Artikel gefunden der sich mit Einschusslöchern

mithilfe von Projektionen und Decal Shadern befasst.

https://forum.unity-community.de/topic/8470-einschussloch-zeichnen/

Wenn du was brauchbares zusammengestellt hast, wäre schön wenn du uns deine Lösung präsentierst.

Also Shader müsste die beste Wahl sein die deine Wand Textur übermalt. Dann würde ein Einschussloch Maximal um die Ecke gelappt werden, was ja eigentlich auch

gut aussieht, da die Ecke sozusagen weggeschossen wird.

Ach ich würd das jetzt gern gern machen, aber bin noch nicht soweit, leider.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab jetzt ein kleines Video gemacht um es zu demonstrieren. Leider nicht so tolle Qualität. Hab echt lange rumprobiert, aber ging gerade nicht besser.

Zu sehen ist vor allem, dass die Decals immer nur an Orten platziert werden, wo sie nie überlappen oder überstehen. Ausserdem werden nur 50 dargestellt und die ältesten wieder gelöscht. Das ganze ist jetzt ohne Projektoren. Bin mit dem Ergebnis so zufrieden und muss nur noch Pooling anwenden, um es abzuschliessen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...