コード例 #1
0
ファイル: AI.cs プロジェクト: belzecue/SandboxAI
        public CompleteCurrentTaskResult CompleteCurrentTask(IState state)
        {
            if (_currentTask != null)
            {
                if (!_currentTask.Terminate(state, true))
                {
                    _currentPlan = null;
                    _currentTask = null;
                    return(CompleteCurrentTaskResult.PlanFailed);
                }

                _currentTask.Apply(state);
                _currentTask = null;
            }

            if (_currentPlan == null)
            {
                return(CompleteCurrentTaskResult.NoPlan);
            }

            if (_currentTask == null && _currentPlan.Count == 0)
            {
                _currentPlan = null;
                return(CompleteCurrentTaskResult.PlanSuccess);
            }

            _currentTask = _currentPlan.Pop();

            if (!_currentTask.Check(state))
            {
                _currentPlan = null;
                _currentTask = null;
                return(CompleteCurrentTaskResult.PlanFailed);
            }

            if (!_currentTask.Execute(state))
            {
                _currentPlan = null;
                _currentTask = null;
                return(CompleteCurrentTaskResult.PlanFailed);
            }

            return(CompleteCurrentTaskResult.ContinuePlan);
        }
コード例 #2
0
ファイル: AI.cs プロジェクト: belzecue/SandboxAI
        public void Update(IState state, TaskBase rootTask)
        {
            Assert.IsNotNull(rootTask);

            if (_currentPlan == null)
            {
                if (Time.time >= _minNextPlanTime)
                {
                    _minNextPlanTime = Time.time + 0.25f;

                    var watch = System.Diagnostics.Stopwatch.StartNew();
                    // the code that you want to measure comes here

                    if (Planner.Plan(state, rootTask, out _currentPlan))
                    {
                        watch.Stop();

                        Debug.Log("Plan (took " + watch.ElapsedMilliseconds + "ms): " + _currentPlan.Aggregate("", (acc, task) => acc + task.name + ","));

                        CompleteCurrentTask(state);
                    }
                }
            }
        }
コード例 #3
0
 public override object GetValue(NodePort port)
 {
     task = GetInputValue <TaskBase>("task");
     return(this);
 }
コード例 #4
0
ファイル: Task.cs プロジェクト: belzecue/SandboxAI
 public override object GetValue(NodePort port)
 {
     task = this;
     return(this);
 }
コード例 #5
0
        public static bool Plan(IState currentState, TaskBase rootTask, out Stack <TaskBase> finalPlan)
        {
            // The setup
            Assert.IsNotNull(currentState);
            Assert.IsNotNull(rootTask);

            var plannerState = new State()
            {
                tasksToProcess = new Stack <TaskBase>(),
                finalPlan      = new List <TaskBase>(),
                workingWS      = currentState.Clone()
            };

            plannerState.tasksToProcess.Push(rootTask);
            plannerState.nextMethodIdx = 0;

            // The heist
            var decompHistory = new Stack <State>();

            while (plannerState.tasksToProcess.Count > 0)
            {
                var currentTask = plannerState.tasksToProcess.Pop();
                if (currentTask is CompoundTask currentTaskCompound)
                {
                    //Debug.Log(Padd(decompHistory) + "CT " + currentTask.name);

                    if (plannerState.nextMethodPtr != currentTaskCompound)
                    {
                        plannerState.nextMethodPtr = currentTaskCompound;
                        plannerState.nextMethodIdx = 0;
                    }

                    var satisfiedMethod = FindSatisfiedMethod(currentTaskCompound, plannerState.workingWS, ref plannerState.nextMethodIdx);
                    if (satisfiedMethod != null)
                    {
                        RecordDecompositionOfTask(plannerState, currentTaskCompound, decompHistory);

                        for (int i = satisfiedMethod.tasks.Length - 1; i >= 0; --i)
                        {
                            var t = satisfiedMethod.tasks[i];
                            plannerState.tasksToProcess.Push(t);
                        }
                    }
                    else
                    {
                        RestoreToLastDecomposedTask(ref plannerState, decompHistory, currentTaskCompound.name + " no satisfied method");
                    }
                }
                else   //Primitive Task
                       //Debug.Log(Padd(decompHistory) + "PT " + currentTask.name);

                {
                    if (currentTask.Check(plannerState.workingWS))
                    {
                        currentTask.Apply(plannerState.workingWS);
                        plannerState.finalPlan.Add(currentTask);
                    }
                    else
                    {
                        RestoreToLastDecomposedTask(ref plannerState, decompHistory, currentTask + " check failed");
                    }
                }
            }

            // Final countdown
            if (plannerState.finalPlan.Count == 0)
            {
                finalPlan = null;
                return(false);
            }

            plannerState.finalPlan.Reverse();
            finalPlan = new Stack <TaskBase>(plannerState.finalPlan);
            //Debug.Log("=== DONE ===");
            return(true);
        }