Is this a good way to make a traffic light?

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:

  1. use one mesh for all the traffic lights(and control it with one script)
  2. or make a traffic light game object with a mesh and script and clone it?

Any thoughts apperciated :slight_smile:

////// 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);
    
}

Uhm, well, good for what? You might want to take a look at my answer on this similar question.

Generally there are many ways how something can be done. In your code it would make more sense to declare your “Red/Yellow/GreenMesh” variables as Renderer and not Transform. Using the “.renderer” shortcut-property adds unnecessary overhead.

Next thing is it would make more sense to simply use seperate materials (6 mats so 2 for each color).