Jump to content
Sign in to follow this  
Licnus

Ayuda con programación pls :)

Recommended Posts

Hola, que tal a todos, soy nuevo en este foro, y la verdad también en el desarrollo de videojuegos.

Yo no soy programador, y en el desarrollo de mi juego me ha salido un problema que no tengo ni idea de como resolverlo. Quisiera ver si alguien aquí puede ayudarme porque ya le di muchas vueltas al asunto y no se que pasa.

Tengan un poco de paciencia porfa :)

Este es mi script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class EnemigoSeguidor : MonoBehaviour
{

    public float visionRadius;
    public float Speed;
    public GameObject prefExp;
    GameObject player;
    Vector3 initialPosition;
    Vector3 target01;

    public static bool enRango = false;

    // Use this for initialization
    void Start()
    {
        StartCoroutine(autoDestroy());
        player = GameObject.FindGameObjectWithTag("Player");

        target01 = new Vector3(Random.Range(-988.4f, 988.6f), Random.Range(988.8f, -988.6f), 1f);
    }

    // Update is called once per frame
    void Update()
    {

        Vector3 target = target01;
        initialPosition = transform.position;

        float dist = Vector3.Distance(player.transform.position, transform.position);

        float rango = Vector3.Distance(initialPosition, target01);

        if (rango <= 0)

        {
            target01 = new Vector3(Random.Range(-988.4f, 988.6f), Random.Range(988.8f, -988.6f), 1f);
        }

        if (dist < visionRadius)
        {
            enRango = true;
            target = player.transform.position;
        }

        if (dist > visionRadius)
        {
            enRango = false;
        }
         
        float fixedSpeed = Speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target, fixedSpeed);

        Debug.DrawLine(transform.position, target, Color.green);

    }

    void OnDrawGizmos()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, visionRadius);
    }

    void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.tag == "Destructor" && enRango)
        {
            Destroy(gameObject);
            Instantiate(prefExp, transform.position, Quaternion.identity);
        }

        if (collider.tag == "MeteorG" && enRango)
        {
            
            Destroy(gameObject);
            Instantiate(prefExp, transform.position, Quaternion.identity);
        }

        if (collider.tag == "MeteorM" && enRango)
        {
            Destroy(gameObject);
            Instantiate(prefExp, transform.position, Quaternion.identity);
        }

    }

    IEnumerator autoDestroy()
    {
        yield return new WaitForSecondsRealtime(120);
        Destroy(gameObject);
        Instantiate(prefExp, transform.position, Quaternion.identity);
    }
 }

Aqui lo que sucede es que el "enemigo" persigue al "player" en tanto entre en el rango de vision. Y cuando este sale de rango, el "enemigo" sigue su curso. El problema es que cuando hay varios enemigos parece haber un bug. Ya que para poder hacer colision con ciertos objetos, como se ve en el script, necesito estar "enRango = true", pero al haber varios "enemigos" siguiendo al player y  si uno se destruye, parece que "enRango" cambia a false, y los demas objetos ya no pueden hacer colisión a pesar de que aun siguen al "player".Quisiera ver si alguno de ustedes sabe cual es la razón y como puedo resolverlo.

Muchas gracias de antemano desde ya!.

 

Share this post


Link to post
Share on other sites

Todos tuvimos tu problema, el típico problema del static, seguro por comodidad o por falta de conocimiento en general pusiste la variable en static, pero resulta que todos usan de la misma variable, entonces cuando uno la escribe afecta a lo que los otros están leyendo. El truco (en general) está en pensar a las variables, clases, métodos, etc como objetos reales, en tu caso, ¿Por que existe una algo externo y accesible por todos que dice si alguien está en rango o no? es como si alguien te dijera que es lo que vos estás viendo ahora, que mejor que vos mismo para decir lo que vos estás viendo ahora ... se entiende? Para no darle mucha bola al código, lo que deberías hacer es que cada enemigo sepa detectar al player, esto lo podrías hacer calculando la distancia al objetivo. Según lo que se ve ahí lo estás haciendo (?):

 float dist = Vector3.Distance(player.transform.position, transform.position);

... si es menor a X detectado = true.

Una vez tengas eso necesitas interpretar esa información y actuar, para esto te conviene hacer una simple y mega funcional "maquina de estados", en si un switch con un enum para evaluar, para este propósito va como piña. En este ej está en update pero podés hacer una corrutina tranquilamente.

enum EnemyState
{
	Idle , // o rascandose los quinotos
	Caminando ,
	Persiguiendo ,
	Mueriendo , //que se yo
	, etc....
}
EnemyState enemyState;

...

void Update()
{
	switch(enemyState)
  {

	case EnemyState.Caminando:
	
	////hacer lo de Caminando, por ej detectar si está o no el player en rango
	if( estaEnRango() )
		enemyState = EnemyState.Persiguiendo;
	
	break;

	case EnemyState.Persiguiendo:

	//Hacer lo de persiguiendo
	// ...


	break;

	....
  }
}

Tener if esto if el otro a la larga te va a dar problemas, con 3 if's no se ve pero cuando tengas 6 , 9 , 12 te vas a acordar de mi.

  • Like 1

Share this post


Link to post
Share on other sites

Consejo para la próxima vez: Acostumbraos a pegar los códigos muy largos en una página de tipo Pastebin, y colgar aquí sólamente su link, por favor.

La lectura se hace incompresible cuando tienes que ir bajando 2 páginas con el scroll...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...