HolyFot

Character/SkinnedMesh LOD C# Unity Script

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