-
-
Save JimmyCushnie/e998cdec15394d6b68a4dbbf700f66ce to your computer and use it in GitHub Desktop.
using System.Reflection; | |
using UnityEngine; | |
using UnityEngine.Rendering; | |
using UnityEngine.Rendering.Universal; | |
using ShadowResolution = UnityEngine.Rendering.Universal.ShadowResolution; | |
/// <summary> | |
/// Enables getting/setting URP graphics settings properties that don't have built-in getters and setters. | |
/// </summary> | |
public static class UnityGraphicsBullshit | |
{ | |
private static FieldInfo MainLightCastShadows_FieldInfo; | |
private static FieldInfo AdditionalLightCastShadows_FieldInfo; | |
private static FieldInfo MainLightShadowmapResolution_FieldInfo; | |
private static FieldInfo AdditionalLightShadowmapResolution_FieldInfo; | |
private static FieldInfo Cascade2Split_FieldInfo; | |
private static FieldInfo Cascade4Split_FieldInfo; | |
private static FieldInfo SoftShadowsEnabled_FieldInfo; | |
static UnityGraphicsBullshit() | |
{ | |
var pipelineAssetType = typeof(UniversalRenderPipelineAsset); | |
var flags = BindingFlags.Instance | BindingFlags.NonPublic; | |
MainLightCastShadows_FieldInfo = pipelineAssetType.GetField("m_MainLightShadowsSupported", flags); | |
AdditionalLightCastShadows_FieldInfo = pipelineAssetType.GetField("m_AdditionalLightShadowsSupported", flags); | |
MainLightShadowmapResolution_FieldInfo = pipelineAssetType.GetField("m_MainLightShadowmapResolution", flags); | |
AdditionalLightShadowmapResolution_FieldInfo = pipelineAssetType.GetField("m_AdditionalLightsShadowmapResolution", flags); | |
Cascade2Split_FieldInfo = pipelineAssetType.GetField("m_Cascade2Split", flags); | |
Cascade4Split_FieldInfo = pipelineAssetType.GetField("m_Cascade4Split", flags); | |
SoftShadowsEnabled_FieldInfo = pipelineAssetType.GetField("m_SoftShadowsSupported", flags); | |
} | |
public static bool MainLightCastShadows | |
{ | |
get => (bool)MainLightCastShadows_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => MainLightCastShadows_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
public static bool AdditionalLightCastShadows | |
{ | |
get => (bool)AdditionalLightCastShadows_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => AdditionalLightCastShadows_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
public static ShadowResolution MainLightShadowResolution | |
{ | |
get => (ShadowResolution)MainLightShadowmapResolution_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => MainLightShadowmapResolution_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
public static ShadowResolution AdditionalLightShadowResolution | |
{ | |
get => (ShadowResolution)AdditionalLightShadowmapResolution_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => AdditionalLightShadowmapResolution_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
public static float Cascade2Split | |
{ | |
get => (float)Cascade2Split_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => Cascade2Split_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
public static Vector3 Cascade4Split | |
{ | |
get => (Vector3)Cascade4Split_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => Cascade4Split_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
public static bool SoftShadowsEnabled | |
{ | |
get => (bool)SoftShadowsEnabled_FieldInfo.GetValue(GraphicsSettings.currentRenderPipeline); | |
set => SoftShadowsEnabled_FieldInfo.SetValue(GraphicsSettings.currentRenderPipeline, value); | |
} | |
} |
Thanks for this! Saved me some time (shipped a game with this file haha)
Happy to be of service 🫡
Thank you so much!!
Coming back to this every month.
Shipped 2 projects with this, used it in 4 projects, even extended it a bit.
I am forever thankful but.... HOW IS THIS STILL NEEDED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
It truly boggles the mind how the simplest one-line changes at Unity take a decade to be implemented.
Shipped two games with this and about to ship a third with it. Thank you so much!
💜💜💜 I'm very happy it's useful to you!
Thanks @JimmyCushnie!
Any ideas how I can extend this to access the GraphicSettings too?
Tried this so far without any luck.
var graphicsSettingsAssetType = typeof(GraphicsSettings); var graphicFlags = BindingFlags.Instance | BindingFlags.NonPublic; LightmapKeepStrippingFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapStripping", graphicFlags); //Lightmap stripping LightmapKeepPlainFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapKeepPlain", graphicFlags); //Baked Non-Directional LightmapKeepDirCombinedFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapKeepDirCombined", graphicFlags); //Baked Directional LightmapKeepDynamicPlainFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapKeepDynamicPlain", graphicFlags); //Realtime Non-Directional LightmapKeepDynamicDirCombinedFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapKeepDynamicDirCombined", graphicFlags); //Realtime Directional LightmapKeepShadowMaskFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapKeepShadowMask", graphicFlags); //Baked Shadowmask LightmapKeepSubtractiveFieldInfo = graphicsSettingsAssetType.GetField("m_LightmapKeepSubtractive", graphicFlags); //Baked Subtractive
Legendary. Love the name of it too!
If anyone else needs this, here's how we ended up changing graphic settings in our case:
public static void SetToHDSettings()
{
var graphicSettingAssetDataPath = Application.dataPath.Replace("Assets", "ProjectSettings/GraphicsSettings.asset");
var graphicSettingsFileData = File.ReadAllText(graphicSettingAssetDataPath);
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapStripping: 0", "m_LightmapStripping: 1"); //Lightmap stripping - Always 1 - Custom
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapKeepPlain: 1", "m_LightmapKeepPlain: 0"); //Baked Non-Directional
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapKeepDirCombined: 0", "m_LightmapKeepDirCombined: 1"); //Baked Directional
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapKeepDynamicPlain: 1", "m_LightmapKeepDynamicPlain: 0"); //Realtime Non-Directional
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapKeepDynamicDirCombined: 1", "m_LightmapKeepDynamicDirCombined: 0"); //Realtime Directional
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapKeepShadowMask: 0", "m_LightmapKeepShadowMask: 1"); //BakedShadowMask
graphicSettingsFileData = graphicSettingsFileData.Replace("m_LightmapKeepSubtractive: 1", "m_LightmapKeepSubtractive: 0"); //BakedSubtractive
File.WriteAllText(graphicSettingAssetDataPath, graphicSettingsFileData);
Debug.LogWarning($"Set shader stripping to HD settings.ShadowMask ON. Subtractive OFF");
}
I love you
Thank you!
does this really work in player build? I understand that shader variants will be stripped during the build process, and this script should not take any effect.
Я ХОЧУ ОТ ТЕБЯ ДЕТЕЙ
Great Job! Somehow I did think that probably the staff did these shit for Commercial Thinking, they may not want UE copied them. but after these years, I think, may be the staff in Unity are just Dummy
Thank you!