Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

El script no anda hasta que no encuentra un Gameobject "Objetivo".

Iniciado por Repeperilka, Diciembre 27, 2015, 03:49:04 PM

Tema anterior - Siguiente tema
Buenos dias, tardes, noches señoras y señores.Me ha surgido un problema a la hora de actualizar los scripts de mi proyecto a el nuevo Unity 5. El problema es el siguiente:Trato de crear un moba, y para seleccionar un objetivo al que atacar utilizo un raycast que cuando colisiona con un gameobject con el tag de "enemigo", este cambia a "objetivo". Hasta ahi todo perfecto, el problema comienza cuando utilizo un FindGameObjectWithTag ("Objetivo") en void Update para calcular la distancia entre el objetivo y el personaje y asi determinar si esta en rango de ataque.En la versión anterior de Unity este metodo me funcionaba de maravilla (obviando los cientos de mensajes de error mientras que el FindGameObjectWithTag no encontraba ningun "Objetivo"), pero ahora mientras este no encuentre un objetivo, el script completo deja de funcionar y no se me actualiza el rango, ni la variable booleana que determina si esta atacando, ni la distancia del enemigo (es comprensible que no se actualice la distancia ya que realmente no hay un enemigo, por ese motivo puse un if que resetea la distancia si no hay un objetivo y no funciona).Les dejo el script completo:using UnityEngine;
using System.Collections;public class Ataque_basico : MonoBehaviour {
    GameObject objetivo;
    estadisticas statsplayer;
    public float distanciaenemigo = 0;
    public float firerate;
    float nextfire = 0.0f;
    estadisticas statsenemy;
    public float rango;
    void Start () {
        statsplayer = this.gameObject.GetComponent <estadisticas> ();
    }
    
    // Update is called once per frame
    void Update () {
        objetivo = GameObject.FindGameObjectWithTag ("Objetivo");
        statsenemy = objetivo.GetComponent <estadisticas> ();
        statsplayer = this.gameObject.GetComponent <estadisticas> ();
        rango = statsplayer.rango;
        firerate = 1 / (statsplayer.vel / 2);
        distanciaenemigo = Vector3.Distance (this.transform.position, objetivo.transform.position);        if (distanciaenemigo < rango) {
            statsplayer.ataquebasico = true;
        } else if (distanciaenemigo > rango){
            statsplayer.ataquebasico = false;
        }        if (!objetivo) {
            distanciaenemigo = 20000000f;
        }        while (statsplayer.ataquebasico && statsenemy.hp != 0 && Time.time > nextfire) {
            statsenemy.hp = statsenemy.hp - statsplayer.basicatk;
            nextfire = Time.time + firerate;
        }
        
    }
    
    
} Gracias de antemano y disculpen las molestias.

Diciembre 27, 2015, 03:58:56 PM #1 Ultima modificación: Diciembre 27, 2015, 04:02:18 PM por Antonio
Hola Repeperilka.

En el código tienes que mirar más arriba, no sólo la distancia.

 
using UnityEngine;
using System.Collections;

public class Ataque_basico : MonoBehaviour {
    GameObject objetivo;
    estadisticas statsplayer;
    public float distanciaenemigo = 0;
    public float firerate;
    float nextfire = 0.0f;
    estadisticas statsenemy;
    public float rango;
    void Start () {
        statsplayer = this.gameObject.GetComponent <estadisticas> ();
    }
   
    // Update is called once per frame
    void Update () {
        objetivo = GameObject.FindGameObjectWithTag ("Objetivo");
        statsenemy = objetivo.GetComponent <estadisticas> (); //<- AQUI,
        //ya estás accediendo a la variable objetivo, ¿que pasa si no lo ha encontrado?

        statsplayer = this.gameObject.GetComponent <estadisticas> ();
        rango = statsplayer.rango;
        firerate = 1 / (statsplayer.vel / 2);
        distanciaenemigo = Vector3.Distance (this.transform.position, objetivo.transform.position);//<- AQUI
        //Ahi de nuevo está accediendo a la variable objetivo para coger la posición del transform, pero, ¿y si no lo ha encontrado?

        if (distanciaenemigo < rango) {
            statsplayer.ataquebasico = true;
        } else if (distanciaenemigo > rango){ //<-Aqui ya está usando la variable distanciaenemigo.
            statsplayer.ataquebasico = false;
        }

        if (!objetivo) {
            distanciaenemigo = 20000000f;
        }//Aqui corriges la variable distanciaenemigo, pero lo haces tarde, 
        //porque llegados a este punto, esa variable ya se ha usado.

        while (statsplayer.ataquebasico && statsenemy.hp != 0 && Time.time > nextfire) {
            statsenemy.hp = statsenemy.hp - statsplayer.basicatk;
            nextfire = Time.time + firerate;
        }
       
    }
}

Luego, sí, tienes que crear algún if para el caso de que el objetivo sea nulo, o comprobar que no sea nulo antes de seguir, pero en general, ese if tiene que contener más cosas, no sólo la distanciaenemigo. Esos casos en los que no encuentra la variable, pueden dar errores, algunos pasables, otros que detengan el procesamiento de este código... :S

 

Diciembre 27, 2015, 04:15:08 PM #2 Ultima modificación: Diciembre 27, 2015, 04:30:02 PM por Repeperilka
Muchisimas gracias señor mio. Es usted un grande xDHe agrupado las lineas que me has señalado en un if con la condición de si ha encontrado un objetivo y funciona de perfectamente.        if (objetivo) {
            statsenemy = objetivo.GetComponent <estadisticas> ();
            distanciaenemigo = Vector3.Distance (this.transform.position, objetivo.transform.position);
        } else if (!objetivo) {
            distanciaenemigo = 20000f;
        }Ahora si me pudieran contestar una pregunta mas, les estaria eternamente agradecido;¿Como se ponen las lineas de codigo en plan guay en los comentarios? Viendo la rapidez, eficacia y maestria de los lectores del foro, algo me dice que voy a pasar mucho tiempo aqui, y me vendria bien saberlo xDGracias.

Diciembre 27, 2015, 04:46:45 PM #3 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
Con el AddCode, aqui Pioj lo explica más detenidamente: http://unityspain.com/topic/25539-ayuda-cómo-incluir-código-correctamente/

En cuanto a las líneas de comentario, cuando pones las dos barras "//" al empezar a escribir, lo que venga después en esa línea se considerará comentario, y el compilador lo ignorará. Si tienes que escribir varias líneas de explicaciones en el código, también puedes usar el /*  ____   */  ,  por ejemplo:
if (x > 2)
{
    y = 2 * 2;
   
    /*  Esta línea va a ser ignorada.
    Esta línea también.
    Y esta
    y = y + 6;
    Esa línea también se ignora.
    */
   
    print (y);
    // El resultado de y será 4.
}
 


Etiquetas: