Example #1
0
 // ADDED to demonstrate a simple application (shooting on a threshold)
 void Update()
 {
     // Check the averaged volume
     if (GetAveragedVolume() > 0.05)
     {
         // If it's above the threshold, fire the gun
         m_TankShooting.Fire(15f, 1f);
     }
 }
    void Deserialize(NetworkReader _reader, Complete.TankShooting shot)
    {
        float lastLaunchForce = _reader.ReadSingle();

        shot.m_CurrentLaunchForce = _reader.ReadSingle();
        if (_reader.ReadBoolean() && lastLaunchForce != shot.m_LastLaunchForce)
        {
            shot.m_FireTransform.position = _reader.ReadVector3();
            shot.m_FireTransform.rotation = _reader.ReadQuaternion();
            shot.m_CurrentLaunchForce     = lastLaunchForce;
            shot.Fire();
            shot.m_Fired = false;
        }
    }
Example #3
0
    // Update is called once per frame
    void LateUpdate()
    {
        if (cooldownFirstShot > 0)
        {
            cooldownFirstShot -= Time.deltaTime;
        }
        coolDownVariabilityDir -= Time.deltaTime;
        if (coolDownVariabilityDir <= 0)
        {
            coolDownVariabilityDir = 1.0f;
            dirVariability         = Random.onUnitSphere;
            dirVariability.y       = 0;
        }

        //On détermine ou il veut aller
        //Il veut aller vers le joueur, mais aussi s'éloigner de ses potes
        //On fait un vecteur de répulsion
        Vector3 repulsion = new Vector3();

        for (int i = 0; i < ennemies.Length; i++)
        {
            if (ennemies[i] != transform)
            {
                Vector3 dirToOtherAi = (transform.position - ennemies[i].position);
                float   dist         = dirToOtherAi.magnitude;
                repulsion += (dirToOtherAi.normalized * 40) / dist;
            }
        }

        //Calcul des params de shoot si le joueur ne bougeait pas
        float distance = (transform.GetComponent <Complete.TankShooting>().m_FireTransform.position - player.position).magnitude;
        float theta    = Mathf.Asin(transform.GetComponent <Complete.TankShooting>().m_FireTransform.forward.y);
        float g        = Mathf.Abs(Physics.gravity.y);
        float speed    = Mathf.Sqrt((distance / (Mathf.Sin(2 * theta))) * g);
        float time     = (2 * speed * Mathf.Sin(theta)) / g;

        //On prevoit la position de l'ennemi si ce temps s'écoule
        Vector3 nextPos = player.transform.position + (player.GetComponent <Complete.TankMovement>().m_Speed *
                                                       player.GetComponent <Complete.TankMovement>().m_MovementInputValue *time *player.transform.forward);

        //On perturbe cette prochaine position en fonction de la qualité de l'ia
        Vector3 perturbation = dirVariability;

        perturbation.y = 0;
        perturbation  *= Mathf.Clamp01(1 - precision) * 15;
        nextPos       += perturbation;

        //On se base sur la prochaine position
        distance = (nextPos - transform.position).magnitude;

        Vector3 dirNextPos = (nextPos - transform.position).normalized;

        Vector3 dirPoint = nextPos + repulsion;
        float   angle    = Vector3.SignedAngle(transform.forward, dirPoint - transform.position, Vector3.up);

        tm.m_TurnInputValue     = angle / 50 * speedTurn;
        tm.m_MovementInputValue = speedMove;

        cooldownShot -= Time.deltaTime;

        //Teste le friendly fire
        bool tooClose = false;

        for (int i = 0; i < ennemies.Length; i++)
        {
            float dist = (nextPos - ennemies[i].position).magnitude;
            if (ennemies[i] != transform)
            {
                if (dist < 10)
                {
                    tooClose = true;
                }
            }
        }

        if (Mathf.Abs(angle) < 5 && cooldownShot <= 0 && !tooClose && cooldownFirstShot <= 0)
        {
            //On vise le poinit ou va se trouver le joueur
            distance = (transform.GetComponent <Complete.TankShooting>().m_FireTransform.position - nextPos).magnitude;
            speed    = Mathf.Sqrt((distance / (Mathf.Sin(2 * theta))) * g);

            ts.m_CurrentLaunchForce = Mathf.Max(15.0f, speed);
            ts.Fire(false, dirNextPos);
            cooldownShot = timeBetweenShot;
        }
    }