void Update() { if (GameManager.GetStage() == GameManager.Stage.PlayerAim) { if (hasSnap) { Vector3 newMousePosition = Input.mousePosition; //Angulo é calculado pela diferença no eixo y e a força na diferença do eixo y float angle = (snapPosition.y - newMousePosition.y) / 200; if (angle > Mathf.PI) { angle = Mathf.PI; } float shotPower = Mathf.Abs((snapPosition.x - newMousePosition.x) / 20);//diferença no eixo x é a força do tiro if (shotPower > 20) { shotPower = 20; } Camera.main.orthographicSize = (shotPower / 8f) + 3; //Afasta a camera de acordo com a força do tiro GameManager.SetAngle(angle); GameManager.shotPower = shotPower; //Guarda a força do tiro no GameManager if (shotPower >= 2) { hud.EnablePopUp(); hud.UpdatePopUp(angle, shotPower); } else { hud.DisablePopUp(); } } if (!hasSnap && CrossPlatformInputManager.GetButtonDown("Fire1")) //Começou a mirar { snapPosition = Input.mousePosition; //varia a força e angulo baseado em onde a pessoa clicou hasSnap = true; //Player está mirando hud.CreatePopUp(snapPosition); } if (CrossPlatformInputManager.GetButtonUp("Fire1"))//Player deixou de mirar { hasSnap = false; if (GameManager.shotPower >= 2) //Se o tiro for muito fraco a flecha não é disparada { GameManager.SetStage(GameManager.Stage.playershot); // Passagem da rodada de jogador atirar para tiro do jogador GameManager.cameraInPosition = false; hud.DisablePopUp(); ShootingBehaviour.Shot(GameManager.shotPower, GameManager.angle, GameManager.arrow); } } } }
IEnumerator Aim(Vector3 playerPosition, float precison = 0.002f) { float distance = Vector3.Distance(gameObject.transform.position, playerPosition); float angle = 0; float time = 0; float horizontalVelocity = 0; int totalVelocity; float animationTimer = 0; for (totalVelocity = 4; totalVelocity <= 20; totalVelocity++) { angle = 0; for (angle = 0; angle < 1;) { angle += precison; horizontalVelocity = totalVelocity * Mathf.Cos(angle); float verticalVelocity = totalVelocity * Mathf.Sin(angle); time = -(verticalVelocity * 2 / Physics.gravity.y); //Gravidade no unity no eixo y = -9.8 if (time > (distance / horizontalVelocity)) { break; } } bow.SetBowRotation(Mathf.PI - angle); if (time > (distance / horizontalVelocity)) { break; } } //Quando a animação for executada a inteligencia artificial ja vai ter completado os calculos //Esta animação poderia ser feita pelo animator, mas como ja possuia um script que fazia a troca de sprites //(BowBehaviour), preferi aproveita-lo e fazer por código while (animationTimer < 1) { animationTimer += 0.03f; //Camera se afasta, da mesma forma de como quando o player atira, dando a impressão de que o inimigo esta aumentando a força Camera.main.orthographicSize = Mathf.Lerp(3, totalVelocity / 8f + 3, animationTimer); //Arco rotaciona, dando a impressão de que a ia esta mirando bow.SetBowRotation(Mathf.Lerp(Mathf.PI, Mathf.PI - (angle), animationTimer)); //Muda o sprite do arco, incrementalmente na direção do sprite com a corda mais puxada bow.SetBowPosition(Mathf.FloorToInt(4 * animationTimer + 1)); yield return(new WaitForSeconds(0.03f)); } //Adiciona erro tanto na velocidade do tiro quando no angulo de disparo. ShootingBehaviour.Shot(totalVelocity + totalVelocity * Random.Range(-erro, erro), (Mathf.PI - angle) + (Mathf.PI - angle) * Random.Range(-erro, erro), GameManager.arrow); //Atira e muda o estágio do jogo para EnemyShot GameManager.cameraInPosition = false; GameManager.SetStage(GameManager.Stage.EnemyShot); }