HolyFot

Simple Object LOD C# Unity Script

Jan 6th, 2020
113
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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×