Beispiel #1
0
    public void InitFSM()
    {
        CachEntityAnimation();

        m_FSMSystem = new FSMSystem(this);

        MonsterMoveState moveState = new MonsterMoveState();

        m_FSMSystem.AddState(moveState);
        MonsterIdleState idleState = new MonsterIdleState();

        m_FSMSystem.AddState(idleState);
        m_MonsterAttackState = new MonsterAttackState();
        m_FSMSystem.AddState(m_MonsterAttackState);
        m_MonsterBeAttackState = new MonsterBeAttackState();
        m_FSMSystem.AddState(m_MonsterBeAttackState);
        MonsterDieState dieState = new MonsterDieState();

        m_FSMSystem.AddState(dieState);
        MonsterStandState standState = new MonsterStandState();

        m_FSMSystem.AddState(standState);
        m_MonsterBeHitFlyState = new MonsterBeHitFlyState();
        m_FSMSystem.AddState(m_MonsterBeHitFlyState);
        MonsterBeAdsorbState monsterBeAdsorbState = new MonsterBeAdsorbState();

        m_FSMSystem.AddState(monsterBeAdsorbState);
        m_FSMSystem.AddState(new MonsterBeHordeState());

        m_FSMSystem.PerformTransition(Transition.MonsterToIdle);
    }
 private void Start()
 {
     moveState        = MonsterMoveState.IDLE;
     navagent.speed   = defaultSpeed;
     outgoingStopDist = stopDistance;
     outGoingIdleTime = idleDuration;
     outgoingRange    = fovRange;
 }
 private void Seek()
 {
     if (IsPlayerVisible(transform.position, playerTransform.position, outgoingRange))
     {
         navagent.speed = chaseSpeed;
         moveState      = MonsterMoveState.CHASING;
     }
     else if (Vector3.Distance(transform.position, destination) < outgoingStopDist)
     {
         navagent.isStopped = true;
         moveState          = MonsterMoveState.IDLE;
     }
 }
 private void Chase()
 {
     if (IsPlayerVisible(transform.position, playerTransform.position, outgoingRange))
     {
         SetDestination(playerTransform.position);
     }
     else if (Vector3.Distance(transform.position, destination) > outgoingRange)
     {
         navagent.speed     = defaultSpeed;
         navagent.isStopped = true;
         moveState          = MonsterMoveState.IDLE;
     }
 }
 private void Seek()
 {
     if (PlayerVisible(transform.position, playerTransform.position, outgoingRange))
     {
         DisableWallPhase(false);
         navagent.speed = chaseSpeed;
         moveState      = MonsterMoveState.CHASING;
     }
     else if (Vector3.Distance(transform.position, destination) < outgoingStopDist)
     {
         navagent.isStopped = true;
         moveState          = MonsterMoveState.IDLE;
         outgoingStopDist   = Random.Range(minStopDist, maxStopDist);
         SetDestination(waypoints[Random.Range(0, waypoints.Length)].GetComponent <Transform>().position);
     }
 }
    private void Idle()
    {
        outGoingIdleTime -= Time.deltaTime;

        if (outGoingIdleTime <= 0f)
        {
            navagent.isStopped = false;
            moveState          = MonsterMoveState.SEEKING;
            outGoingIdleTime   = idleDuration;
        }
        else if (IsPlayerVisible(transform.position, playerTransform.position, outgoingRange))
        {
            navagent.isStopped = false;
            navagent.speed     = chaseSpeed;
            moveState          = MonsterMoveState.CHASING;
            outGoingIdleTime   = idleDuration;
        }
    }
    private void Chase()
    {
        if (PlayerVisible(transform.position, playerTransform.position, outgoingRange))
        {
            SetDestination(playerTransform.position);

            if (moveState == MonsterMoveState.CHASING && navagent.speed <= maxSpeed)
            {
                navagent.speed += speedMultiplier * Time.deltaTime;
            }
        }
        else if (Vector3.Distance(transform.position, destination) > outgoingRange)
        {
            navagent.speed     = defaultSpeed;
            navagent.isStopped = true;
            moveState          = MonsterMoveState.IDLE;
        }
    }
    private void Awake()
    {
        GameObject[] minionWPs = GameObject.FindGameObjectsWithTag("MinionWaypoint").ToArray();
        GameObject[] bossWPs   = GameObject.FindGameObjectsWithTag("Waypoint").ToArray();

        moveState       = MonsterMoveState.IDLE;
        navagent        = GetComponent <NavMeshAgent>();
        playerTransform = GameObject.FindGameObjectWithTag("Player").GetComponent <Transform>();
        phaseableWalls  = GameObject.FindGameObjectsWithTag("Phaseable").ToArray();
        waypoints       = minionWPs.Concat(bossWPs).ToArray();
        idleCounter     = Random.Range(minIdle, maxIdle);

        navagent.speed       = defaultSpeed;
        outgoingStopDist     = minStopDist;
        outgoingMinIdle      = minIdle;
        outgoingMaxIdle      = maxIdle;
        outgoingRange        = fovRange;
        monstersPosition     = transform.position;
        monstersLastPosition = monstersPosition;
    }
    private void Stuck()
    {
        stepCounter -= Time.deltaTime;

        if (stepCounter <= 0f)
        {
            monstersPosition = transform.position;

            if (Vector3.Distance(monstersPosition, monstersLastPosition) < 0.05f)
            {
                SetDestination(waypoints[Random.Range(0, waypoints.Length)].GetComponent <Transform>().position);
                moveState      = MonsterMoveState.SEEKING;
                navagent.speed = defaultSpeed;
            }
            else
            {
                monstersLastPosition = transform.position;
                stepCounter          = 3f;
            }
        }
    }
    private void Idle()
    {
        idleCounter -= Time.deltaTime;

        if (idleCounter <= 0f)
        {
            if (!insideWall)
            {
                DisableWallPhase(Random.Range(0f, 1f) >= 0.5f ? true : false);
            }

            navagent.isStopped = false;
            moveState          = MonsterMoveState.SEEKING;
            idleCounter        = Random.Range(outgoingMinIdle, outgoingMaxIdle);
        }
        else if (PlayerVisible(transform.position, playerTransform.position, outgoingRange))
        {
            DisableWallPhase(false);
            navagent.isStopped = false;
            navagent.speed     = chaseSpeed;
            moveState          = MonsterMoveState.CHASING;
            idleCounter        = Random.Range(outgoingMinIdle, outgoingMaxIdle);
        }
    }
Beispiel #11
0
    //public void SetArrowBehaviour(ArrowBehaviour arrowBehaviour)
    //{
    //    this.m_ArrowBehaviour = arrowBehaviour;
    //}

    public void EntityMove(SMsgActionMove_SCS sMsgActionMove)
    {
        monsterMoveNodes.Add(new Vector3(sMsgActionMove.floatX / 10.0f, 0.1f, sMsgActionMove.floatY / -10.0f));

        if (m_FSMSystem.CurrentStateID == StateID.MonsterBeHitFly ||
            m_FSMSystem.CurrentStateID == StateID.MonsterStand ||
            m_FSMSystem.CurrentStateID == StateID.MonsterBeAttacked ||
            m_FSMSystem.CurrentStateID == StateID.MonsterAttack)

        {
            TraceUtil.Log(SystemModel.Common, TraceLevel.Error, "wrong node");
            return;
        }

        if (this.RoleDataModel.SMsg_Header.uidEntity == sMsgActionMove.uidEntity && MonsterBehaviour.UsePathSmooth)
        {
            m_currentNode = sMsgActionMove;
            Vector2 lastPos    = new Vector2(m_lastNode.floatX, m_lastNode.floatY);
            Vector2 currentPos = new Vector2(ThisTransform.position.x * 10.0f, ThisTransform.position.z * (-10.0f));
            if (m_currentNode.fSpeed > 0.1f)           //Vector2.Distance( currentPos , lastPos) > 0.1f && lastPos != Vector2.zero)
            {
                if (m_FSMSystem.CurrentStateID == StateID.MonsterIdle)
                {
                    m_smooth.Init(ThisTransform.position,
                                  ThisTransform.TransformDirection(Vector3.forward) * WalkSpeed,
                                  new Vector3(sMsgActionMove.floatX / 10.0f, 0, -sMsgActionMove.floatY / 10.0f),
                                  new Vector3(sMsgActionMove.fDirectX, 0, -sMsgActionMove.fDirectY) * sMsgActionMove.fSpeed / 10.0f,
                                  ConfigDefineManager.TIME_MOVE_SYNC_FOWARD);
                    nodes.Clear();
                    for (int i = 0; i <= 10; i++)
                    {
                        Vector3 nodepos = m_smooth.GetCurrentPos(0.1f * i);
                        nodes.Add(new Vector3(nodepos.x, 1, nodepos.z));
                    }


                    m_FSMSystem.PerformTransition(Transition.MonsterToMove);
                    MonsterMoveState state = (MonsterMoveState)m_FSMSystem.CurrentState;
                    state.ResetSmooth(ConfigDefineManager.TIME_MOVE_SYNC_FOWARD);
                }
                else if (m_FSMSystem.CurrentStateID == StateID.MonsterMove)
                {
                    MonsterMoveState state = (MonsterMoveState)m_FSMSystem.CurrentState;
                    state.ResetSmooth(ConfigDefineManager.TIME_MOVE_SYNC_FOWARD);
                    m_smooth.Init(ThisTransform.position,
                                  ThisTransform.TransformDirection(Vector3.forward) * WalkSpeed,
                                  new Vector3(sMsgActionMove.floatX / 10.0f, 0, -sMsgActionMove.floatY / 10.0f),
                                  new Vector3(sMsgActionMove.fDirectX, 0, -sMsgActionMove.fDirectY) * sMsgActionMove.fSpeed / 10.0f,
                                  ConfigDefineManager.TIME_MOVE_SYNC_FOWARD);
                    nodes.Clear();
                    for (int i = 0; i <= 10; i++)
                    {
                        Vector3 nodepos = m_smooth.GetCurrentPos(0.1f * i);
                        nodes.Add(new Vector3(nodepos.x, 1, nodepos.z));
                    }
                }

                m_clientEndPos = null;
                ClientMove     = true;
            }
            else
            {
                m_clientEndPos = new Vector3(CurrentNode.floatX / 10.0f, 0, CurrentNode.floatY / -10.0f);
                ClientMove     = false;
            }
            m_lastNode = m_currentNode;
        }

        WalkToPosition = ThisTransform.position;
        WalkToPosition = WalkToPosition.Value.GetFromServer(sMsgActionMove.floatX, 0.1f, sMsgActionMove.floatY, -0.1f);
    }