public void NuevoObjetivo(Atacable a)
 {
     if (!objetivosRegistrados.Contains(a))
     {
         objetivosRegistrados.Add(a);
     }
 }
Пример #2
0
    public void Atacar(Mirada mirada, int daño)
    {
        Debug.Log("Atacó");
        DeterminarDirecciónAtaque(mirada);
        escala = AtacanteTransform.lossyScale;

        facingOffset = Vector2.Scale(offset * direcciónAtaque, escala);

        tamañoEscalado = Vector2.Scale(tamaño, escala);

        puntoA = (Vector2)AtacanteTransform.position + facingOffset - tamañoEscalado * 0.5f;
        puntoB = puntoA + tamañoEscalado;

        int hitCount = Physics2D.OverlapArea(puntoA, puntoB, filtroAtaque, AtaqueOverlapResults);

        for (int i = 0; i < hitCount; i++)
        {
            golpe = AtaqueOverlapResults[i];
            Atacable objetivo = golpe.GetComponent <Atacable>();

            if (objetivo)
            {
                Debug.Log("Dañó a " + objetivo.name);
                if (objetivo.atacable)
                {
                    Instantiate(spark, objetivo.transform.position + new Vector3(0, 0, -0.5f), Quaternion.identity); //Desfase para proyectar la luz
                }
                daño = (int)Random.Range(daño * 0.5f, daño * 1.5f);
                objetivo.RecibirDanio(transform, daño);
                OnDamage?.Invoke();
            }
        }
    }
 // void Update()
 // {
 // if (!_att) OnEnable();
 // }
 private void OnDisable()
 {
     if (_att != null)
     {
         _att.AlRecibirAtaqueClient -= Flash;
         _att = null;
     }
 }
    IEnumerator Patrullar()
    {
        Wachin.Rifle = false;

        var offsetDePatrulla = Quaternion.Euler(0f, Random.value * 360f, 0f) * Vector3.right;
        var distOffsetDePatrulla = Random.value * (liderazgo ? liderazgo.rangoAutoAsociarPatrulla : 1f);
        var cambiarPosicionCuando = Time.time + Random.Range(cambiarPosicionCada[0], cambiarPosicionCada[1]);

        while (!_objetivo)
        {
            if (liderazgo)
            {
                if (Patrulla.Lider == this)
                {
                    liderazgo.LiderarPatrulla(Patrulla);
                    Wachin.PosBuscada = Patrulla.destinoPatrulla;
                }
                else
                {
                    var newPos = Patrulla.PosLider + offsetDePatrulla * distOffsetDePatrulla;
                    var hit = new NavMeshHit();
                    if (NavMesh.Raycast(Patrulla.PosLider, newPos, out hit, NavMesh.AllAreas))
                    {
                        Wachin.PosBuscada = hit.position;
                    }
                    else Wachin.PosBuscada = newPos;
                }
                Wachin.MiraHacia = Wachin.PosBuscada;
            }

            if (Time.time >= cambiarPosicionCuando)
            {
                cambiarPosicionCuando = Time.time + Random.Range(cambiarPosicionCada[0], cambiarPosicionCada[1]);
                offsetDePatrulla = Quaternion.Euler(0f, Random.value * 360f, 0f) * offsetDePatrulla;
                distOffsetDePatrulla = Random.value * liderazgo.rangoAutoAsociarPatrulla;
            }

            var objetivoDePatrulla = Patrulla.TomarObjetivoRandom();
            if (objetivoDePatrulla)
            {
                _objetivo = objetivoDePatrulla;
            }
            else
            {
                var nuevoObjetivo = VigilarPorNuevoObjetivo();
                if (nuevoObjetivo)
                {
                    Patrulla.NuevoObjetivo(_objetivo = nuevoObjetivo);
                    yield break;
                }
            }

            yield return null;
        }
    }
 private void OnEnable()
 {
     StartCoroutine(GameUtils.EsperarTrueLuegoHacerCallback(
                        () => JugadorLocal,
                        () =>
     {
         if (JugadorLocal && JugadorLocal.Atacable)
         {
             (_att = JugadorLocal.Atacable).AlRecibirAtaqueClient += Flash;
         }
     }
                        ));
 }
    IEnumerator Combatir()
    {
        Wachin.Rifle = true;
        var distanciaPrudenteActual = Random.Range(distanciaPrudente[0], distanciaPrudente[1]);
        var offsetDePosDeAtaque = Quaternion.Euler(0f, Random.value * 360f, 0f) * Vector3.right * distanciaPrudenteActual;
        var cambiarPosicionCuando = Time.time + Random.Range(cambiarPosicionCada[0], cambiarPosicionCada[1]);
        var dispararCuando = Time.time + Random.Range(dispararCada[0], dispararCada[1]);

        var wachinObjetivo = _objetivo.GetComponent<WachinLogica>();

        while (_objetivo)
        {
            if (Time.time >= cambiarPosicionCuando)
            {
                cambiarPosicionCuando = Time.time + Random.Range(cambiarPosicionCada[0], cambiarPosicionCada[1]);

                distanciaPrudenteActual = Random.Range(distanciaPrudente[0], distanciaPrudente[1]);
                offsetDePosDeAtaque = offsetDePosDeAtaque.normalized * distanciaPrudenteActual;

                offsetDePosDeAtaque = Quaternion.Euler(0f, Random.value * 360f, 0f) * offsetDePosDeAtaque;

                var nuevoObjetivo = VigilarPorNuevoObjetivo();
                if (nuevoObjetivo)
                {
                    Patrulla.NuevoObjetivo(nuevoObjetivo);
                }
                // var posibleNuevoObjetivo = Patrulla.TomarObjetivoRandom();
                var posiblesNuevosObjetivos = Patrulla.objetivosRegistrados.Select(at => at.GetComponent<WachinLogica>())
                    .Where(wa => wa && !wa.Noqueade).ToArray();
                if (posiblesNuevosObjetivos.Length > 0){
                    var posibleNuevoObjetivo = posiblesNuevosObjetivos[Random.Range(0, posiblesNuevosObjetivos.Length)];
                    if (posibleNuevoObjetivo)
                    {
                        _objetivo = posibleNuevoObjetivo.GetComponent<Atacable>();
                        wachinObjetivo = posibleNuevoObjetivo;
                    }
                }
            }
            Wachin.MiraHacia = _objetivo.transform.position;

            var offUp = Wachin.Agent.height * Vector3.up * 0.5f;
            var attPos = _objetivo.transform.position + offUp;
            var posOfInterest = attPos + offsetDePosDeAtaque;//move to
            if (Physics.Linecast(attPos, posOfInterest, out hit, visionBlocker))
            {
                Wachin.PosBuscada = hit.point;
            }
            else
            {
                Wachin.PosBuscada = posOfInterest;//_objetivo.transform.position+(transform.position-_objetivo.transform.position).normalized*distanciaPrudente;
            }

            if (Time.time >= dispararCuando && wachinObjetivo && !wachinObjetivo.Noqueade)
            {
                dispararCuando = Time.time + Random.Range(dispararCada[0], dispararCada[1]);
                posOfInterest = transform.position + offUp;//shoot from
                if (!Physics.Linecast(attPos, posOfInterest, out hit, visionBlocker))
                {
                    Wachin.ItemActivo.Activar();
                }
            }


            yield return null;
        }
    }
 public bool ObjetivoRegistrado(Atacable a) => objetivosRegistrados.Contains(a);