//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); } }
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()); }
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); }
public abstract AIState Update(AISwordsmanControl aiSwordsmanControl);