Jump to content
Unity Insider Forum

Settings URP


Kojote

Recommended Posts

Hi!

Ich habe ein Frage zur URP. Ich bin gerade dabei die Settings zu schreiben, aber die Settings werden nicht übernommen.

Zum Beispiel der Code:

switch((int)shadowsDropdown.value) {
	case 0:
    	QualitySettings.shadows = ShadowQuality.Disable;
    	break;
	case 1:
        QualitySettings.shadows = ShadowQuality.HardOnly;
        break;
	case 2:
    	QualitySettings.shadows = ShadowQuality.All;
        break;
}

Die Methode wird gestartet, der Switch ist auch aktiv. Case 0, 1 und 2 werden auch ausgeführt, jedoch ändert sich an den Schatteneinstellungen nichts.

Hat jemand eine Idee woran das liegt? Ich habe jetzt nichts gefunden das man dies anders schreiben muss, wenn man auf URP umsteigt.

Grüße von Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Ganze ist nicht mehr so freundlich gestaltet und an manches kommt man zuer Laufzeit nicht heran.

Aber ich hänge dir hier mal ein Testscript rein und unten drunter erkläre ich es dir.

using UnityEngine.Rendering; // brauchst du um Rendersettings anzusprechen
using UnityEngine.Rendering.Universal; // brauchst du für den ganzen Rest 

public class Shadowtest : MonoBehaviour
{

    UniversalAdditionalCameraData AdditionalData; // für den Schatten an sich
    UniversalRenderPipelineAsset HardShadowRenderer; // ein Asset ohne softShadow
    UniversalRenderPipelineAsset SoftShadowRenderer; // ein Kopie vom Asset mit softShadow an
    [SerializeField] Volume MyGlobalVolume; // Ein Global Volume, was in der Szene sein muss
    // Testfelder
    [SerializeField] bool ShadowsOn;
    [SerializeField] bool shadowsOff;
    [SerializeField] bool makeSoft;
    [SerializeField] bool makeHard;
    [SerializeField] bool bloomOn;
    [SerializeField] bool bloomOff;
    
    private Bloom bloom;
  
    void Start()
    {
        AdditionalData = Camera.main.GetComponent<UniversalAdditionalCameraData>(); // ich hols mir direkt von der Camera. Du kannst natürlich anders machen

        AdditionalData.antialiasing = AntialiasingMode.FastApproximateAntialiasing; // oder andere Einstellungen

    }

    void Update()
    {
        if (ShadowsOn)
        {
            ShadowsOn = false;
            AdditionalData.renderShadows = true;
        }
        if (shadowsOff)
        {
            shadowsOff = false;
            AdditionalData.renderShadows = false;
        }
        if (makeSoft)
        {
            makeSoft = false;
            GraphicsSettings.renderPipelineAsset = SoftShadowRenderer; // nimm das Asset mit softshadows 
        }
        if (makeHard)
        {
            makeHard = false;
            GraphicsSettings.renderPipelineAsset = HardShadowRenderer; // nimm das Asset ohne softshadows
        }
        if (bloomOn)
        {
            bloomOn = false;
            bloom.active = true; // bloom setzen
            MyGlobalVolume.profile.TryGet(out bloom); // und übergeben
        }
        if (bloomOff)
        {
            bloomOff = false;
            bloom.active = false; 
            MyGlobalVolume.profile.TryGet(out bloom);
        }
    }
}

Also. In diesem Script ist nicht nur der Schatten, sondern auch Antialiasing und ein Bereich aus dem GlobalVolume, nämlich das Bloom.
Ich habe mir gedacht, dass du da auch die Augenbrauen heben wirst. Deswegen hab ich es mal mit eingebaut.

Den Schatten selbst schaltest du nicht mehr in irgendwelchen Qualitysettings ein, sondern bei den AdditionalCameraData. Das ist mit deiner Kamera verbunden.
Du musst ne Referenz zu dem Teil bilden und kannst dann ganz einfach über .RenderShadows die Schatten ein und ausschalten. Siehst du ja im Script.


Die Qualität der Schatten ist komplizierter. Die werden in dem UniversalRenderpipelineAsset verwaltet. Und das tolle daran ist, dass nicht alle Felder zur Laufzeit gesetzt werden können. SoftShadow ist so ein Feld. Das kannst du zur Laufzeit nur auslesen. Ander Dinge, wie zum Beispiel die Schattenweite kann man direkt einstellen.
Na ja. Du musst also ein 2tes RenderAsset erzeugen in dem du das vorhandene einfach duplizierst. Dann benennst du es um, damit du weißt was welches ist, und stellst in einem von beiden den Schatten auf Soft. Auch die beiden Assets musst du Referenzieren und kannst sie dann einfach zur Laufzeit den GraphicSettings übergeben. Es werden also einfach die beiden Assets ausgewechselt.

AntiAliasing ist wieder bei den AdditionalCameraData zu finden. Das kannst du einfach wechseln. Eines hab ich dir in der Start vorgegeben. Die anderen Optionen siehst du ja wenn du den Punkt setzt.

Bloon ist auch son Dingen. Das würde ja als Posteffekt in den GlobalSettings eingestellt. Hier kannst du aber nicht einfach auf true oder False setzen, sondern du musst das BloomObjekt (Keine Ahnung was das ist) über .active=true setzen und dann dem Global Volume komplett übergeben.
Warum man das mit TryGet(Out xxx) machen muss, weiß ich nicht. Das hab ich selber aus dem Netz, denn ich bin da auch fast dran verzweifelt.

Vielleicht weiß der @Sascha mehr über die Notwendigkeit es so anzusprechen.

Also.
Versuch mal das Testscript. Sollte alles funktionieren, wenn du alle Referenzen gebildet hast.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb malzbie:

Vielleicht weiß der @Sascha mehr über die Notwendigkeit es so anzusprechen.

Öh... ich würde jetzt einfach mal raten und sagen: Die Priorität lag auf dem Setup im Editor, damit Designer da schön alles anlegen können. Deshalb packt man ja auch nicht mehr einen Haufen Komponenten auf die Kamera, sondern erstellt PostProcessing-Profile, die man Volumen zuweist. Damit man situationsabhängig PostProcessing einstellen kann. Dass bei so einem System dann die API etwas komplexer wird und man definieren muss, wo genau man bestimmte Änderungen haben will (weil es ja nicht mehr mehr nur ein globales PostProcessing gibt), wundert mich wenig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...