//bool castingSpells = false;
        //float attackRadius = 10.0f;

        public override AIState Update(AISwordsmanControl ai)
        {
            Vector3 disVec3 = ai.target.position - ai.character.transform.position;

            float distant = disVec3.magnitude;

            float approach = 0.7f;

            //if(distant > 2.0f)
            //{
            //    approach = 3.0f;
            //}
            //else
            //{
            //    approach = 0.5f;
            //}


            ai.character.Move(disVec3.normalized * approach, false, false);


            bool finishAttack = ai.NormalAttack();

            if (finishAttack)
            {
                return(new AIStateNormal());
            }
            else
            {
                return(this);
            }
        }
Пример #2
0
        void GenerateEnemy()
        {
            for (int i = players.Count - 1; i >= 0; --i)
            {
                if (!players[i].GetComponent <SwordsmanCharacter>().enabled)
                {
                    players.Remove(players[i]);
                }
            }

            numPlayers = players.Count;


            Debug.Log(numPlayers);

            if (numPlayers > 4)
            {
                return;
            }

            int name_idx  = 0;
            int birth_idx = Random.Range(0, birthPoint.Length + 1);
            //TODO: random name

            //GameObject newEnemy = Instantiate(Resources.Load(enemyName[name_idx]),birthPoint[birth_idx].position, Quaternion.identity) as GameObject;
            GameObject newEnemy = Instantiate(Resources.Load("AI-Di"), birthPoint[birth_idx].position, Quaternion.identity) as GameObject;

            newEnemy.tag   = "Human";
            newEnemy.layer = LayerMask.NameToLayer("EnemyLayer");

            newEnemy.GetComponent <SwordsmanCharacter>().swordsmanStatus.setHP(30);
            newEnemy.GetComponent <SwordsmanCharacter>().swordsmanStatus.setMaxHP(30);


            //ai parameter adjust
            if (nKills > 3)
            {
                AISwordsmanControl ai = newEnemy.GetComponent <AISwordsmanControl>();
                ai.idle_rate       = 0.0f;
                ai.sprint_distance = 2.0f;

                ai.attack_idle  = 0.1f;
                ai.attack_speed = 0.5f;
            }



            players.Add(newEnemy);
        }
        public override AIState Update(AISwordsmanControl ai)
        {
            Vector3 disVec3 = ai.target.position - ai.character.transform.position;

            ai.character.Move(disVec3.normalized * 0.5f, false, false);

            if (!ai.castingSpells)
            {
                Debug.Log("cast spells");

                ai.castingSpells = true;
                ai.SpecialMoveCast(1, SPECIAL_GAP);

                //ai.castingSpells = false;
            }

            return(new AIStateNormal());
        }
Пример #4
0
        public override AIState Update(AISwordsmanControl ai)
        {
            if (!ai.character.BattleReady)
            {
                return(this);
            }

            if (ai.castingSpells)
            {
                return(this);
            }
            //ai.NormalMove();


            // idle ING...
            if (idleTime > 0)
            {
                idleTime--;
                return(this);
            }


            // go to idle?
            float r = Random.value;

            if (r < IDLE_RATE)
            {
                idleTime = Random.Range(0, MAX_IDLE_TIME);
                return(this);
            }



            // calculate distance
            Vector3 disVec3 = ai.target.transform.position - ai.character.transform.position;
            float   dis     = disVec3.magnitude;

            disVec3.Normalize();

            Debug.DrawLine(ai.character.transform.position + Vector3.up, ai.character.transform.position + disVec3 + Vector3.up);


            //int upperBodyState = ai.character.m_Animator.GetCurrentAnimatorStateInfo(1).GetHashCode();
            int targetUpperBodyState = ai.targetCharacter.m_Animator.GetCurrentAnimatorStateInfo(1).fullPathHash;

            //// block?
            if (dis < blockRadius)
            {
                ai.character.Move(0.1f * disVec3, false, false);
                if (SwordsmanCharacter.hash_attackLeftIdle == targetUpperBodyState)
                {
                    //Debug.Log("block left");
                    ai.NormalBlock(1);
                    return(this);
                }
                else if (SwordsmanCharacter.hash_attackRightIdle == targetUpperBodyState)
                {
                    ai.NormalBlock(0);
                    return(this);
                }
                else if (SwordsmanCharacter.hash_attackStabIdle == targetUpperBodyState)
                {
                    ai.NormalBlock(2);
                    return(this);
                }
                else
                {
                    ai.NormalBlockExit();
                }
            }
            else
            {
                ai.NormalBlockExit();
            }


            // attack?
            if (dis < attackRadius)
            {
                return(new AIStateInstantAttack());
            }
            else if (dis > SPRINT_DISTANCE)
            {
                ai.character.Move(dis * disVec3, false, false);
            }
            else
            {
                ai.character.Move(0.5f * disVec3, false, false);
            }


            // cast special
            if (Random.value < SPECIAL_RATE && !ai.castingSpells)
            {
                return(new AIStateInstantCastSpeical());
            }


            return(this);
        }
Пример #5
0
 public abstract AIState Update(AISwordsmanControl aiSwordsmanControl);