//Accion normal public UtilityAction(string name, Action action, Factor factor, UtilitySystemEngine utilityCurvesEngine) { this.HasSubmachine = false; this.factor = factor; this.utilityState = new State(name, action, utilityCurvesEngine); this.uCurvesEngine = utilityCurvesEngine; }
//Acción con submáquina public UtilityAction(State utilState, Factor factor, UtilitySystemEngine uSystemEngine, BehaviourEngine subMachine) { this.HasSubmachine = true; this.utilityState = utilState; this.factor = factor; this.uCurvesEngine = uSystemEngine; this.subMachine = subMachine; }
//Acción de salida para árboles de comportamiento (sale a nodo hoja) con una acción a ejecutar y esperando a que el valor devuelto sea diferente de Running public UtilityAction(string name, Factor factor, Action ac, Func <ReturnValues> valueReturned, UtilitySystemEngine utilityCurvesEngine, BehaviourTreeEngine behaviourTreeEngine) { this.HasSubmachine = false; this.utilityState = new State(name, ac, utilityCurvesEngine); this.factor = factor; this.uCurvesEngine = utilityCurvesEngine; this.valueReturned = valueReturned; this.bt = behaviourTreeEngine; }
//Acción de salida para árboles de comportamiento (sale a nodo hoja instantáneamente) public UtilityAction(string name, Factor factor, ReturnValues valueReturned, UtilitySystemEngine utilityCurvesEngine, BehaviourTreeEngine behaviourTreeEngine) { this.HasSubmachine = false; Action action = () => { new Transition("Exit_Action_Transition", this.utilityState, new PushPerception(this.uCurvesEngine), this.uCurvesEngine.NodeToReturn, valueReturned, behaviourTreeEngine, this.uCurvesEngine) .FireTransition(); }; this.utilityState = new State(name, action, utilityCurvesEngine); this.factor = factor; this.uCurvesEngine = utilityCurvesEngine; }
// Start is called before the first frame update private void Start() { behaviourTree = new BehaviourTreeEngine(BehaviourEngine.IsNotASubmachine); utilityCurves = new UtilitySystemEngine(BehaviourEngine.IsASubmachine); stateMachine = new StateMachineEngine(BehaviourEngine.IsASubmachine); recipe = GameObject.FindGameObjectWithTag("Recipe"); recipeAnimator = recipe.GetComponent <Animator>(); handler = transform.GetChild(5).gameObject; meshAgent = GetComponent <NavMeshAgent>(); pizzasCreated = 0; pepperoniCreated = 0; CreateStateMachine(); CreateUtilityCurves(); CreateBehaviourTree(); }
/// <summary> /// Creates a new <see cref="Transition"/> that exits from any Behaviour Engine to a Utility Engine. ONLY exits to Utility Machines /// </summary> /// <param name="transitionName">The name of the transition</param> /// <param name="stateFrom">The <see cref="State"/> where the transition comes from (only submachine's state)</param> /// <param name="perception">The <see cref="Perception"/> that will trigger the transition</param> /// <param name="superMachine">The <see cref="UtilitySystemEngine"/> where the transition goes to (only entry super machine state)</param> /// <returns></returns> public Transition CreateExitTransition(string transitionName, State stateFrom, Perception perception, UtilitySystemEngine superMachine) { if (!transitions.ContainsKey(transitionName)) { State stateTo = superMachine.GetEntryState(); Transition exitTransition = new Transition(transitionName, stateFrom, perception, stateTo, superMachine, this); // Transition managed by the sub-state machine transitions.Add(transitionName, exitTransition); return(exitTransition); } else { throw new DuplicateWaitObjectException(transitionName, "The transition already exists in the behaviour engine"); } }
static public void Main(String[] args) { subUtilMachine = new UtilitySystemEngine(true, 1.15f); utilEngine = new UtilitySystemEngine(false); float[] f = { 1.0f, 1.0f }; p = new Player(2.0f, f); p1 = new Player(5.0f, f); p2 = new Player(9.0f, new float[] { 3.0f, 0.0f }); p3 = new Player(9.0f, new float[] { 4.0f, 0.0f }); CreateSubmachine(); CreateMainMachine(); // Update tick emulation (e.g like Unity) // ELAPSED crea hilos System.Timers.Timer tmr = new System.Timers.Timer(); tmr.Interval = 100; tmr.AutoReset = false; tmr.Elapsed += (s, e) => { subUtilMachine.Update(); utilEngine.Update(); tmr.Enabled = true; }; tmr.Enabled = true; // To prevent the app closing // Si se usa EspacioPerception hay que pulsar dos veces espacio para que haga caso while (true) { ConsoleKeyInfo k = System.Console.ReadKey(); if (k.Key == ConsoleKey.UpArrow) { p.life += 1.0f; Console.WriteLine("Vida de P: " + p.life); } else if (k.Key == ConsoleKey.DownArrow) { p.life -= 1.0f; Console.WriteLine("Vida de P: " + p.life); } else if (k.Key == ConsoleKey.LeftArrow) { p1.life -= 1.0f; Console.WriteLine("Vida de P1: " + p1.life); } else if (k.Key == ConsoleKey.RightArrow) { p1.life += 1.0f; Console.WriteLine("Vida de P1: " + p1.life); } else if (k.Key == ConsoleKey.O) { p2.position[0]++; Console.WriteLine("Posicion P2: " + p2.position[0]); } else if (k.Key == ConsoleKey.L) { p2.position[0]--; Console.WriteLine("Posicion P2: " + p2.position[0]); } } ; }