private bool GetPositionToDrible(PlayerController enemy, out Vector3 toGo) { bool result = false; Vector3 resultPosition = Vector3.zero; Vector3 freePos = Vector3.zero; if (GetFreeHit(out freePos, enemy.transform.position, true)) { resultPosition = freePos; result = true; } else { Vector3 pos = Locomotion.GetRandomNavCircle(Player.transform.position, 3.5f); resultPosition = pos; if (Player.IsHitBetween(pos) == false) { result = true; } } toGo = resultPosition; return(result); }
private void Handlle_NothingState() { if (Player.IsMyBall() == false) { aiState = SoccerAIState.nothing; return; } Transform goalPosition = Player.GetEnemyGoalPosition(); PlayerController playerBtw = null; PlayerController enemyNear = Player.GetEnemyNear(); timeToDrible += Time.deltaTime; timeToGoal += Time.deltaTime; if (toPass != null) { motionType = LocomotionType.normal; Debug.DrawLine(Player.transform.position, toPass.transform.position, Color.red); toGo = toPass.transform.position; if (Player.IsLookAt(toGo) == true) { if (Player.IsHitBetween(toPass) == false && Player.IsMyBall()) { if (Owner.TriggerPass(toPass)) { Player.GetSkill_BasicPass().TriggerCooldown(); toPass = null; } } else { toPass = null; } } Move(toGo); return; } //Ativação de movimento soccer e uso de stamina if (enemyNear != null) { if (enemyNear.Distance(Player) <= 5.5f && enemyNear.IsSelected() && Player.isOk) { if (Player.GetSkill_Stamina().IsCritical == false) { motionType = LocomotionType.soccer; } else if (Player.GetSkill_Stamina().IsMin) { motionType = LocomotionType.normal; } } else { motionType = LocomotionType.normal; } } //Vou passar a bola se existir um cara livre entre e o gol. Esta e a prioridade ja q ele tem caminho livre if (Player.IsHitForwad(checkDistanceToPass, out playerBtw)) { inGoalDir = false; timeToDrible = 0.0f; if (playerBtw.IsMyTeaM(Player)) //Player e meu amigo, vou pedir para ele sair do caminho { if (playerBtw.IsLookAt(Player)) { Vector3 origim = playerBtw.transform.position + (-playerBtw.transform.forward * 4.5f); Vector3 freePos = Locomotion.GetRandomNavCircle(origim, 4.5f); playerBtw.GetComponent <AIController>().GoToPosition(freePos, BallController.instance.transform); } } else if (playerBtw.Distance(Player) <= checkDistanceToDrible) //Player inimigo e perto de mais. Drible { if (Player.IsLookAt(toGo)) { Vector3 positionToDrible = Vector3.zero; if (GetPositionToDrible(playerBtw, out positionToDrible)) { toGo = positionToDrible; } else { //Se posição boa para o drible. toGo = positionToDrible; } } } else //Player inimigo mas longe de mais vou tentar um passe de bola { SkillVar skillpass = Player.GetSkill_BasicPass(); PlayerController topass = null; if (GetToPass(out topass)) { if (Player.IsHitBetween(topass) == false && skillpass.IsReady) { toPass = topass; toGo = Player.transform.position; } else { inGoalDir = true; } } else { inGoalDir = true; } } } else { inGoalDir = true; if (enemyNear != null) { //Inimigo perto demais para ir pro gol. a probalidade de perder a bola e muito grande //Vou tentar um passe de bola SkillVar skillpass = Player.GetSkill_BasicPass(); PlayerController topass = null; if (GetToPass(out topass) && skillpass.IsReady && enemyNear.IsSelected()) { if (!Player.IsHitBetween(topass)) { toPass = topass; toGo = Player.transform.position; inGoalDir = false; } } else { //Nenhum player para tocar Assim sendo vou tentar driblar if (enemyNear.Distance(Player) <= 1.0f && enemyNear.IsSelected()) { if (timeToDrible >= 1.0f || Locomotion.IsAgentDone) { toGo = Locomotion.GetRandomNavCircle(Player, 3.5f); timeToDrible = 0; } inGoalDir = false; } } } } if (inGoalDir) //Tudo livre para ir para o GOL { if (Locomotion.IsAgentDone || timeToGoal >= 1.5f) { toGo = goalPosition.position; timeToGoal = 0; } } Move(toGo); }