void Behave() { //Sequence for going in an open door DebugTask openDebug = new DebugTask("Going through open door sequence"); ConditionalIsTrue doorOpenCheck = new ConditionalIsTrue(door.isOpen); ArriveToTarget goInRoom = new ArriveToTarget(arrive, roomNavTarget); Task[] openDoorSystem = new Task[3]; openDoorSystem[0] = openDebug; openDoorSystem[1] = doorOpenCheck; openDoorSystem[2] = goInRoom; Sequence doorOpenSequence = new Sequence(openDoorSystem); //Sequence for going in closed door DebugTask closedDebug = new DebugTask("Going through closed door sequence"); ArriveToTarget goToDoor = new ArriveToTarget(arrive, doorNavTarget); ConditionalIsTrue tryOpeningDoor = new ConditionalIsTrue(door.TryOpening()); OpenDoor openTheDoorUp = new OpenDoor(door); //As is, these arrives don't have timing so it will seem like just going into the room ArriveToTarget advanceIntoRoom = new ArriveToTarget(arrive, roomNavTarget); Task[] closedDoorSystem = new Task[5]; closedDoorSystem[0] = closedDebug; closedDoorSystem[1] = goToDoor; closedDoorSystem[2] = tryOpeningDoor; closedDoorSystem[3] = openTheDoorUp; closedDoorSystem[4] = advanceIntoRoom; Sequence closedDoorSequence = new Sequence(closedDoorSystem); //Sequence for going in locked door //Can just reuse goToDoor! DebugTask lockedDebug = new DebugTask("Going through locked door sequence"); ConditionalIsFalse tryOpeningDoorFalse = new ConditionalIsFalse(door.TryOpening()); BustDoor burstIn = new BustDoor(door); //Can reuse advanceIntoRoom as well! Task[] lockedDoorSystem = new Task[5]; lockedDoorSystem[0] = lockedDebug; lockedDoorSystem[1] = goToDoor; lockedDoorSystem[2] = tryOpeningDoorFalse; lockedDoorSystem[3] = burstIn; lockedDoorSystem[4] = advanceIntoRoom; Sequence lockedDoorSequence = new Sequence(lockedDoorSystem); //Make a selector to try to go in closed door before locked Task[] closedDoorOptions = new Task[2]; closedDoorOptions[0] = closedDoorSequence; closedDoorOptions[1] = lockedDoorSequence; Selector closedProtocols = new Selector(closedDoorOptions); //Make a selector to try to go in the open door before closed ones Task[] overallDoorProtocols = new Task[2]; overallDoorProtocols[0] = doorOpenSequence; overallDoorProtocols[1] = closedProtocols; Selector overallDoorOptions = new Selector(overallDoorProtocols); overallDoorOptions.run(); }
public float radiusRun = 15f; //radio para huir void Start() { //INICIALIZAMOS LA DATA DEL EXTERIOR kinGlameow = glameow.kineticsAgent; steeringGlameow = glameow.steeringAgent; kineticsTarget = target.kineticsAgent; kineticsTrainer = trainer.kineticsAgent; kineticsRival = rival.kineticsAgent; Vector3 center = (kinGlameow.transform.position + kineticsTarget.transform.position) / 2; //COMENZAMOS A CONSTRUIR LA MAQUINA DE ESTADOS //1. ACCIONES: //este es seek pero en verdad como meowth le hace seek tambien pareciera que huye FollowTarget seekTarget = new FollowTarget(steeringGlameow, kinGlameow, kineticsTarget, maxSeekAccel); //el target es null porque todavia no sabemos cual trainer se acercara ArriveToTarget arriveTrainer = new ArriveToTarget(steeringGlameow, kinGlameow, null, MaxAccelerationArrive, glameow.maxspeed, targetRadiusArrive, slowRadiusArrive); Kinetics[] targets = new Kinetics[2]; targets[0] = kineticsTrainer; targets[1] = kineticsRival; SetArriveTarget setTrainer = new SetArriveTarget(targets, arriveTrainer); //seek closes StopMoving stop = new StopMoving(kinGlameow, steeringGlameow); ShowIcon showHeart = new ShowIcon(this.gameObject, "Heart"); DisableIcon disableHeart = new DisableIcon(this.gameObject, "Heart"); ShowIcon showSweat = new ShowIcon(this.gameObject, "Sweat"); DisableIcon disableSweat = new DisableIcon(this.gameObject, "Sweat"); ShowIcon showExclamation = new ShowIcon(this.gameObject, "Exclamation"); DisableIcon disableExclamation = new DisableIcon(this.gameObject, "Exclamation"); //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 huir de anamorado (meowth) entryActions = new List <Action>() { showSweat }; //al entrar al estado ponemos un corazon actions = new List <Action>() { seekTarget }; //durante el estado perseguimos al enamorado exitActions = new List <Action>() { disableSweat }; //al salir quitamos el corazon State stalked = new State(actions, entryActions, exitActions); //2.b estado para alertarse de entrenador cercano entryActions = new List <Action>() { showExclamation, stop }; //al entrar al estado debemos mostrar un signo de exclamacion actions = new List <Action>(); exitActions = new List <Action>() { disableExclamation }; //al salir quitamos el signo State alert = new State(actions, entryActions, exitActions); //2.c estado para perseguir enamorado al entrenador entryActions = new List <Action> { setTrainer, showHeart }; actions = new List <Action>() { arriveTrainer }; exitActions = new List <Action> { disableHeart }; State stalkTrainer = new State(actions, entryActions, exitActions); //3. CONDICIONES: TooCloseToPoint closeCenterTrainer = new TooCloseToPoint(center, kineticsTrainer, radiusAlert); TooClose closeTrainer = new TooClose(kinGlameow, kineticsTrainer, radiusAlert); TooClose veryCloseTrainer = new TooClose(kinGlameow, kineticsTrainer, radiusRun); TooCloseToPoint closeCenterRival = new TooCloseToPoint(center, kineticsRival, radiusAlert); TooClose closeRival = new TooClose(kinGlameow, kineticsRival, radiusAlert); TooClose veryCloseRival = new TooClose(kinGlameow, kineticsRival, radiusRun); //Estas son las que de verdad necesitamos OrCondition anyTargetCloseCenter = new OrCondition(closeCenterRival, closeCenterTrainer); OrCondition anyTargetClose = new OrCondition(closeTrainer, closeRival); OrCondition anyTargetVeryClose = new OrCondition(veryCloseRival, veryCloseTrainer); NotCondition noOneClose = new NotCondition(anyTargetClose); List <Action> noActions = new List <Action>(); //4. TRANSICIONES: Transition anyHumanClose = new Transition(anyTargetCloseCenter, noActions, alert); Transition noHumanClose = new Transition(noOneClose, noActions, stalkTrainer); Transition anyHumanVeryClose = new Transition(anyTargetVeryClose, noActions, stalkTrainer); //4.1 AGREGAMOS TRANSICIONES A ESTADOS List <Transition> transitions = new List <Transition>() { anyHumanClose }; stalked.transitions = transitions; transitions = new List <Transition>() { noHumanClose, anyHumanVeryClose }; alert.transitions = transitions; transitions = new List <Transition>(); stalkTrainer.transitions = transitions; //5 MAQUINA DE ESTADOS State[] states = new State[] { stalked, alert, stalkTrainer }; glameowMachine = new StateMachine(states, stalked); }
public SetArriveTarget(Kinetics[] Targets, ArriveToTarget Arrive) { targets = Targets; arrive = Arrive; }