// called in another thread private void OnDonePlan(GoapPlannerThread plannerThread, PlanWork work, IReGoapGoal newGoal) { work.NewGoal = newGoal; lock (doneWorks) { doneWorks.Add(work); #if DEBUG if (work.NewGoal != null) { ReGoapLogger.Log("[GoapPlannerManager] Done calculating plan, actions list:"); var i = 0; foreach (var action in work.NewGoal.GetPlan()) { ReGoapLogger.Log(string.Format("{0}: {1}", i++, action.Action)); } } #endif } }
protected virtual void Awake() { if (Instance != null) { Destroy(this); var errorString = "[GoapPlannerManager] Trying to instantiate a new manager but there can be only one per scene."; ReGoapLogger.LogError(errorString); throw new UnityException(errorString); } Instance = this; doneWorks = new List <PlanWork>(); worksQueue = new Queue <PlanWork>(); planners = new GoapPlannerThread[ThreadsCount]; threads = new Thread[ThreadsCount]; threadEvents = new AutoResetEvent(false); if (ThreadsCount > 1) { ReGoapLogger.Log("[GoapPlannerManager] Running in multi-thread mode."); for (int i = 0; i < ThreadsCount; i++) { planners[i] = new GoapPlannerThread(threadEvents, PlannerSettings, worksQueue, OnDonePlan); var thread = new Thread(planners[i].MainLoop) { IsBackground = true }; thread.Start(); threads[i] = thread; } } // no threads run else { ReGoapLogger.Log("[GoapPlannerManager] Running in single-thread mode."); planners[0] = new GoapPlannerThread(threadEvents, PlannerSettings, worksQueue, OnDonePlan); } }