Пример #1
0
    /// <summary>
    /// 转换状态
    /// </summary>
    /// <param name="aiRule"></param>
    public void PerformRule(AIrule aiRule)
    {
        if (aiRule == AIrule.NullAIrule)
        {
            Debug.LogError("PerformRule Error:NullAIrule");
            return;
        }

        AIEvent aiEvent = currentAIFSM.GetOutputState(aiRule);

        if (aiEvent == AIEvent.NullEvent)
        {
            Debug.LogError("PerformRule Error:NullEvent");
            return;
        }

        currentAIEvent = aiEvent;
        for (int i = 0; i < aiFSMs.Count; i++)
        {
            if (aiFSMs[i].AiEvent == currentAIEvent)
            {
                currentAIFSM.DoBeforeLeaving();
                currentAIFSM = aiFSMs[i];
                currentAIFSM.DoBeforeEntering();
                return;
            }
        }
    }
Пример #2
0
    /// <summary>
    /// 初始化状态机
    /// </summary>
    public void InitializeFSM()
    {
        ai_fsm = new AIFSM(AIFSM_Type.EnemyFSM, this);
        StateNotReady _startState = new StateNotReady();

        ai_fsm.AddStateToList(_startState);
        ai_fsm.AddStateToList(new StateIdle());
        ai_fsm.AddStateToList(new StateAttack());
        ai_fsm.AddStateToList(new StateDeath());
        ai_fsm.SetDefaultState(_startState);
    }
Пример #3
0
    protected virtual void Awake()
    {
        if (_animator == null)
        {
            _animator = GetComponentInChildren <Animator>();
        }

        _fsm = new AIFSM(new AIIdleState(), this);
        _fsm.onStateChanged       += OnFSMStateChanged;
        _fsm.onStateErrorOccurred += OnFSMStateErrorOccurred;
        _fsm.onStateComplete      += OnFSMStateComplete;
    }
Пример #4
0
    public override void EnterState()
    {
        _childFSM = new AIFSM(new AIIdleState(), Agent);
        _childFSM.onStateComplete += StateComplete;

        if (_wanderArea.Contains(Agent.transform.position))
        {
            DestinationReached();
        }
        else
        {
            Pathfinder.Instance.FindPath(Agent.GetHashCode(), Agent.transform.position, GetRandomPositionInArea(), PathFound);
        }
    }
Пример #5
0
        void Start()
        {
            // Start up the FSM
            aiStateMachine = new AIFSM("BaseController of " + gameObject.name, this);

            aiStateMachine.Start(EAIState.IDLE);

            // Cache a ref to our controlled character
            character = gameObject.GetComponent <BaseEnemyCharacter>();
            character.gameObject.GetComponent <Health>().OnNoHealth.AddListener(OnCharacterDied);

            // Grab our nav mesh agent
            agent = gameObject.GetComponent <NavMeshAgent>();

            // Bind to perception events
            eyes = GetComponentInChildren <Perception>();
            eyes.OnSeenTarget.AddListener((newTarget) => { SeePlayer(newTarget); });
            eyes.OnLostTarget.AddListener(LostPlayer);
        }
Пример #6
0
    /// <summary>
    /// 添加一个新状态
    /// </summary>
    /// <param name="aiFSM"></param>
    public void AddAIFSM(AIFSM aiFSM, AIManager manager)
    {
        if (aiFSM == null)
        {
            Debug.LogError("AddAIFSM Error:为空的AIFSM不被允许添加!");
            return;
        }

        for (int i = 0; i < aiFSMs.Count; i++)
        {
            if (aiFSMs[i].AiEvent == aiFSM.AiEvent)
            {
                Debug.LogError("AddAIFSM Error:" + aiFSM.AiEvent.ToString() + "在列表中已存在!");
                return;
            }
        }
        aiFSM._AIManager = manager;
        aiFSMs.Add(aiFSM);
    }
Пример #7
0
 public AggressiveState(AIFSM parent, EAIState ID, string prettyID, EnemyController controller) : base(parent, ID, prettyID, controller)
 {
 }
Пример #8
0
 public AlertState(AIFSM parent, EAIState ID, string prettyID, EnemyController controller) : base(parent, ID, prettyID, controller, controller.AlertDelay)
 {
 }
Пример #9
0
 public override void EnterState()
 {
     _childFSM = new AIFSM(new AIIdleState(), Agent);
     _childFSM.onStateComplete += substateComplete;
     playBuildAnim();
 }
Пример #10
0
 /// <summary>
 /// 设置当前状态
 /// </summary>
 /// <param name="aiFSM"></param>
 public void SetCurrentAIFSM(AIFSM aiFSM)
 {
     currentAIFSM   = aiFSM;
     currentAIEvent = aiFSM.AiEvent;
     CurrentAIFSM.DoBeforeEntering();
 }
Пример #11
0
 private void Awake()
 {
     _fsm          = GetComponent <AIFSM>();
     _navMeshAgent = GetComponent <NavMeshAgent>();
     _sensor       = GetComponent <Sensor>();
 }