noradninja

Shader_LOD_Enumerator

Aug 10th, 2025
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.23 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3.  
  4. public class Shader_LOD_Enumerator : MonoBehaviour
  5. {
  6.     public GameObject player;
  7.     public enum LODState { Full, Reduced, VertexOnly }
  8.  
  9.     [Header("LOD Settings")]
  10.     public float[] LOD_Distance;       // [0]=full, [1]=reduced
  11.     public bool   enableShaderLOD = true;
  12.     public bool   isFoliage;
  13.     public bool   rendererDisable;
  14.     public bool isDisabled;
  15.     public Material replacementMaterial;
  16.  
  17.     // cached per‐instance
  18.     private Renderer thisRenderer;
  19.     private Material originalMaterial;
  20.     private Texture mainTex;
  21.     private Texture moarTexture;
  22.     private bool     shadowCaster;
  23.  
  24.     private Mesh originalMesh;
  25.     private Mesh replacementMesh;  // Optional: If you need a replacement mesh
  26.     private MeshFilter meshFilter;
  27.  
  28.     [HideInInspector] public LODState shaderLOD;
  29.  
  30.     // Flag to track if resources are loaded
  31.     private bool isResourcesLoaded = false;
  32.  
  33.     private void Awake()
  34.     {
  35.         thisRenderer = GetComponent<Renderer>();
  36.         meshFilter = GetComponent<MeshFilter>(); // Cache the MeshFilter component
  37.  
  38.         shadowCaster = thisRenderer.shadowCastingMode == ShadowCastingMode.On;
  39.         originalMaterial = thisRenderer.sharedMaterial;
  40.  
  41.         // Create replacement material
  42.         replacementMaterial = new Material(Shader.Find("Vita/Standard Mobile VertexLit"));
  43.         replacementMaterial.SetFloat("_Metallic", originalMaterial.GetFloat("_Metallic"));
  44.         replacementMaterial.SetFloat("_Roughness", originalMaterial.GetFloat("_Glossiness"));
  45.         replacementMaterial.SetFloat("_AlphaOn", 0); // Disable alpha clip
  46.         replacementMaterial.SetFloat("_LeavesOn", 0); // Disable movement at distance
  47.  
  48.         // Get textures for replacement material
  49.         mainTex = originalMaterial.mainTexture;
  50.         moarTexture = originalMaterial.GetTexture("_MetallicGlossMap");
  51.  
  52.         // Apply textures to replacement material
  53.         replacementMaterial.mainTexture = mainTex;
  54.         replacementMaterial.SetTexture("_MetallicGlossMap", moarTexture);
  55.  
  56.         // Store original mesh
  57.         if (meshFilter != null)
  58.         {
  59.             originalMesh = meshFilter.sharedMesh;
  60.             // Optionally create a replacement mesh (e.g., lower-quality version of the mesh)
  61.             replacementMesh = new Mesh();  // Or assign an actual mesh as needed
  62.         }
  63.     }
  64.  
  65.     private void Start()
  66.     {
  67.         // Register with the manager
  68.         LODManager.Instance.Register(this);
  69.     }
  70.  
  71.     // Called by LODManager each tick.
  72.     public void UpdateLOD(float distSqr, float farClipSqr)
  73.     {
  74.         if (!enableShaderLOD) return;
  75.  
  76.         // Check if the Renderer is null (destroyed or not assigned)
  77.         if (thisRenderer == null)
  78.         {
  79.             Debug.LogWarning("Renderer is missing or destroyed. Skipping LOD update.");
  80.             return;
  81.         }
  82.  
  83.         float fullSqr = LOD_Distance[0] * LOD_Distance[0];
  84.         float reducedSqr = LOD_Distance[1] * LOD_Distance[1];
  85.  
  86.         // Pick state
  87.         if (distSqr <= fullSqr) shaderLOD = LODState.Full;
  88.         else if (distSqr <= reducedSqr) shaderLOD = LODState.Reduced;
  89.         else shaderLOD = LODState.VertexOnly;
  90.  
  91.         switch (shaderLOD)
  92.         {
  93.             case LODState.Full:
  94.                 if (shadowCaster && thisRenderer.shadowCastingMode != ShadowCastingMode.On)
  95.                     thisRenderer.shadowCastingMode = ShadowCastingMode.On;
  96.                 break;
  97.  
  98.             case LODState.Reduced:
  99.                 thisRenderer.enabled = true;
  100.                 thisRenderer.sharedMaterial = originalMaterial;
  101.                 if (shadowCaster && thisRenderer.shadowCastingMode != ShadowCastingMode.Off)
  102.                     thisRenderer.shadowCastingMode = ShadowCastingMode.Off;
  103.                 break;
  104.  
  105.             case LODState.VertexOnly:
  106.                 thisRenderer.sharedMaterial = replacementMaterial;
  107.                 if (shadowCaster && thisRenderer.shadowCastingMode != ShadowCastingMode.Off)
  108.                     thisRenderer.shadowCastingMode = ShadowCastingMode.Off;
  109.  
  110.                 if (rendererDisable)
  111.                     thisRenderer.enabled = distSqr < farClipSqr;
  112.                     isDisabled = !thisRenderer.enabled;
  113.                     EnableRenderer(!isDisabled);
  114.                 break;
  115.         }
  116.     }
  117.  
  118.     // Manually load the textures and mesh when enabling the renderer
  119.     public void EnableRenderer(bool enable)
  120.     {
  121.         if (enable)
  122.         {
  123.             if (!isResourcesLoaded)
  124.             {
  125.                 LoadTextures();
  126.                 LoadMesh();
  127.                 isResourcesLoaded = true;
  128.             }
  129.         }
  130.         else
  131.         {
  132.             if (isResourcesLoaded)
  133.             {
  134.                 UnloadTextures();
  135.                 UnloadMesh();
  136.                 isResourcesLoaded = false;
  137.             }
  138.         }
  139.     }
  140.  
  141.     // Load textures when renderer is enabled
  142.     private void LoadTextures()
  143.     {
  144.         // Assign textures back to the material
  145.         if (thisRenderer != null && thisRenderer.sharedMaterial != null)
  146.         {
  147.             thisRenderer.sharedMaterial.mainTexture = mainTex;
  148.             thisRenderer.sharedMaterial.SetTexture("_MetallicGlossMap", moarTexture);
  149.         }
  150.  
  151.         Debug.Log("Textures Loaded");
  152.     }
  153.  
  154.     // Unload textures when renderer is disabled
  155.     private void UnloadTextures()
  156.     {
  157.         // Unassign textures to free memory
  158.         if (thisRenderer != null && thisRenderer.sharedMaterial != null)
  159.         {
  160.             thisRenderer.sharedMaterial.mainTexture = null;
  161.             thisRenderer.sharedMaterial.SetTexture("_MetallicGlossMap", null);
  162.         }
  163.  
  164.         Debug.Log("Textures Unloaded");
  165.     }
  166.  
  167.     // Load the mesh when renderer is enabled
  168.     private void LoadMesh()
  169.     {
  170.         if (meshFilter != null && originalMesh != null)
  171.         {
  172.             meshFilter.sharedMesh = originalMesh;
  173.         }
  174.         Debug.Log("Mesh Loaded");
  175.     }
  176.  
  177.     // Unload the mesh when renderer is disabled
  178.     private void UnloadMesh()
  179.     {
  180.         if (meshFilter != null)
  181.         {
  182.             meshFilter.sharedMesh = null; // Unassign the mesh to free memory
  183.         }
  184.         Debug.Log("Mesh Unloaded");
  185.     }
  186. }
  187.  
Advertisement
Add Comment
Please, Sign In to add comment