Exemplo n.º 1
0
 void OnTriggerExit2D(Collider2D collider)
 {
     if (collider.GetType() == typeof(BoxCollider2D))
     {
         if (collider.gameObject.layer == 8)
         {
             m_ZombieState = ZombieAIState.Idle;
         }
     }
 }
Exemplo n.º 2
0
    void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.gameObject.layer == 8)
        {
            if (collider.GetType() == typeof(BoxCollider2D))
            {
                m_ZombieState = ZombieAIState.Seeking;
                m_Target      = collider.gameObject;
            }

            if (collider.GetType() == typeof(CircleCollider2D))
            {
                m_Animator.SetBool("isAttacking", true);
            }
        }
    }
Exemplo n.º 3
0
    void Update()
    {
        if (aiState == ZombieAIState.idle || aiState == ZombieAIState.wandering)
        {
            RaycastHit hitInfo;

            Physics.SphereCast(transform.position, currentCastRadius, transform.forward, out hitInfo, currentCastRadius, playerLayerMask);

            if (hitInfo.transform != null)
            {
                target  = hitInfo.transform.gameObject.GetComponent <Player>();
                aiState = ZombieAIState.chasing;
            }
        }



        if (aiState == ZombieAIState.chasing)
        {
            if (target == null)
            {
                aiState = ZombieAIState.idle;
                return;
            }

            rigid.MovePosition(Vector3.MoveTowards(transform.position, target.transform.position, moveSpeed * Time.deltaTime));

            float distanceToTarget = Vector3.Distance(transform.position, target.transform.position);

            if (distanceToTarget > currentCastRadius * 1.4f)
            {
                aiState = ZombieAIState.idle;
            }
            else if (distanceToTarget < 2 && readyToAttack)
            {
                StartCoroutine(Attack());
            }
        }
    }
Exemplo n.º 4
0
    void  CheckDistance()
    {
        if (!FollowTarget)
        {
            //TODO CALL IDLE ANIM
            FollowState = ZombieAIState.Idle;
            return;
        }
        float distancea = (FollowTarget.position - transform.position).magnitude;

        if (distancea <= AttackDistance)
        {
            Vector3 destinya = FollowTarget.position;
            destinya.y = transform.position.y;
            transform.LookAt(destinya);
            StartCoroutine(Attack());
        }
        if (distancea > ApproachDistance)
        {
            FollowState = ZombieAIState.Moving;
            //TODO CALL WALK ANIM
        }
    }
Exemplo n.º 5
0
 //修改状态
 public void SetZombieState(ZombieAIState zombieAIState)
 {
     zombieState = zombieAIState;
 }
Exemplo n.º 6
0
 //静态创建所有状态
 //并初始化当前状态为1
 void InitializeAIState()
 {
     partolState  = new PatrolState(this);
     chasingState = new ChasingState(this);
     zombieState  = partolState;
 }
Exemplo n.º 7
0
    void  Update()
    {
        var status = GetComponent <CharacterStatus>();
        CharacterController controller = GetComponent <CharacterController>();

        PlayerObjects = GameObject.FindGameObjectsWithTag("Player");
        if (PlayerObjects.Length > 0)
        {
            FollowTarget = FindClosest().transform;
        }

        if (status.IsFear)
        {
            CancelAttack = true;
            Vector3 lui = transform.TransformDirection(Vector3.back);
            controller.Move(lui * 5 * Time.deltaTime);
            return;
        }

        if (Freeze || status.Freeze)
        {
            return;
        }

        if (!FollowTarget)
        {
            return;
        }
        if (FollowState == ZombieAIState.Moving)
        {
            float distance = (FollowTarget.position - transform.position).magnitude;
            if (distance <= ApproachDistance)
            {
                FollowState = ZombieAIState.Pausing;
                //TODO CALL IDLE ANIMATION
            }
            else if (distance >= LostSight)
            {
                status.Health = status.MaxHealth;
                FollowState   = ZombieAIState.Idle;
                //TODO CALL IDLE ANIMATION
            }
            else
            {
                Vector3 forward = transform.TransformDirection(Vector3.forward);
                controller.Move(forward * Speed * Time.deltaTime);

                Vector3 destiny = FollowTarget.position;
                destiny.y = transform.position.y;
                transform.LookAt(destiny);
            }
            if (distance <= AttackDistance)
            {
                StartCoroutine(Attack());
            }
        }
        else if (FollowState == ZombieAIState.Pausing)
        {
            Vector3 destinya = FollowTarget.position;
            destinya.y = transform.position.y;
            transform.LookAt(destinya);

            Distance = (transform.position - GetDestination()).magnitude;
            if (Distance > ApproachDistance)
            {
                FollowState = ZombieAIState.Moving;
                //TODO WALK ANIMATION
            }
        }
        //----------------Idle Mode--------------
        else if (FollowState == ZombieAIState.Idle)
        {
            Vector3 destinyheight = FollowTarget.position;
            destinyheight.y = transform.position.y - destinyheight.y;
            int getHealth = status.MaxHealth - status.Health;

            Distance = (transform.position - GetDestination()).magnitude;
            if (Distance < DetectRange && Mathf.Abs(destinyheight.y) <= 4 || getHealth > 0)
            {
                FollowState = ZombieAIState.Moving;
                //TODO CALL WALK ANIMATION
            }
        }
        //-----------------------------------
    }