// Start is called before the first frame update void Start() { //DATOS EXTERNOS smellSensor = smellSensorScript.sensor; soundSensor = soundSensorScript.sensor; kinTrainer = trainerStaticData.kineticsAgent; steeringTrainer = trainerStaticData.steeringAgent; //COMENZAMOS A CONSTRUIR LA MAQUINA DE ESTADOS //1. ACCIONES: ShowIcon showPoisoned = new ShowIcon(this.gameObject, "Poisoned"); DisableIcon disablePoisoned = new DisableIcon(this.gameObject, "Poisoned"); ShowIcon showSleep = new ShowIcon(this.gameObject, "Sleeping"); DisableIcon disableSleep = new DisableIcon(this.gameObject, "Sleeping"); SetTimer setPoisonClock; SetTimer setSleepClock; ResetSensor resetSmellSensor = new ResetSensor(smellSensor); ResetSensor resetSoundSensor = new ResetSensor(soundSensor); List <ResetSensor> resets = new List <ResetSensor>() { resetSmellSensor, resetSoundSensor }; ResetSensorList resetAllSensor = new ResetSensorList(resets); UpdateMaxSpeed setOriginalSpeed = new UpdateMaxSpeed(trainerStaticData, trainerStaticData.maxspeed); UpdateMaxSpeed setSlowSpeed = new UpdateMaxSpeed(trainerStaticData, poisonedSpeed); UpdateMaxSpeed setZeroSpeed = new UpdateMaxSpeed(trainerStaticData, 0f); SetAngularSpeed setAngularToZero = new SetAngularSpeed(kinTrainer, 0f); SetAngularAccel setAngularAccelToZero = new SetAngularAccel(steeringTrainer, 0f); //accion para deshabilitar todos scripts de interes mientras dormimos List <DisableScript> disables = new List <DisableScript>(); foreach (var script in scriptsToDisable) { disables.Add(new DisableScript(script)); } DisableScriptList disableScripts = new DisableScriptList(disables); //accion para habilitar todos los script de interes si despertamos List <EnableScript> enables = new List <EnableScript>(); foreach (var script in scriptsToDisable) { enables.Add(new EnableScript(script)); } EnableScriptList enableScripts = new EnableScriptList(enables); //2. ESTADOS: List <Action> entryActions; //aqui iremos guardanndo todas las acciondes de entrada List <Action> exitActions; //aqui iremos guardanndo todas las acciones de salida List <Action> actions; //aqui guardaremos todas las acciones intermedias //2.a estado donde estamos sanos entryActions = new List <Action>(); //al entrar al estado ponemos un corazon actions = new List <Action>(); //durante el estado perseguimos al enamorado exitActions = new List <Action>(); //al salir quitamos el corazon State healthyState = new State(actions, entryActions, exitActions); //2.b estado donde estamos envenenados entryActions = new List <Action>() { showPoisoned, setSlowSpeed }; //al entrar al estado ponemos un corazon actions = new List <Action>(); //durante el estado perseguimos al enamorado exitActions = new List <Action>() { disablePoisoned, resetAllSensor, setOriginalSpeed }; //al salir quitamos el corazon State poisonedState = new State(actions, entryActions, exitActions); //2.c estado donde estamos dormidos entryActions = new List <Action>() { showSleep, setZeroSpeed, disableScripts, setAngularAccelToZero, setAngularToZero }; //al entrar al estado ponemos un corazon actions = new List <Action>(); //durante el estado perseguimos al enamorado //al salir debemos: // quitar el icono de dormir, resetear el sensor de sonido, reset el sensor de aroma porque puede haber un sweet // volver a habilitar lo que se deba exitActions = new List <Action>() { disableSleep, resetAllSensor, setOriginalSpeed, enableScripts }; //al salir quitamos el corazon State sleepState = new State(actions, entryActions, exitActions); //3. CONDICIONES: SmelledSomething smelledPoison = new SmelledSomething(smellSensor, "Poison"); SmelledSomething smelledSweet = new SmelledSomething(smellSensor, "Sweet"); HeardSleepSong heardSong = new HeardSleepSong(soundSensor); TimeOut poisonClock = new TimeOut(poisonTimer); setPoisonClock = new SetTimer(poisonClock); TimeOut sleepClock = new TimeOut(sleepTimer); setSleepClock = new SetTimer(sleepClock); //4. TRANSICIONES: List <Action> noActions = new List <Action>(); List <Action> transitionActions; transitionActions = new List <Action>() { setPoisonClock }; Transition gotPoisoned = new Transition(smelledPoison, transitionActions, poisonedState); Transition poisonTimeOut = new Transition(poisonClock, noActions, healthyState); Transition sweetScent = new Transition(smelledSweet, noActions, healthyState); transitionActions = new List <Action>() { setSleepClock }; Transition gotSlept = new Transition(heardSong, transitionActions, sleepState); Transition sleepTimeOut = new Transition(sleepClock, noActions, healthyState); //4.1 AGREGAMOS TRANSICIONES A ESTADOS List <Transition> transitions; transitions = new List <Transition>() { gotPoisoned, gotSlept };; healthyState.transitions = transitions; poisonedState.transitions = new List <Transition>() { poisonTimeOut, sweetScent }; sleepState.transitions = new List <Transition>() { sleepTimeOut, sweetScent }; //5 MAQUINA DE ESTADOS State[] states = new State[] { healthyState, poisonedState, sleepState }; trainerStatusMachine = new StateMachine(states, healthyState); }
void Start() { //INICIALIZAMOS LA DATA DEL EXTERIOR kinOctillery = octillery.kineticsAgent; steeringOctillery = octillery.steeringAgent; defaulAngularSpeed = kinOctillery.rotation; kineticsTrainer = trainer.kineticsAgent; kineticsRival = rival.kineticsAgent; sightSensor = sightSensorScript.sensor; Kinetics[] targets = new Kinetics[2]; targets[0] = kineticsTrainer; targets[1] = kineticsRival; //obstacles List <Transform> obstacles_list = new List <Transform>(); GameObject[] obstaclesGo = GameObject.FindGameObjectsWithTag("Obstacle"); for (int i = 0; i < obstaclesGo.Length; i++) { obstacles_list.Add(obstaclesGo[i].GetComponent <Transform>()); } obstacles = obstacles_list.ToArray(); //COMENZAMOS A CONSTRUIR LA MAQUINA DE ESTADOS //1. ACCIONES: ShowIcon showExclamation = new ShowIcon(this.gameObject, "Exclamation"); DisableIcon disableExclamation = new DisableIcon(this.gameObject, "Exclamation"); SetAngularSpeed setAngularToZero = new SetAngularSpeed(kinOctillery, 0f); SetAngularSpeed setAngularToDefault = new SetAngularSpeed(kinOctillery, defaulAngularSpeed); SetAngularAccel setAngularAccelToZero = new SetAngularAccel(steeringOctillery, 0f); ResetSensor resetSightSensor = new ResetSensor(sightSensor); FaceToSeenTarget faceTarget = new FaceToSeenTarget(sightSensor, kinOctillery, steeringOctillery); ShootInk shootInkToTarget = new ShootInk(transform, inkBallPrefab, inkSpeed, inkScreen, sightSensor, targets, obstacles); //2. ESTADOS: List <Action> entryActions; //aqui iremos guardanndo todas las acciondes de entrada List <Action> exitActions; //aqui iremos guardanndo todas las acciones de salida List <Action> actions; //aqui guardaremos todas las acciones intermedias //2.a estado para seguir camino entryActions = new List <Action>() { setAngularToDefault, setAngularAccelToZero }; actions = new List <Action>(); exitActions = new List <Action>(); State guardState = new State(actions, entryActions, exitActions); entryActions = new List <Action>() { showExclamation, setAngularToZero }; actions = new List <Action>() { faceTarget, shootInkToTarget }; exitActions = new List <Action>() { disableExclamation }; State shootState = new State(actions, entryActions, exitActions); //3. CONDICIONES: // octillery solo disparara si ve un humano SawSomething sawHuman = new SawSomething(sightSensor, "Human"); // octillery solo entrara en guardia de nuevo si no hay humanos en su cono de vision NoInSightCone noHumanInCone = new NoInSightCone(sightSensor); //4. TRANSICIONES: List <Action> noActions = new List <Action>(); List <Action> transitionsActions; transitionsActions = new List <Action>() { resetSightSensor }; Transition noHumanInConeSight = new Transition(noHumanInCone, transitionsActions, guardState); Transition humanSeen = new Transition(sawHuman, noActions, shootState); //4.1 AGREGAMOS TRANSICIONES A ESTADOS List <Transition> transitions = new List <Transition>() { humanSeen }; guardState.transitions = transitions; transitions = new List <Transition>() { noHumanInConeSight }; shootState.transitions = transitions; //5 MAQUINA DE ESTADOS State[] states = new State[] { guardState, shootState }; octilleryMachine = new StateMachine(states, guardState); }