lod

  1. //以下是简单lod的核心脚本,主要是功能就是通过距离来判断哪些东西隐藏 哪些东西显示  
  2.   
  3.   
  4. // *********************************************************************  
  5. // Speed LOD manager, set for 5 LOD  
  6. // (c) Nikko /Unity3dx.com  
  7. // All Rights reserved  
  8. // http://unity3dx.com  
  9. //*********************************************************************  
  10. // How to use: this script needs to be attached to the LOD prefab.  
  11.   
  12. //@script ExecuteInEditMode  
  13.   
  14.  private enum _Nikko_LOD_LEVEL { LOD0, LOD1, LOD2, LOD3, LOD4,LOD5}  
  15.  public var nlod:int;  
  16.     public var lodMesh0 : GameObject;  
  17.     public var lodMesh1 : GameObject;  
  18.     public var lodMesh2 : GameObject;         
  19.  public var lodMesh3 : GameObject;     
  20.  public var lodMesh4 : GameObject;     
  21.  public var mycam : Camera;     
  22.  public var delaycounter:int;  
  23.  public var distancehide:float;  
  24.   
  25.     public var distanceLOD1 : float;  
  26.     public var distanceLOD2 : float;         
  27.  public var distanceLOD3 : float;    
  28.  public var distanceLOD4 : float;      
  29.    
  30.     private var currentLOD : _Nikko_LOD_LEVEL= _Nikko_LOD_LEVEL.LOD4;   
  31.  private var counter:int;  
  32.   
  33.  function getLODNbr()  
  34.  {  
  35.   return nlod;  
  36.  }  
  37.  function setLODNbr(v:int)  
  38.  {  
  39.   nlod=v;  
  40.  }  
  41.  function getComponentName()  
  42.  {  
  43.   return "Nikko_LODManager5";  
  44.  }  
  45.   
  46.   
  47. // Library to access internal values of the LOD manager.  
  48.  function setLOD(l:int)  
  49.  {  
  50.   switch (l)  
  51.   {  
  52.    case _Nikko_LOD_LEVEL.LOD0:  
  53.     lodMesh0.SetActiveRecursively(true);  
  54.     lodMesh1.SetActiveRecursively(false);  
  55.     lodMesh2.SetActiveRecursively(false);      
  56.     if (nlod>3) lodMesh3.SetActiveRecursively(false);  
  57.     if (nlod>4) lodMesh4.SetActiveRecursively(false);      
  58.    break;  
  59.    case _Nikko_LOD_LEVEL.LOD1:  
  60.     lodMesh0.SetActiveRecursively(false);  
  61.     lodMesh1.SetActiveRecursively(true);  
  62.     lodMesh2.SetActiveRecursively(false);      
  63.     if (nlod>3) lodMesh3.SetActiveRecursively(false);  
  64.     if (nlod>4) lodMesh4.SetActiveRecursively(false);      
  65.    break;  
  66.    case _Nikko_LOD_LEVEL.LOD2:  
  67.     lodMesh0.SetActiveRecursively(false);  
  68.     lodMesh1.SetActiveRecursively(false);  
  69.     lodMesh2.SetActiveRecursively(true);      
  70.     if (nlod>3) lodMesh3.SetActiveRecursively(false);  
  71.     if (nlod>4) lodMesh4.SetActiveRecursively(false);      
  72.    break;  
  73.    case _Nikko_LOD_LEVEL.LOD3:  
  74.     lodMesh0.SetActiveRecursively(false);  
  75.     lodMesh1.SetActiveRecursively(false);  
  76.     lodMesh2.SetActiveRecursively(false);      
  77.     if (nlod>3) lodMesh3.SetActiveRecursively(true);  
  78.     if (nlod>4) lodMesh4.SetActiveRecursively(false);      
  79.    break;  
  80.    case _Nikko_LOD_LEVEL.LOD4:  
  81.     lodMesh0.SetActiveRecursively(false);  
  82.     lodMesh1.SetActiveRecursively(false);  
  83.     lodMesh2.SetActiveRecursively(false);      
  84.     if (nlod>3) lodMesh3.SetActiveRecursively(false);  
  85.     if (nlod>4) lodMesh4.SetActiveRecursively(true);      
  86.    break;       
  87.    case _Nikko_LOD_LEVEL.LOD5:  
  88.     lodMesh0.SetActiveRecursively(false);  
  89.     lodMesh1.SetActiveRecursively(false);  
  90.     lodMesh2.SetActiveRecursively(false);      
  91.     if (nlod>3) lodMesh3.SetActiveRecursively(false);      
  92.     if (nlod>4) lodMesh4.SetActiveRecursively(false);  
  93.    break;     
  94.    default:  
  95.     lodMesh0.SetActiveRecursively(false);  
  96.     lodMesh1.SetActiveRecursively(false);  
  97.     lodMesh2.SetActiveRecursively(false);      
  98.     if (nlod>3) lodMesh3.SetActiveRecursively(false);  
  99.     if (nlod>4) lodMesh4.SetActiveRecursively(false);  
  100.   }  
  101.  }  
  102.    
  103.   // Library to access internal values of the LOD manager.  
  104.  function setDistanceLOD(lod:int,dist:float)  
  105.  {  
  106.   switch (lod)  
  107.   {  
  108.    case _Nikko_LOD_LEVEL.LOD0:  
  109.     distanceLOD0=dist;  
  110.    break;  
  111.    case _Nikko_LOD_LEVEL.LOD1:  
  112.     distanceLOD1=dist;  
  113.    break;  
  114.    case _Nikko_LOD_LEVEL.LOD2:  
  115.     distanceLOD2=dist;  
  116.    break;  
  117.    case _Nikko_LOD_LEVEL.LOD3:  
  118.     distanceLOD3=dist;  
  119.    break;     
  120.    case _Nikko_LOD_LEVEL.LOD4:  
  121.     distanceLOD4=dist;  
  122.    break;  
  123.    default:  
  124.    Debug.LogError("SetDistanceLOD: Wrong LOD value");return;  
  125.       
  126.   }  
  127.  }  
  128.    
  129.  // Change the time when this LOD script will execute.  
  130.  function SetCounter(c:int)  
  131.  {  
  132.   counter=c;  
  133.  }  
  134.    
  135.    
  136.     function Start()  
  137.     {  
  138.   // spread the autoupdate within the range of the delay counter variable so that each LOD check itself every x number of frames.  
  139.   counter=Random.Range(1, delaycounter);  
  140.   // check if some object are too far, if yes, disable them  
  141.   var distanceFromObject : float = Vector3.Distance(transform.position, mycam.transform.position);  
  142.   if (distanceFromObject  > distancehide)   
  143.   {  
  144.     switch (nlod) // each LOD (3,4,5) has to be done separately  
  145.     {  
  146.     case 3:  
  147.      currentLOD = _Nikko_LOD_LEVEL.LOD3;  
  148.      lodMesh0.SetActiveRecursively(false);  
  149.      lodMesh1.SetActiveRecursively(false);  
  150.      lodMesh2.SetActiveRecursively(false);      
  151.     break;  
  152.     case 4:  
  153.      currentLOD = _Nikko_LOD_LEVEL.LOD4;  
  154.      lodMesh0.SetActiveRecursively(false);  
  155.      lodMesh1.SetActiveRecursively(false);  
  156.      lodMesh2.SetActiveRecursively(false);      
  157.      lodMesh3.SetActiveRecursively(false);      
  158.     break;     
  159.     case 5:  
  160.      currentLOD = _Nikko_LOD_LEVEL.LOD5;  
  161.      lodMesh0.SetActiveRecursively(false);  
  162.      lodMesh1.SetActiveRecursively(false);  
  163.      lodMesh2.SetActiveRecursively(false);      
  164.      lodMesh3.SetActiveRecursively(false);      
  165.      lodMesh4.SetActiveRecursively(false);  
  166.     break;  
  167.    }  
  168.   }      
  169.     }  
  170.    
  171.     function LateUpdate()   
  172.  {    
  173.     
  174.   /*if (currentLOD == _Nikko_LOD_LEVEL.LOD0)  
  175.   {  
  176.    // we are on the closest LOD  
  177.    // place here your real time effect, for your closest objects, like wind, movements, animations.  
  178.   }  
  179.   */   
  180.   counter=counter-1;  
  181.   // check that we are at the time we need to check ourself and maybe change our LOD  
  182.   if (counter<0)  
  183.   {  
  184.    counter=delaycounter;  
  185.    // quick method to calculate the distance with the camera.  
  186.    var distanceFromObject : float = Vector3.Distance(transform.position, mycam.transform.position);  
  187.     
  188.    switch (nlod) // each LOD (3,4,5) has to be done separately  
  189.    {  
  190.      
  191.         //************************   LOD 3 *************************  
  192.     case 3:  
  193.      // LOD0 is set here  
  194.      if (distanceFromObject < distanceLOD1 && currentLOD != _Nikko_LOD_LEVEL.LOD0)  
  195.      {  
  196.       currentLOD = _Nikko_LOD_LEVEL.LOD0;  
  197.       lodMesh0.SetActiveRecursively(true);  
  198.       lodMesh1.SetActiveRecursively(false);  
  199.       lodMesh2.SetActiveRecursively(false);       
  200.       return;  
  201.   
  202.         
  203.      }  
  204.      // LOD 1 is set here  
  205.      else if (distanceFromObject >= distanceLOD1 && distanceFromObject < distanceLOD2 && currentLOD != _Nikko_LOD_LEVEL.LOD1)  
  206.      {  
  207.       currentLOD = _Nikko_LOD_LEVEL.LOD1;  
  208.       lodMesh0.SetActiveRecursively(false);  
  209.       lodMesh1.SetActiveRecursively(true);  
  210.       lodMesh2.SetActiveRecursively(false);  
  211.       return;  
  212.   
  213.      }  
  214.      // LOD 2 is set here.  
  215.      else if (distanceFromObject >= distanceLOD2 && distanceFromObject  < distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD2)  
  216.      {  
  217.       currentLOD = _Nikko_LOD_LEVEL.LOD2;  
  218.       lodMesh0.SetActiveRecursively(false);  
  219.       lodMesh1.SetActiveRecursively(false);  
  220.       lodMesh2.SetActiveRecursively(true);     
  221.       return;  
  222.      }      
  223.      else if (distanceFromObject  > distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD5)  
  224.      {  
  225.       // again if we are here, this object has gone too far: disable it!  
  226.       currentLOD = _Nikko_LOD_LEVEL.LOD3;  
  227.       lodMesh0.SetActiveRecursively(false);  
  228.       lodMesh1. (false);  
  229.       lodMesh2.SetActiveRecursively(false);     
  230.       return;  
  231.      }  
  232.     break;  
  233.       //************************   LOD 4 *************************  
  234.     case 4:  
  235.      // LOD0 is set here  
  236.      if (distanceFromObject < distanceLOD1 && currentLOD != _Nikko_LOD_LEVEL.LOD0)  
  237.      {  
  238.       currentLOD = _Nikko_LOD_LEVEL.LOD0;  
  239.       lodMesh0.SetActiveRecursively(true);  
  240.       lodMesh1.SetActiveRecursively(false);  
  241.       lodMesh2.SetActiveRecursively(false);      
  242.       lodMesh3.SetActiveRecursively(false);    
  243.       return;  
  244.   
  245.         
  246.      }  
  247.      // LOD 1 is set here  
  248.      else if (distanceFromObject >= distanceLOD1 && distanceFromObject < distanceLOD2 && currentLOD != _Nikko_LOD_LEVEL.LOD1)  
  249.      {  
  250.       currentLOD = _Nikko_LOD_LEVEL.LOD1;  
  251.       lodMesh0.SetActiveRecursively(false);  
  252.       lodMesh1.SetActiveRecursively(true);  
  253.       lodMesh2.SetActiveRecursively(false);  
  254.       lodMesh3.SetActiveRecursively(false);   
  255.       return;  
  256.   
  257.      }  
  258.      // LOD 2 is set here.  
  259.      else if (distanceFromObject >= distanceLOD2 && distanceFromObject  < distanceLOD3 && currentLOD != _Nikko_LOD_LEVEL.LOD2)  
  260.      {  
  261.       currentLOD = _Nikko_LOD_LEVEL.LOD2;  
  262.       lodMesh0.SetActiveRecursively(false);  
  263.       lodMesh1.SetActiveRecursively(false);  
  264.       lodMesh2.SetActiveRecursively(true);    
  265.       lodMesh3.SetActiveRecursively(false);    
  266.       return;  
  267.      }     
  268.      // LOD 3 is set here.  
  269.      else if (distanceFromObject >= distanceLOD3 && distanceFromObject  < distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD3)  
  270.      {  
  271.       currentLOD = _Nikko_LOD_LEVEL.LOD3;  
  272.       lodMesh0.SetActiveRecursively(false);  
  273.       lodMesh1.SetActiveRecursively(false);  
  274.       lodMesh2.SetActiveRecursively(false);    
  275.       lodMesh3.SetActiveRecursively(true);  
  276.     
  277.       return;  
  278.      }     
  279.      else if (distanceFromObject  > distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD5)  
  280.      {  
  281.       // again if we are here, this object has gone too far: disable it!  
  282.       currentLOD = _Nikko_LOD_LEVEL.LOD4;  
  283.       lodMesh0.SetActiveRecursively(false);  
  284.       lodMesh1.SetActiveRecursively(false);  
  285.       lodMesh2.SetActiveRecursively(false);   
  286.       lodMesh3.SetActiveRecursively(false);      
  287.       return;  
  288.      }  
  289.     break;  
  290.      
  291.     //************************   LOD 5 *************************  
  292.     case 5:  
  293.      // LOD0 is set here  
  294.      if (distanceFromObject < distanceLOD1 && currentLOD != _Nikko_LOD_LEVEL.LOD0)  
  295.      {  
  296.       currentLOD = _Nikko_LOD_LEVEL.LOD0;  
  297.       lodMesh0.SetActiveRecursively(true);  
  298.       lodMesh1.SetActiveRecursively(false);  
  299.       lodMesh2.SetActiveRecursively(false);      
  300.       lodMesh3.SetActiveRecursively(false);  
  301.       lodMesh4.SetActiveRecursively(false);     
  302.       return;  
  303.   
  304.         
  305.      }  
  306.      // LOD 1 is set here  
  307.      else if (distanceFromObject >= distanceLOD1 && distanceFromObject < distanceLOD2 && currentLOD != _Nikko_LOD_LEVEL.LOD1)  
  308.      {  
  309.       currentLOD = _Nikko_LOD_LEVEL.LOD1;  
  310.       lodMesh0.SetActiveRecursively(false);  
  311.       lodMesh1.SetActiveRecursively(true);  
  312.       lodMesh2.SetActiveRecursively(false);  
  313.       lodMesh3.SetActiveRecursively(false);   
  314.       lodMesh4.SetActiveRecursively(false);     
  315.       return;  
  316.   
  317.      }  
  318.      // LOD 2 is set here.  
  319.      else if (distanceFromObject >= distanceLOD2 && distanceFromObject  < distanceLOD3 && currentLOD != _Nikko_LOD_LEVEL.LOD2)  
  320.      {  
  321.       currentLOD = _Nikko_LOD_LEVEL.LOD2;  
  322.       lodMesh0.SetActiveRecursively(false);  
  323.       lodMesh1.SetActiveRecursively(false);  
  324.       lodMesh2.SetActiveRecursively(true);    
  325.       lodMesh3.SetActiveRecursively(false);  
  326.       lodMesh4.SetActiveRecursively(false);     
  327.       return;  
  328.      }     
  329.      // LOD 3 is set here.  
  330.      else if (distanceFromObject >= distanceLOD3 && distanceFromObject  < distanceLOD4 && currentLOD != _Nikko_LOD_LEVEL.LOD3)  
  331.      {  
  332.       currentLOD = _Nikko_LOD_LEVEL.LOD3;  
  333.       lodMesh0.SetActiveRecursively(false);  
  334.       lodMesh1.SetActiveRecursively(false);  
  335.       lodMesh2.SetActiveRecursively(false);    
  336.       lodMesh3.SetActiveRecursively(true);  
  337.       lodMesh4.SetActiveRecursively(false);     
  338.       return;  
  339.      }     
  340.      // LOD 4 is set here.  
  341.      else if (distanceFromObject >= distanceLOD4 && distanceFromObject  < distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD4)  
  342.      {  
  343.       currentLOD = _Nikko_LOD_LEVEL.LOD4;  
  344.       lodMesh0.SetActiveRecursively(false);  
  345.       lodMesh1.SetActiveRecursively(false);  
  346.       lodMesh2.SetActiveRecursively(false);    
  347.       lodMesh3.SetActiveRecursively(true);  
  348.       lodMesh4.SetActiveRecursively(false);     
  349.       return;  
  350.      }  
  351.      else if (distanceFromObject  > distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD5)  
  352.      {  
  353.       // again if we are here, this object has gone too far: disable it!  
  354.       currentLOD = _Nikko_LOD_LEVEL.LOD5;  
  355.       lodMesh0.SetActiveRecursively(false);  
  356.       lodMesh1.SetActiveRecursively(false);  
  357.       lodMesh2.SetActiveRecursively(false);   
  358.       lodMesh3.SetActiveRecursively(false);    
  359.       lodMesh4.SetActiveRecursively(false);     
  360.       return;  
  361.      }  
  362.     break;  
  363.      
  364.    }  
  365.     
  366.   }     
  367.    
  368.   
  369.  }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值