HolyFot

Simple Object LOD C# Unity Script

Jan 6th, 2020
96
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using UnityEngine;
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. //[ExecuteInEditMode]
  6. public class SimpleLOD : MonoBehaviour
  7. {
  8.     public Mesh LOD0;
  9.     public Mesh LOD1;
  10.     public Mesh LOD2;
  11.     public Mesh LOD3;
  12.  
  13.     public List<Material> LOD_0_Materials;
  14.     public List<Material> LOD_1_Materials;
  15.     public List<Material> LOD_2_Materials;
  16.     public List<Material> LOD_3_Materials;
  17.  
  18.     public float lod0Dist = 10f;
  19.     public float lod1Dist = 20f;
  20.     public float lod2Dist = 30f;
  21.     public float lod3Dist = 50f;
  22.     public float lodTimer = 0.3f;
  23.  
  24.     public Camera camera1;
  25.     private bool foundCamera;
  26.     public int currLOD;
  27.     private float currTimer;
  28.  
  29.  
  30.     public void Start()
  31.     {
  32.         GetCamera();
  33.         currLOD = 0;
  34.     }
  35.  
  36.     void Update()
  37.     {
  38.         if (foundCamera == false)
  39.             GetCamera();
  40.  
  41.         //Update LODs Timer
  42.         currTimer -= Time.deltaTime;
  43.         if (currTimer <= 0.0f)
  44.         {
  45.             UpdateMeshLOD();
  46.             currTimer = lodTimer; //Reset Timer
  47.         }
  48.     }
  49.  
  50.     public void UpdateMeshLOD()
  51.     {
  52.         if (camera1 == null) return;
  53.  
  54.         Vector3 camPos1 = camera1.transform.position;
  55.  
  56.         if ((transform.position - camPos1).sqrMagnitude < (lod0Dist * QualitySettings.lodBias) * (lod0Dist * QualitySettings.lodBias)) //LOD 0
  57.         {
  58.             if (currLOD != 0)
  59.             {
  60.                 SetLowestLODMesh(QualitySettings.maximumLODLevel);
  61.                 SetLODMaterials(QualitySettings.maximumLODLevel);
  62.                 currLOD = 0;
  63.                 return;
  64.             }
  65.         }
  66.         else if ((transform.position - camPos1).sqrMagnitude < (lod1Dist * QualitySettings.lodBias) * (lod1Dist * QualitySettings.lodBias)) //LOD 1
  67.         {
  68.             if (currLOD != 1)
  69.             {
  70.                 SetLowestLODMesh(QualitySettings.maximumLODLevel + 1);
  71.                 SetLODMaterials(GetLowestLODMats(QualitySettings.maximumLODLevel + 1));
  72.                 currLOD = 1;
  73.                 return;
  74.             }
  75.         }
  76.         else if ((transform.position - camPos1).sqrMagnitude < (lod2Dist * QualitySettings.lodBias) * (lod2Dist * QualitySettings.lodBias)) //LOD 2
  77.         {
  78.             if (currLOD != 2)
  79.             {
  80.                 SetLowestLODMesh(QualitySettings.maximumLODLevel + 2);
  81.                 SetLODMaterials(GetLowestLODMats(QualitySettings.maximumLODLevel + 2));
  82.                 currLOD = 2;
  83.                 return;
  84.             }
  85.         }
  86.         else if ((transform.position - camPos1).sqrMagnitude < (lod3Dist * QualitySettings.lodBias) * (lod3Dist * QualitySettings.lodBias)) //LOD 3
  87.         {
  88.             if (currLOD != 3)
  89.             {
  90.                 SetLowestLODMesh(QualitySettings.maximumLODLevel + 3);
  91.                 SetLODMaterials(GetLowestLODMats(QualitySettings.maximumLODLevel + 3));
  92.                 currLOD = 3;
  93.                 return;
  94.             }
  95.         }
  96.     }
  97.  
  98.     public void SetLODMaterials(int lod)
  99.     {
  100.         Material[] currMats;
  101.         bool wasSuccess = false;
  102.  
  103.         switch (lod)
  104.         {
  105.             case 0: //LOD 0
  106.                 if (LOD_0_Materials.Count > 0)
  107.                 {
  108.                     int existingMatsCount = 0;
  109.                     currMats = new Material[LOD_0_Materials.Count];
  110.                     for (var x = 0; x < LOD_0_Materials.Count; x++)
  111.                     {
  112.                         currMats[x] = LOD_0_Materials[x];
  113.                         if (LOD_0_Materials[x] != null)
  114.                             existingMatsCount++;
  115.                     }
  116.                     if (existingMatsCount / LOD_0_Materials.Count > 0.5f) //Atleast 50% of materials exist
  117.                     {
  118.                         GetComponent<Renderer>().sharedMaterials = currMats;
  119.                         wasSuccess = true;
  120.                     }
  121.                 }
  122.                 break;
  123.             case 1:
  124.                 if (LOD_1_Materials.Count > 0)
  125.                 {
  126.                     int existingMatsCount = 0;
  127.                     currMats = new Material[LOD_1_Materials.Count];
  128.                     for (var x = 0; x < LOD_1_Materials.Count; x++)
  129.                     {
  130.                         currMats[x] = LOD_1_Materials[x];
  131.                         if (LOD_1_Materials[x] != null)
  132.                             existingMatsCount++;
  133.                     }
  134.                     if (existingMatsCount / LOD_1_Materials.Count > 0.5f) //Atleast 50% of materials exist
  135.                     {
  136.                         GetComponent<Renderer>().sharedMaterials = currMats;
  137.                         wasSuccess = true;
  138.                     }
  139.                 }
  140.                 break;
  141.             case 2:
  142.                 if (LOD_2_Materials.Count > 0)
  143.                 {
  144.                     int existingMatsCount = 0;
  145.                     currMats = new Material[LOD_2_Materials.Count];
  146.                     for (var x = 0; x < LOD_2_Materials.Count; x++)
  147.                     {
  148.                         currMats[x] = LOD_2_Materials[x];
  149.                         if (LOD_2_Materials[x] != null)
  150.                             existingMatsCount++;
  151.                     }
  152.                     if (existingMatsCount / LOD_2_Materials.Count > 0.5f) //Atleast 50% of materials exist
  153.                     {
  154.                         GetComponent<Renderer>().sharedMaterials = currMats;
  155.                         wasSuccess = true;
  156.                     }
  157.                 }
  158.                 break;
  159.             case 3:
  160.                 if (LOD_3_Materials.Count > 0)
  161.                 {
  162.                     int existingMatsCount = 0;
  163.                     currMats = new Material[LOD_3_Materials.Count];
  164.                     for (var x = 0; x < LOD_3_Materials.Count; x++)
  165.                     {
  166.                         currMats[x] = LOD_3_Materials[x];
  167.                         if (LOD_3_Materials[x] != null)
  168.                             existingMatsCount++;
  169.                     }
  170.                     if (existingMatsCount / LOD_3_Materials.Count > 0.5f) //Atleast 50% of materials exist
  171.                     {
  172.                         GetComponent<Renderer>().sharedMaterials = currMats;
  173.                         wasSuccess = true;
  174.                     }
  175.                 }
  176.                 break;
  177.         }
  178.  
  179.         if (wasSuccess)
  180.             Debug.Log("[SimpleLOD] " + this.transform.root.name + " Swapped LOD Mats to: " + lod);
  181.     }
  182.  
  183.     public int GetLowestLODMats(int desired)
  184.     {
  185.         if (desired >= 3)
  186.         {
  187.             if (LOD_3_Materials.Count > 0)
  188.                 return 3;
  189.             if (LOD_2_Materials.Count > 0)
  190.                 return 2;
  191.             if (LOD_1_Materials.Count > 0)
  192.                 return 1;
  193.             if (LOD_0_Materials.Count > 0)
  194.                 return 0;
  195.         }
  196.         if (desired == 2)
  197.         {
  198.             if (LOD_2_Materials.Count > 0)
  199.                 return 2;
  200.             if (LOD_1_Materials.Count > 0)
  201.                 return 1;
  202.             if (LOD_0_Materials.Count > 0)
  203.                 return 0;
  204.         }
  205.         if (desired == 1)
  206.         {
  207.             if (LOD_1_Materials.Count > 0)
  208.                 return 1;
  209.             if (LOD_0_Materials.Count > 0)
  210.                 return 0;
  211.         }
  212.         if (desired == 0)
  213.         {
  214.             if (LOD_0_Materials.Count > 0)
  215.                 return 0;
  216.         }
  217.         return 0;
  218.     }
  219.  
  220.     public void SetLowestLODMesh(int desired)
  221.     {
  222.         MeshFilter mf1 = GetComponent<MeshFilter>();
  223.         if (desired >= 3)
  224.         {
  225.             if (LOD3 != null)
  226.                 mf1.sharedMesh = LOD3;
  227.             if (LOD2 != null)
  228.                 mf1.sharedMesh = LOD2;
  229.             if (LOD1 != null)
  230.                 mf1.sharedMesh = LOD1;
  231.             if (LOD0 != null)
  232.                 mf1.sharedMesh = LOD0;
  233.         }
  234.         if (desired == 2)
  235.         {
  236.             if (LOD2 != null)
  237.                 mf1.sharedMesh = LOD2;
  238.             if (LOD1 != null)
  239.                 mf1.sharedMesh = LOD1;
  240.             if (LOD0 != null)
  241.                 mf1.sharedMesh = LOD0;
  242.         }
  243.         if (desired == 1)
  244.         {
  245.             if (LOD1 != null)
  246.                 mf1.sharedMesh = LOD1;
  247.             if (LOD0 != null)
  248.                 mf1.sharedMesh = LOD0;
  249.         }
  250.         if (desired == 0)
  251.             if (LOD0 != null)
  252.                 mf1.sharedMesh = LOD0;
  253.     }
  254.  
  255.     public void GetCamera()
  256.     {
  257.         try
  258.         {
  259.             camera1 = Camera.main;
  260.             foundCamera = true;
  261.         }
  262.         catch (Exception e)
  263.         {
  264.             Debug.Log("[SimpleLOD] Couldn't find Main Camera: " + e.Message);
  265.         }
  266.     }
  267. }
RAW Paste Data