HolyFot

Character/SkinnedMesh LOD C# Unity Script

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

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.

×