Пример #1
0
 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);
             }
         }
     }
 }
Пример #2
0
    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);
    }