-
-
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); | |
} | |
} |
Dude, thank you very much for this solution =) and indeed, it's UnityGraphicsBullshit
Cheers, I'm glad it helped you.
Thank you dude, awesome you fixed something Unity struggled to fix for eternity (and still struggles). Also love the naming convention.
Thank you!
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
I hereby release this code into the public domain. Do whatever you want to with it.