private bool CheckIfNextStateIsInPlan() { //IA2-P3 var myPlanGOAPStates = planner.GetPlan(); var myPlanStates = planner.GetPlan().Select(x => x.generatingAction.linkedState); if (myPlanStates.Any()) { var nextStatesInPlan = myPlanStates.Aggregate(new List <IState>(), (acum, state) => { //Dentro de mi plan.... if (acum.Count == 0) //Mientras que mi acumulador siga vacio { if (state == _fsm.CurrentState) //Cuando encuentre mi actual estado { acum.Add(state); //Lo agrego para que no entre mas al if. } } else { acum.Add(state); //Agrego todos los siguientes a mi actual } return(acum); //Devuelvo todos los siguientes estados. }) .Skip(1); //Menos el estado actual. List <GOAPState> fromStateToGOAPStates = new List <GOAPState>(); foreach (var state in nextStatesInPlan) { foreach (var goapState in myPlanGOAPStates) { if (goapState.generatingAction.linkedState == state) { fromStateToGOAPStates.Add(goapState); break; } } } var nextState = fromStateToGOAPStates.Aggregate(new GOAPState(), (selectedState, elem) => { Dictionary <string, bool> keyValue = elem.generatingAction.preconditions; bool canGoToState = true; foreach (var pair in keyValue) { if ([email protected][pair.Key] == pair.Value) { canGoToState = false; } } if (canGoToState) { return(elem); } if (selectedState != null) { return(selectedState); } return(null); }); if (nextState.generatingAction != null) { _fsm.CurrentState = nextState.generatingAction.linkedState; Debug.LogWarning("Cambie a un estado que ya estaba en mi plan ;)"); return(true); } } return(false); }