I’ve put together a simple traffic light script, it works great. It’s changing textures and shaders on the three lightbulb meshes dependig on what light is active. Now I’m gonna use this for many traffic lights in a city and I was wondering what would be the best approach. I was thinking:
- use one mesh for all the traffic lights(and control it with one script)
- or make a traffic light game object with a mesh and script and clone it?
Any thoughts apperciated
////// Trafic light script
#pragma strict
var RedMesh:Transform;
var GreenMesh:Transform;
var YellowMesh:Transform;
var Lit : Texture;
var Unlit : Texture;
var shaderNormal : Shader;
var shaderEmissive : Shader;
var Seconds:float;
var Red:float=15;
var Yellow:float=3;
var Green:float=15;
private var TrafTimer:float;
function Start () {
shaderNormal = Shader.Find( "VertexLit" );
shaderEmissive = Shader.Find( "Self-Illumin/VertexLit" );
}
function Update ()
{
TrafTimer += Seconds;
// light is red
if(TrafTimer > 0 && TrafTimer < Red)
{
RedMesh.renderer.material.SetTexture("_MainTex", Lit);
RedMesh.renderer.material.shader = shaderEmissive;
YellowMesh.renderer.material.SetTexture("_MainTex", Unlit);
YellowMesh.renderer.material.shader = shaderNormal;
GreenMesh.renderer.material.SetTexture("_MainTex", Unlit);
GreenMesh.renderer.material.shader = shaderNormal;
}
// light is yellow
if(TrafTimer > Red && TrafTimer < (Red+Yellow))
{
RedMesh.renderer.material.SetTexture("_MainTex", Unlit);
RedMesh.renderer.material.shader = shaderNormal;
YellowMesh.renderer.material.SetTexture("_MainTex", Lit);
YellowMesh.renderer.material.shader = shaderEmissive;
GreenMesh.renderer.material.SetTexture("_MainTex", Unlit);
GreenMesh.renderer.material.shader = shaderNormal;
}
// light is green
if(TrafTimer > (Red+Yellow) && TrafTimer < (Red+Yellow+Green))
{
RedMesh.renderer.material.SetTexture("_MainTex", Unlit);
RedMesh.renderer.material.shader = shaderNormal;
YellowMesh.renderer.material.SetTexture("_MainTex", Unlit);
YellowMesh.renderer.material.shader = shaderNormal;
GreenMesh.renderer.material.SetTexture("_MainTex", Lit);
GreenMesh.renderer.material.shader = shaderEmissive;
}
// light is yellow
if(TrafTimer > (Red+Yellow+Green))
{
RedMesh.renderer.material.SetTexture("_MainTex", Unlit);
RedMesh.renderer.material.shader = shaderNormal;
YellowMesh.renderer.material.SetTexture("_MainTex", Lit);
YellowMesh.renderer.material.shader = shaderEmissive;
GreenMesh.renderer.material.SetTexture("_MainTex", Unlit);
GreenMesh.renderer.material.shader = shaderNormal;
}
// Reset light
if(TrafTimer >= Red+Yellow+Green+Yellow)
{
TrafTimer=0;
}
}
function OnGUI () {
GUI.Label (Rect (20, 10, 300, 40), "timer: "+TrafTimer);
}