Exemple #1
0
    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();
    }
Exemple #2
0
    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;
 }