public override void Intialize(AIGameManger _aIGameManger)
 {
     proprity     = MediumProprity;
     DropProp     = true;
     aIGameManger = _aIGameManger;
     SetObjInfo();
     player                     = GameObject.Find("Player");
     audioController            = Role.GetComponent <AudioController>();
     nav                        = Role.GetComponent <NavMeshAgent>();
     targetPos                  = Role.transform.GetChild(2).GetComponent <CapsuleCollider>();
     targetPos.transform.parent = null;
     ResetTargetPos(targetPos);
     ModelPrefab = Role.transform.GetChild(1).gameObject;
     m_anim      = ModelPrefab.GetComponent <Animator>();
     p_health    = Role.GetComponent <PlayerHealth>();
     p_health.stateController = this;
     p_health.Proprity        = proprity;
     m_aiState  = CombineEnemyState.IDLE;
     CanEscape  = true;
     CanCombine = true;
     SetValue();
     particileControl = Role.GetComponent <ParticileControl>();
     //layersChecked = LayerMask.NameToLayer("Combine");
     DropProp      = true;
     RenderGamObjs = ModelPrefab.transform.GetComponentsInChildren <Renderer>();
     EventManager.StartListening("DeadEnemy", DeadEnemy);
 }
    public virtual void MotionChase(GameObject target)
    {
        if (target != null)
        {
            if (EnemyIsAround(AttackDistance, theTarget))
            {
                Debug.Log("Enemy IS In AttackRange");
                m_anim.SetBool("Walk", false);
                m_aiState = CombineEnemyState.ATTACK;
            }

            if (Vector3.Distance(Role.transform.position, target.transform.position) > ChaseDistance)
            {
                Debug.Log("Enemy TooFar");
                theTarget = null;
                m_anim.SetBool("Walk", false);
                m_aiState = CombineEnemyState.IDLE;
            }
            else
            {
                m_anim.SetBool("Walk", true);
                nav.SetDestination(target.transform.position);
            }
        }
        else
        {
            theTarget = null;
            //m_anim.SetBool("Attack", false);
            m_anim.SetBool("Walk", false);
            m_aiState = CombineEnemyState.IDLE;
        }
    }
 public virtual void MotionFindCombinePos(GameObject target)
 {
     if (originator != null)
     {
         GoTargetPos(target);
     }
     else
     {
         IsGroup   = false;
         m_aiState = CombineEnemyState.IDLE;
     }
 }
 protected void StartCombine()
 {
     currentCombineTime += Time.deltaTime;
     if (currentCombineTime > combineTime)
     {
         proprity = HeavyProprity;
         //changemodel
         ChangeModel();
         DestoryOtherNeighbor();
         p_health.Proprity = proprity;
         m_aiState         = CombineEnemyState.IsCombine;
     }
 }
 public virtual void CheckDoEscape()
 {
     if (CanEscape)
     {
         if (p_health.currenthp <= 5f)
         {
             Debug.Log(Role.name + "start escape");
             //m_anim.SetBool("Attack", false);
             m_anim.SetBool("Walk", true);
             CanEscape = false;
             m_aiState = CombineEnemyState.Escape;
         }
     }
 }
 protected virtual void CheckArrive()
 {
     for (int i = 0; i < 4; i++)
     {
         if (Vector3.Distance(neighbors[i].Role.transform.position, Role.transform.position) < 10 && !neighbors[i].IsArrive)
         {
             neighbors[i].IsArrive = true;
             arrivedNum           += 1;
         }
     }
     if (arrivedNum > 4)
     {
         m_aiState = CombineEnemyState.StartCOMBINE;
     }
 }
    public virtual void MotionAttack(GameObject target)
    {
        if (target == null)
        {
            Debug.Log("Enemy Is Dead");
            theTarget = null;
            m_aiState = CombineEnemyState.IDLE;
        }
        else
        {
            if (currentTime > AttackTime)
            {
                Debug.Log("DoAttack 0.0");
                currentTime = 0;

                Attack();
            }
            else if (currentTime < AttackTime)
            {
                currentTime += Time.deltaTime;
                Vector3 backpos = Role.transform.position + target.transform.forward * 5;
                nav.SetDestination(backpos);
                if (audioController != null)
                {
                    //audioController.StopSound(0);
                }
            }
            else if (currentTime < 0)
            {
                Vector3 backpos = Role.transform.position - target.transform.forward * 4.5f;
                nav.SetDestination(backpos);
                m_anim.SetBool("Walk", true);
            }

            Vector3 Dir = target.transform.position - Role.transform.position;
            Dir.y = 0;
            Role.transform.rotation = Quaternion.LookRotation(Dir);

            if (!EnemyIsAround(AttackDistance, target))
            {
                Debug.Log("Start Chase Target");
                m_aiState = CombineEnemyState.Chase;
            }
        }
    }
 public virtual void MotionDefend(GameObject target)
 {
     m_anim.SetBool("Walk", true);
     nav.SetDestination(target.transform.position);
     if (CheckEnemy())
     {
         if (EnemyIsAround(AttackDistance, theTarget))
         {
             Debug.Log("Enemy IS In AttackRange");
             m_anim.SetBool("Walk", false);
             m_aiState = CombineEnemyState.ATTACK;
         }
         else
         {
             Debug.Log("Wander See Enemy Start Chase");
             m_aiState = CombineEnemyState.Chase;
         }
     }
 }
    protected virtual void MotionIdle(float w_time)
    {
        if (CheckEnemy())
        {
            if (EnemyIsAround(AttackDistance, theTarget) || TowerIsAround(30, theTarget))
            {
                Debug.Log("Enemy IS In AttackRange");
                m_aiState = CombineEnemyState.ATTACK;
            }
            else
            {
                Debug.Log("SeeEnemy Start Chase");
                m_aiState = CombineEnemyState.Chase;
            }
        }
        currentWaitTime += Time.deltaTime;

        if (currentWaitTime > w_time)
        {
            Debug.Log("Start Wander");
            //DigOutGround();
            m_aiState = CombineEnemyState.Wander;
        }

        if (BeAttack)
        {
            BeAttack = false;
            if (theTarget != null)
            {
                Debug.Log("Beattack  attacker's name = " + theTarget.name);
            }
            else
            {
                Debug.Log("Target is dead");
            }

            m_aiState = CombineEnemyState.ATTACK;
        }
    }
    private void CheckCombine()
    {
        if (CanCombine)
        {
            if (!IsGroup)
            {
                Checktimer += Time.deltaTime;
                if (Checktimer > checkInterval)
                {
                    neighbors.Clear();
                    Debug.Log("Neighbor Clear!!");
                    Aroundcolliders = Physics.OverlapSphere(Role.transform.position, detectRadius, layersChecked);
                    for (int i = 0; i < Aroundcolliders.Length; i++)
                    {
                        if (Aroundcolliders[i].CompareTag("CombineBefore"))
                        {
                            //neighbors.Add(Aroundcolliders[i].gameObject);
                            Debug.Log("SEE PARNER" + ": " + Aroundcolliders[i].transform.name);
                            theTarget = Aroundcolliders[i].transform.gameObject;
                        }
                    }
                    Checktimer = 0;
                    Debug.Log("Neighbor Num is" + Aroundcolliders.Length);
                }
                if (Aroundcolliders.Length >= 4)
                {
                    for (int i = 0; i < Aroundcolliders.Length; i++)
                    {
                        Aroundcolliders[i].transform.GetComponent <ObjInfo>().m_ai.IsGroup = true;
                        Debug.Log(Aroundcolliders[i].name);
                        Aroundcolliders[i].transform.GetComponent <ObjInfo>().m_ai.nav.SetDestination(this.Role.transform.position);
                        if (Aroundcolliders[i].gameObject != Role.gameObject)
                        {
                            //Aroundcolliders[i].gameObject.GetComponent<StateController>().Model.GetComponent<Animator>().SetBool("Walk", true);
                            GameObject.Destroy(Aroundcolliders[i].gameObject, Mathf.Abs(Vector3.Distance(Aroundcolliders[i].transform.position, Role.transform.position)) / (nav.speed * 2));
                            //Aroundcolliders[i].gameObject.GetComponent<StateController>().ReleaseWayPoints();
                            //Debug.Log(" DD " + Mathf.Abs(Vector3.Distance(Aroundcolliders[i].transform.position, controller.transform.position)) / controller.enermyStats.moveSpeed);
                            //Debug.Log(" DD " + Mathf.Abs(Vector3.Distance(Aroundcolliders[i].transform.position, controller.transform.position)) / (controller.enermyStats.moveSpeed * 2));
                            //Debug.Log(" DD " + Mathf.Abs(Vector3.Distance(Aroundcolliders[i].transform.position, controller.transform.position)) / controller.enermyStats.moveSpeed / 2);
                            //Debug.Log(" DD " + Mathf.Abs(Vector3.Distance(Aroundcolliders[i].transform.position, controller.transform.position)) / 2);
                        }
                        else
                        {
                            nav.Stop();
                        }
                    }
                    //return true;
                    Role.tag  = "CombineAfter";
                    m_aiState = CombineEnemyState.StartCOMBINE;
                }

                else
                {
                    Debug.Log("false" + neighbors.Count);
                    //return false;
                }
            }
            else
            {
                Debug.Log("IsGroup Cant Combine again");
            }
        }
    }
    //徘徊
    public virtual void MotionWander(CapsuleCollider t, float wd_time)
    {
        //currentWanderTime += Time.deltaTime;
        //if (currentWanderTime > wd_time)
        //{
        //    currentWaitTime = 0;
        //    currentWanderTime = 0;
        //    m_anim.SetBool("Walk", false);
        //    m_aiState = CombineEnemyState.IDLE;
        //}
        //else
        //{
        //    nav.SetDestination(t.gameObject.transform.position);
        //    if (Vector3.Distance(targetPos.transform.position, Role.transform.position) < 2)
        //    {
        //        ResetTargetPos(targetPos);
        //        m_anim.SetBool("Walk", false);
        //        m_aiState = CombineEnemyState.IDLE;
        //    }

        //    if (CheckEnemy())
        //    {
        //        if (EnemyIsAround(AttackDistance, theTarget))
        //        {
        //            Debug.Log("Enemy IS In AttackRange");
        //            m_anim.SetBool("Walk", false);
        //            m_aiState = CombineEnemyState.ATTACK;
        //        }
        //        else
        //        {
        //            Debug.Log("Wander See Enemy Start Chase");
        //            m_aiState = CombineEnemyState.Chase;
        //        }
        //    }
        //    m_anim.SetBool("Walk", true);
        //}

        //--------------

        currentWaitTime = 0;
        nav.SetDestination(t.gameObject.transform.position);
        if (Vector3.Distance(targetPos.transform.position, Role.transform.position) <= StopDistance)
        {
            ResetTargetPos(targetPos);
            m_anim.SetBool("Walk", false);
            m_aiState = CombineEnemyState.IDLE;
        }

        if (CheckEnemy())
        {
            if (EnemyIsAround(AttackDistance, theTarget))
            {
                Debug.Log("Enemy IS In AttackRange");
                m_anim.SetBool("Walk", false);
                //CallParner();
                m_aiState = CombineEnemyState.ATTACK;
            }
            else
            {
                Debug.Log("Wander See Enemy Start Chase");
                m_aiState = CombineEnemyState.Chase;
            }
        }
        m_anim.SetBool("Walk", true);
    }
    protected override void StateAction()
    {
        if (m_objInfo.IsDead == true)
        {
            m_aiState = CombineEnemyState.DEAD;
        }
        m_objInfo.State = m_aiState.ToString();

        switch (m_aiState)
        {
        case CombineEnemyState.Wait:
        {
            nav.Stop();
            nav.ResetPath();
            targetPos.transform.position = Role.transform.position + Role.transform.forward * 3;
            SetCombinePos();
            CheckArrive();
        }
        break;

        case CombineEnemyState.IDLE:
        {
            //1
            MotionIdle(WaitTime);
        }

        break;

        case CombineEnemyState.Wander:
        {
            MotionWander(targetPos, wanderTime);
        }

        break;

        case CombineEnemyState.WALK:
        {
            //1
            MotionWalk(targetPos.gameObject);
        }


        break;

        case CombineEnemyState.Chase:
        {
            MotionChase(theTarget);
        }

        break;

        case CombineEnemyState.ATTACK:
        {
            //1
            MotionAttack(theTarget);
        }


        break;

        case CombineEnemyState.FindCombinePos:
        {
            MotionFindCombinePos(targetPos.gameObject);
        }
        break;

        case CombineEnemyState.StartCOMBINE:
        {
            StartCombine();
        }
        break;

        case CombineEnemyState.IsCombine:
        {
            //
            m_aiState = CombineEnemyState.ATTACK;
        }
        break;

        case CombineEnemyState.CombineOther:
        {
            aIGameManger.ReleaseCombineEnemyAI(this, .5f);
        }
        break;

        case CombineEnemyState.DEFEND:
        {
            //1
            MotionDefend(targetPos.transform.gameObject);
        }

        break;

        case CombineEnemyState.Avoid:
        {
            if (currentAvoidTime < AvoidTime)
            {
                MotionAvoid(theTarget);
            }
            else
            {
                currentAvoidTime = 0;
                m_aiState        = CombineEnemyState.IDLE;
            }
        }

        break;

        case CombineEnemyState.Escape:
        {
            MotionEscape(theTarget);
        }

        break;

        case CombineEnemyState.DEAD:
        {
            //1
            MotionDead();
        }

        break;

        default:
            break;
        }
    }