//以下是簡單lod的核心腳本,主要是功能就是通過距離來判斷哪些東西隐藏 哪些東西顯示
// *********************************************************************
// Speed LOD manager, set for 5 LOD
// (c) Nikko /Unity3dx.com
// All Rights reserved
// http://unity3dx.com
//*********************************************************************
// How to use: this script needs to be attached to the LOD prefab.
//@script ExecuteInEditMode
private enum _Nikko_LOD_LEVEL { LOD0, LOD1, LOD2, LOD3, LOD4,LOD5}
public var nlod:int;
public var lodMesh0 : GameObject;
public var lodMesh1 : GameObject;
public var lodMesh2 : GameObject;
public var lodMesh3 : GameObject;
public var lodMesh4 : GameObject;
public var mycam : Camera;
public var delaycounter:int;
public var distancehide:float;
public var distanceLOD1 : float;
public var distanceLOD2 : float;
public var distanceLOD3 : float;
public var distanceLOD4 : float;
private var currentLOD : _Nikko_LOD_LEVEL= _Nikko_LOD_LEVEL.LOD4;
private var counter:int;
function getLODNbr()
{
return nlod;
}
function setLODNbr(v:int)
{
nlod=v;
}
function getComponentName()
{
return "Nikko_LODManager5";
}
// Library to access internal values of the LOD manager.
function setLOD(l:int)
{
switch (l)
{
case _Nikko_LOD_LEVEL.LOD0:
lodMesh0.SetActiveRecursively(true);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
if (nlod>3) lodMesh3.SetActiveRecursively(false);
if (nlod>4) lodMesh4.SetActiveRecursively(false);
break;
case _Nikko_LOD_LEVEL.LOD1:
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(true);
lodMesh2.SetActiveRecursively(false);
if (nlod>3) lodMesh3.SetActiveRecursively(false);
if (nlod>4) lodMesh4.SetActiveRecursively(false);
break;
case _Nikko_LOD_LEVEL.LOD2:
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(true);
if (nlod>3) lodMesh3.SetActiveRecursively(false);
if (nlod>4) lodMesh4.SetActiveRecursively(false);
break;
case _Nikko_LOD_LEVEL.LOD3:
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
if (nlod>3) lodMesh3.SetActiveRecursively(true);
if (nlod>4) lodMesh4.SetActiveRecursively(false);
break;
case _Nikko_LOD_LEVEL.LOD4:
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
if (nlod>3) lodMesh3.SetActiveRecursively(false);
if (nlod>4) lodMesh4.SetActiveRecursively(true);
break;
case _Nikko_LOD_LEVEL.LOD5:
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
if (nlod>3) lodMesh3.SetActiveRecursively(false);
if (nlod>4) lodMesh4.SetActiveRecursively(false);
break;
default:
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
if (nlod>3) lodMesh3.SetActiveRecursively(false);
if (nlod>4) lodMesh4.SetActiveRecursively(false);
}
}
// Library to access internal values of the LOD manager.
function setDistanceLOD(lod:int,dist:float)
{
switch (lod)
{
case _Nikko_LOD_LEVEL.LOD0:
distanceLOD0=dist;
break;
case _Nikko_LOD_LEVEL.LOD1:
distanceLOD1=dist;
break;
case _Nikko_LOD_LEVEL.LOD2:
distanceLOD2=dist;
break;
case _Nikko_LOD_LEVEL.LOD3:
distanceLOD3=dist;
break;
case _Nikko_LOD_LEVEL.LOD4:
distanceLOD4=dist;
break;
default:
Debug.LogError("SetDistanceLOD: Wrong LOD value");return;
}
}
// Change the time when this LOD script will execute.
function SetCounter(c:int)
{
counter=c;
}
function Start()
{
// spread the autoupdate within the range of the delay counter variable so that each LOD check itself every x number of frames.
counter=Random.Range(1, delaycounter);
// check if some object are too far, if yes, disable them
var distanceFromObject : float = Vector3.Distance(transform.position, mycam.transform.position);
if (distanceFromObject > distancehide)
{
switch (nlod) // each LOD (3,4,5) has to be done separately
{
case 3:
currentLOD = _Nikko_LOD_LEVEL.LOD3;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
break;
case 4:
currentLOD = _Nikko_LOD_LEVEL.LOD4;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
break;
case 5:
currentLOD = _Nikko_LOD_LEVEL.LOD5;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
lodMesh4.SetActiveRecursively(false);
break;
}
}
}
function LateUpdate()
{
/*if (currentLOD == _Nikko_LOD_LEVEL.LOD0)
{
// we are on the closest LOD
// place here your real time effect, for your closest objects, like wind, movements, animations.
}
*/
counter=counter-1;
// check that we are at the time we need to check ourself and maybe change our LOD
if (counter<0)
{
counter=delaycounter;
// quick method to calculate the distance with the camera.
var distanceFromObject : float = Vector3.Distance(transform.position, mycam.transform.position);
switch (nlod) // each LOD (3,4,5) has to be done separately
{
//************************ LOD 3 *************************
case 3:
// LOD0 is set here
if (distanceFromObject < distanceLOD1 && currentLOD != _Nikko_LOD_LEVEL.LOD0)
{
currentLOD = _Nikko_LOD_LEVEL.LOD0;
lodMesh0.SetActiveRecursively(true);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
return;
}
// LOD 1 is set here
else if (distanceFromObject >= distanceLOD1 && distanceFromObject < distanceLOD2 && currentLOD != _Nikko_LOD_LEVEL.LOD1)
{
currentLOD = _Nikko_LOD_LEVEL.LOD1;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(true);
lodMesh2.SetActiveRecursively(false);
return;
}
// LOD 2 is set here.
else if (distanceFromObject >= distanceLOD2 && distanceFromObject < distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD2)
{
currentLOD = _Nikko_LOD_LEVEL.LOD2;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(true);
return;
}
else if (distanceFromObject > distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD5)
{
// again if we are here, this object has gone too far: disable it!
currentLOD = _Nikko_LOD_LEVEL.LOD3;
lodMesh0.SetActiveRecursively(false);
lodMesh1. (false);
lodMesh2.SetActiveRecursively(false);
return;
}
break;
//************************ LOD 4 *************************
case 4:
// LOD0 is set here
if (distanceFromObject < distanceLOD1 && currentLOD != _Nikko_LOD_LEVEL.LOD0)
{
currentLOD = _Nikko_LOD_LEVEL.LOD0;
lodMesh0.SetActiveRecursively(true);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
return;
}
// LOD 1 is set here
else if (distanceFromObject >= distanceLOD1 && distanceFromObject < distanceLOD2 && currentLOD != _Nikko_LOD_LEVEL.LOD1)
{
currentLOD = _Nikko_LOD_LEVEL.LOD1;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(true);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
return;
}
// LOD 2 is set here.
else if (distanceFromObject >= distanceLOD2 && distanceFromObject < distanceLOD3 && currentLOD != _Nikko_LOD_LEVEL.LOD2)
{
currentLOD = _Nikko_LOD_LEVEL.LOD2;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(true);
lodMesh3.SetActiveRecursively(false);
return;
}
// LOD 3 is set here.
else if (distanceFromObject >= distanceLOD3 && distanceFromObject < distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD3)
{
currentLOD = _Nikko_LOD_LEVEL.LOD3;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(true);
return;
}
else if (distanceFromObject > distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD5)
{
// again if we are here, this object has gone too far: disable it!
currentLOD = _Nikko_LOD_LEVEL.LOD4;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
return;
}
break;
//************************ LOD 5 *************************
case 5:
// LOD0 is set here
if (distanceFromObject < distanceLOD1 && currentLOD != _Nikko_LOD_LEVEL.LOD0)
{
currentLOD = _Nikko_LOD_LEVEL.LOD0;
lodMesh0.SetActiveRecursively(true);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
lodMesh4.SetActiveRecursively(false);
return;
}
// LOD 1 is set here
else if (distanceFromObject >= distanceLOD1 && distanceFromObject < distanceLOD2 && currentLOD != _Nikko_LOD_LEVEL.LOD1)
{
currentLOD = _Nikko_LOD_LEVEL.LOD1;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(true);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
lodMesh4.SetActiveRecursively(false);
return;
}
// LOD 2 is set here.
else if (distanceFromObject >= distanceLOD2 && distanceFromObject < distanceLOD3 && currentLOD != _Nikko_LOD_LEVEL.LOD2)
{
currentLOD = _Nikko_LOD_LEVEL.LOD2;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(true);
lodMesh3.SetActiveRecursively(false);
lodMesh4.SetActiveRecursively(false);
return;
}
// LOD 3 is set here.
else if (distanceFromObject >= distanceLOD3 && distanceFromObject < distanceLOD4 && currentLOD != _Nikko_LOD_LEVEL.LOD3)
{
currentLOD = _Nikko_LOD_LEVEL.LOD3;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(true);
lodMesh4.SetActiveRecursively(false);
return;
}
// LOD 4 is set here.
else if (distanceFromObject >= distanceLOD4 && distanceFromObject < distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD4)
{
currentLOD = _Nikko_LOD_LEVEL.LOD4;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(true);
lodMesh4.SetActiveRecursively(false);
return;
}
else if (distanceFromObject > distancehide && currentLOD != _Nikko_LOD_LEVEL.LOD5)
{
// again if we are here, this object has gone too far: disable it!
currentLOD = _Nikko_LOD_LEVEL.LOD5;
lodMesh0.SetActiveRecursively(false);
lodMesh1.SetActiveRecursively(false);
lodMesh2.SetActiveRecursively(false);
lodMesh3.SetActiveRecursively(false);
lodMesh4.SetActiveRecursively(false);
return;
}
break;
}
}
}