private IActorTask HandleBypassMode() { if (_moveTask == null) { return(CreateBypassMoveTask()); } else { if (!_moveTask.IsComplete) { // Если команда на перемещение к целевой точке патруля не закончена, тогда продолжаем её. return(_moveTask); } // Команда на перемещение к целевой точке патруля закончена. // Нужно выбрать следующую целевую точку и создать команду на простой. _patrolPointIndex++; if (_patrolPointIndex >= _patrolRoute.Points.Count()) { _patrolPointIndex = 0; } _moveTask = null; _idleTask = new IdleTask(_actor, _decisionSource); _mode = PatrolMode.Idle; return(_idleTask); } }
public void ExecuteTest() { // ARRANGE var actorMock = new Mock <IActor>(); var actor = actorMock.Object; var decisionSourceMock = new Mock <IDecisionSource>(); decisionSourceMock.Setup(x => x.SelectIdleDuration(It.IsAny <int>(), It.IsAny <int>())) .Returns(1); var decisionSource = decisionSourceMock.Object; var task = new IdleTask(actor, decisionSource); // ACT task.Execute(); // ASSERT task.IsComplete.Should().Be(true); }
public void Test1() { IdleTask it = new IdleTask(); it.TimerStart(); Thread.Sleep(10000); it.TimerStop(); }
public void Test1() { IdleTask it = new IdleTask(); Task t = new Task(() => it.TimerStart()); t.Start(); t.Wait(10000); it.TimerStop(); }
public virtual void InitializeTasks() { IdleTask.Enable(); ProductionTask.Enable(); WorkerTask.Enable(); ConstructionTask.Enable(); MorphingTask.Enable(); WorkerDefenseTask.Enable(); }
private IActorTask HandleBypassMode() { if (_moveTask == null) { _moveTask = CreateBypassMoveTask(); if (_moveTask != null) { return(_moveTask); } else { // Это может произойти, если актёр не выбрал следующий узел. // Тогда переводим актёра в режим ожидания. _idleTask = new IdleTask(Actor, DecisionSource); _mode = Mode.Idle; return(_idleTask); } } else { if (!_moveTask.IsComplete) { // Если команда на перемещение к целевой точке патруля не закончена, // тогда продолжаем её. // Предварительно проверяем, не мешает ли что-либо её продолжить выполнять. if (!_moveTask.CanExecute()) { _moveTask = CreateBypassMoveTask(); } if (_moveTask != null) { return(_moveTask); } _idleTask = new IdleTask(Actor, DecisionSource); _mode = Mode.Idle; return(_idleTask); } // Команда на перемещение к целевому узлу закончена. // Нужно выбрать следующую целевую точку и создать команду на простой. ProcessMovementComplete(); _moveTask = null; _idleTask = new IdleTask(Actor, DecisionSource); _mode = Mode.Idle; return(_idleTask); } }
public virtual void InitializeTasks() { IdleTask.Enable(); ProductionTask.Enable(); WorkerTask.Enable(); ConstructionTask.Enable(); MorphingTask.Enable(); WorkerDefenseTask.Enable(); if (Tyr.Bot.MyRace == Race.Terran) { ConstructingSCVsTask.Enable(); } GasWorkerTask.Enable(); }
public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData) { if (IdleTask == null) { IdleTask = new IdleTask(actor, _decisionSource); } if (IdleTask.IsComplete) { Complete = true; return(null); } return(IdleTask); }
public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData) { if (MoveTask == null) { MoveTask = CreateBypassMoveTask(actor, strategyData); if (MoveTask != null) { return(MoveTask); } else { // Это может произойти, если актёр не выбрал следующий узел. // Тогда переводим актёра в режим ожидания. IdleTask = new IdleTask(actor, DecisionSource); return(IdleTask); } } else { if (!MoveTask.IsComplete) { // Если команда на перемещение к целевой точке патруля не закончена, // тогда продолжаем её. // Предварительно проверяем, не мешает ли что-либо её продолжить выполнять. if (!MoveTask.CanExecute()) { MoveTask = CreateBypassMoveTask(actor, strategyData); } if (MoveTask != null) { return(MoveTask); } IdleTask = new IdleTask(actor, DecisionSource); return(IdleTask); } else { Complete = true; return(null); } } }
AIBehaviour m_aibehaviourThis; //The Behaviour to be used for this AI // Use this for initialization void Start() { m_aimodelThis = GetComponent <AIModel>(); //Initialize the model #pragma warning disable 0219 //From here on the Behaviourtree is constructed; For more info on this you can find a graphic of the tree: m_aibehaviourThis = new AIBehaviour(m_aimodelThis); { Selector selectorIdleOrAction = new Selector(m_aibehaviourThis); { Sequence sequenceConditionsOrIdle = new Sequence(selectorIdleOrAction); { //if the player is dead => idle //if the player is not dead and not in range => idle //if the payer is not dead and in range => idle Selector selectorDeadOrNotInRange = new Selector(sequenceConditionsOrIdle); Condition_PlayerDead conditionDead = new Condition_PlayerDead(selectorDeadOrNotInRange, m_aibehaviourThis); Inverter inverterNotInRange = new Inverter(selectorDeadOrNotInRange); Condition_InDetectionRange conditionInRange = new Condition_InDetectionRange(inverterNotInRange, m_aibehaviourThis); IdleTask idleTask = new IdleTask(sequenceConditionsOrIdle, m_aibehaviourThis); } Selector selectorFleeOrFight = new Selector(selectorIdleOrAction); { Sequence sequenceConditionsThenFlee = new Sequence(selectorFleeOrFight); { Selector selectorTimerOrHealth = new Selector(sequenceConditionsThenFlee); { Condition_FleeTimerRunning conditionFleeDelay = new Condition_FleeTimerRunning(selectorTimerOrHealth, m_aibehaviourThis); Condition_HealthLow conditionHealthHighEnough = new Condition_HealthLow(selectorTimerOrHealth, m_aibehaviourThis); } FleeTask fleetask = new FleeTask(sequenceConditionsThenFlee, m_aibehaviourThis); } AttackTask attackTask = new AttackTask(selectorFleeOrFight, m_aibehaviourThis); } } } #pragma warning restore 0219 m_aibehaviourThis.StartBehaviour(); //After constructing the Behaviour, start it InvokeRepeating("UpdateAIBehaviour", m_fTickRate, m_fTickRate); //Start regularly updating the AI after one "tick" //Subscribe to the Model to see if it is Dead in order to stop ticking m_aimodelThis.m_modelstateCurrent .Where(m_modelstateCurrent => m_modelstateCurrent == ModelState.Dead) .Subscribe(m_modelstateCurrent => CancelInvoke()); }
public override IActorTask GetTask(IActor actor, ISectorTaskSourceContext context, ILogicStrategyData strategyData) { if (_idleTask == null) { var taskContext = new ActorTaskContext(context.Sector); _idleTask = new IdleTask(actor, taskContext, _decisionSource); } if (_idleTask.IsComplete) { Complete = true; return(null); } return(_idleTask); }
//TODO На этот метод нужен тест. private IActorTask HandleIdleMode() { if (_idleTask == null) { _idleTask = new IdleTask(_actor, _decisionSource); } else { // Ожидание окончено, нужно двигаться к следующей точке. if (_idleTask.IsComplete) { _idleTask = null; return(HandleBypassMode()); } } return(_idleTask); }
private IActorTask HandleBypassMode() { if (_roamingTask == null) { return(CreateBypassMoveTask()); } else { if (!_roamingTask.IsComplete) { // Если команда на перемещение к целевой точке патруля не закончена, тогда продолжаем её. return(_roamingTask); } _roamingTask = null; _idleTask = new IdleTask(_actor, _decisionSource); _mode = IdleMode.Idle; return(_idleTask); } }
public IActorTask GetCurrentTask() { // На каждом шаге осматриваем окрестности // на предмет нарушителей. var intruders = CheckForIntruders(); var orderedIntruders = intruders.OrderBy(x => Map.DistanceBetween(Actor.Node, x.Node)); var nearbyIntruder = orderedIntruders.FirstOrDefault(); if (nearbyIntruder != null) { _mode = Mode.Pursuit; _targetIntruder = nearbyIntruder; _idleTask = null; ProcessIntruderDetected(); } else { if (_idleTask == null || _idleTask.IsComplete) { _mode = Mode.Bypass; _targetIntruder = null; _idleTask = null; } } switch (_mode) { case Mode.Bypass: return(HandleBypassMode()); case Mode.Pursuit: return(HandlePersuitMode()); case Mode.Idle: return(HandleIdleMode()); default: throw new InvalidOperationException($"Неизвестный режим {_mode}"); } }
public IActorTask GetCurrentTask() { // На каждом шаге осматриваем окрестности // напредмет нарушителей. var intruders = CheckForIntruders(); var nearbyIntruder = intruders.FirstOrDefault(); if (nearbyIntruder != null) { _mode = PatrolMode.Pursuit; _targetIntruder = nearbyIntruder; _idleTask = null; _patrolPointIndex = null; } else if (_idleTask?.IsComplete == true) { _mode = PatrolMode.Bypass; _targetIntruder = null; _idleTask = null; } switch (_mode) { case PatrolMode.Bypass: return(HandleBypassMode()); case PatrolMode.Pursuit: return(HandlePersiutMode()); case PatrolMode.Idle: return(HandleIdleMode()); default: throw new InvalidOperationException($"Неизвестный режим патруллирования {_mode}"); } }
public CmdManager(IdleTask idleTask) : base(idleTask) { }
protected override void ResetData() { _moveTask = null; _idleTask = null; }
/// <summary> /// Создаёт задачу на произвольное брожение. /// </summary> /// <returns> Возвращает команду на перемещение. </returns> private IActorTask CreateBypassMoveTask() { _roamingTask = new IdleTask(_actor, _decisionSource); return(_roamingTask); }
protected override void ResetData() { IdleTask = null; }