OK we will play…
Think intersection controller
//StreetLightController.js
import System.Collections.Generic;
enum VehicleTriggerType{
main,
mainTurn,
side,
sideTurn
}
enum LightCondition{
green,
yellow,
red
}
class LightBox{
var type : VehicleTriggerType;
var green : GameObject;
var yellow : GameObject;
var red : GameObject;
}
var mainDuration : float= 20.0;
var mainTurnDuration : float= 10.0;
var sideDuration : float= 15.0;
var sideTurnDuration : float= 10.0;
var mainLights : LightBox[];
var mainTurnLights : LightBox[];
var sideLights : LightBox[];
var sideTurnLights : LightBox[];
private var main : GameObject;
private var mainTurn : GameObject;
private var side : GameObject;
private var sideTurn : GameObject;
function Start(){
if(mainDuration < 8.0) mainDuration = 8.0;
if(mainTurnDuration < 8.0) mainTurnDuration = 8.0;
if(sideDuration < 8.0) sideDuration = 8.0;
if(sideTurnDuration < 8.0) sideTurnDuration = 8.0;
SetLights(mainLights, LightCondition.green);
SetLights(mainTurnLights, LightCondition.red);
SetLights(sideLights, LightCondition.red);
SetLights(sideTurnLights, LightCondition.red);
var condition : VehicleTriggerType = VehicleTriggerType.main;
var start = Time.time;
var mainTimer : float = 0.0;
var mainTurnTimer : float = 0.0;
var sideTimer : float = 0.0;
var sideTurnTimer : float = 0.0;
while(true){
if(condition == VehicleTriggerType.main){
mainTimer = Time.time - start;
if(mainTimer > mainDuration - 5.0)
if(!mainTurn !side !sideTurn) start = Time.time - mainDuration - 5.0;
mainTimer = Time.time - start;
if(mainTimer <= mainDuration - 5.0){
SetLights(mainLights, LightCondition.green);
SetLights(mainTurnLights, LightCondition.red);
SetLights(sideLights, LightCondition.red);
SetLights(sideTurnLights, LightCondition.red);
}
if(mainTimer > mainDuration - 5.0)
SetLights(mainLights, LightCondition.yellow);
if(mainTimer>mainDuration){
if(mainTurn)condition = VehicleTriggerType.mainTurn;
if(side) condition = VehicleTriggerType.side;
if(sideTurn) condition = VehicleTriggerType.sideTurn;
start = Time.time;
}
}
if(condition == VehicleTriggerType.mainTurn){
mainTurnTimer = Time.time - start;
if(mainTurnTimer <= mainTurnDuration - 5.0){
SetLights(mainLights, LightCondition.red);
SetLights(mainTurnLights, LightCondition.green);
SetLights(sideLights, LightCondition.red);
SetLights(sideTurnLights, LightCondition.red);
}
if(mainTurnTimer > mainTurnDuration - 5.0)
SetLights(mainTurnLights, LightCondition.yellow);
if(mainTurnTimer > mainTurnDuration){
condition = VehicleTriggerType.main;
start = Time.time;
}
}
if(condition == VehicleTriggerType.side){
sideTimer = Time.time - start;
if(sideTimer <= sideDuration - 5.0){
SetLights(mainLights, LightCondition.red);
SetLights(mainTurnLights, LightCondition.red);
SetLights(sideLights, LightCondition.green);
SetLights(sideTurnLights, LightCondition.red);
}
if(sideTimer > sideDuration - 5.0)
SetLights(sideLights, LightCondition.yellow);
if(sideTimer > sideDuration){
condition = VehicleTriggerType.main;
if(mainTurn)condition = VehicleTriggerType.mainTurn;
start = Time.time;
}
}
if(condition == VehicleTriggerType.sideTurn){
sideTurnTimer = Time.time - start;
if(sideTurnTimer <= sideTurnDuration - 5.0){
SetLights(mainLights, LightCondition.red);
SetLights(mainTurnLights, LightCondition.red);
SetLights(sideLights, LightCondition.red);
SetLights(sideTurnLights, LightCondition.green);
}
if(sideTurnTimer > sideTurnDuration - 5.0)
SetLights(sideTurnLights, LightCondition.yellow);
if(sideTurnTimer > sideTurnDuration){
condition = VehicleTriggerType.side;
start = Time.time;
}
}
yield;
}
}
function SetLights(lights : LightBox[], condition : LightCondition){
for(var x : LightBox in lights){
if(x.green)x.green.active = condition == LightCondition.green;
if(x.yellow)x.yellow.active = condition == LightCondition.yellow;
if(x.red)x.red.active = condition == LightCondition.red;
}
}
function EnterTrigger(other : Collider, type : VehicleTriggerType){
switch(type){
case VehicleTriggerType.main :
main = other.gameObject;
case VehicleTriggerType.mainTurn :
mainTurn = other.gameObject;
case VehicleTriggerType.side :
side = other.gameObject;
case VehicleTriggerType.sideTurn :
sideTurn = other.gameObject;
}
}
function ExitTrigger(other : Collider, type : VehicleTriggerType){
switch(type){
case VehicleTriggerType.main :
if(main == other.gameObject) main = null;
case VehicleTriggerType.mainTurn :
if(mainTurn == other.gameObject) mainTurn = null;
case VehicleTriggerType.side :
if(side == other.gameObject) side = null;
case VehicleTriggerType.sideTurn :
if(sideTurn == other.gameObject) sideTurn = null;
}
}
Code for the blocks which tell if something is in the normal or turning lanes:
//VehicleTriggerController.js
var streetLightController : StreetLightController;
var triggerType : VehicleTriggerType = VehicleTriggerType.main;
function Start(){
if(!collider)
gameObject.AddComponent(BoxCollider);
if(renderer)
renderer.enabled = false;
collider.isTrigger = true;
}
function OnTriggerEnter(other : Collider){
if(other.gameObject.CompareTag("Vehicle"))
streetLightController.EnterTrigger(other, triggerType);
}
function OnTriggerExit(other : Collider){
if(other.gameObject.CompareTag("Vehicle"))
streetLightController.ExitTrigger(other, triggerType);
}
Basically the lights stay green on the main strip until someone enters the mainTurn, side or sideTurn triggers. It then cycles to the area it is supposed to switch to, turns the appropriate lights on and allows traffic to go though. It then cycles to the next appropriate direction and cycles that. It will do a complete turn, main, turn side if all the triggers remain active.
Pros:
You can have multiple main triggers for each direction
You can have multiple lights for each direction.