Exemplo n.º 1
0
 public void Clear()
 {
     while (_actions.Count > 0)
     {
         GOAPActionFactory.Collect(_actions.Dequeue());
     }
 }
Exemplo n.º 2
0
 public void Release()
 {
     if (AgentAction != null)
     {
         AgentAction.GoapAction = null;
     }
     GOAPActionFactory.Collect(this);
 }
Exemplo n.º 3
0
 public void AddAction(E_GOAPAction action)
 {
     m_Actions.Add(action, GOAPActionFactory.Create(action, this));
 }
Exemplo n.º 4
0
    public virtual void Build(GOAPActionType[] candidates, WorldState curWS, GOAPGoal goal)
    {
        _actions.Clear();

        // 测试用,后续改成A*

        /*foreach (var actionType in candidates)
         * {
         *  GOAPAction action = GOAPActionFactory.Get(actionType, _agent);
         *  if (action == null)
         *  {
         *      Debug.LogWarning("null for actiontype: " + actionType);
         *      continue;
         *  }
         *  if (actionType == GOAPActionType.GOTO_MELEE_RANGE)
         *  {
         *      _actions.Enqueue(action);
         *  }
         * }*/
        GOAPAction action = null;

        switch (goal.GoalType)
        {
        case GOAPGoalType.STEP_IN:
            action = GOAPActionFactory.Get(GOAPActionType.STEP_IN, _owner);
            _actions.Enqueue(action);
            break;

        case GOAPGoalType.STEP_OUT:
            action = GOAPActionFactory.Get(GOAPActionType.STEP_OUT, _owner);
            _actions.Enqueue(action);
            break;

        case GOAPGoalType.STEP_AROUND:
            action = GOAPActionFactory.Get(GOAPActionType.STEP_AROUND, _owner);
            _actions.Enqueue(action);
            break;

        case GOAPGoalType.ATTACK_TARGET:
            action = GOAPActionFactory.Get(GOAPActionType.GOTO_MELEE_RANGE, _owner);
            _actions.Enqueue(action);
            if (_owner.agentType == AgentType.PEASANT || _owner.agentType == AgentType.SWORD_MAN)
            {
                action = GOAPActionFactory.Get(GOAPActionType.ATTACK_MELEE_ONCE, _owner);
                _actions.Enqueue(action);
            }
            else if (_owner.agentType == AgentType.DOUBLE_SWORDS_MAN)
            {
                if (UnityEngine.Random.Range(0, 2) == 0)
                {
                    action = GOAPActionFactory.Get(GOAPActionType.ATTACK_MELEE_TWO_SWORDS, _owner);
                }
                else
                {
                    action = GOAPActionFactory.Get(GOAPActionType.ATTACK_WHIRL, _owner);
                }
                _actions.Enqueue(action);
            }
            break;

        case GOAPGoalType.REACT_TO_DAMAGE:
            if (curWS.GetWSProperty(WorldStatePropKey.EVENT).GetEvent() == EventTypes.HIT)
            {
                action = GOAPActionFactory.Get(GOAPActionType.INJURY, _owner);
                _actions.Enqueue(action);
            }
            else if (curWS.GetWSProperty(WorldStatePropKey.EVENT).GetEvent() == EventTypes.DEAD)
            {
                action = GOAPActionFactory.Get(GOAPActionType.DEATH, _owner);
                _actions.Enqueue(action);
            }
            else if (curWS.GetWSProperty(WorldStatePropKey.EVENT).GetEvent() == EventTypes.KNOCKDOWN)
            {
                action = GOAPActionFactory.Get(GOAPActionType.KNOCKDOWN, _owner);
                _actions.Enqueue(action);
            }
            break;

        case GOAPGoalType.BLOCK:
            action = GOAPActionFactory.Get(GOAPActionType.BLOCK, _owner);
            _actions.Enqueue(action);
            break;

        default:
            break;
        }

        if (_actions.Count > 0)
        {
            _actions.Peek().Activate();
        }
    }