Noticias

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

Ayuda con Script Destroy

Iniciado por PabloPBL, Diciembre 28, 2017, 04:38:00 PM

Tema anterior - Siguiente tema
Diciembre 28, 2017, 04:38:00 PM Ultima modificación: Diciembre 28, 2017, 05:21:26 PM por PabloPBL
Hola, tengo este script, que cuando el personaje colisiona con algún collider, este es destruido, luego busco la cantidad de objetos restantes que quedan de dicho objetos en la escena. Pero me vuelve a mostrar la misma cantidad que se mostraba al principio, este es mi código:
 

public void OnTriggerEnter(Collider other){
        Destroy(other.gameObject);
        this.numeroDeCubos = GameObject.FindGameObjectsWithTag("cubo").Length;
        Debug.Log("El numero de cubos es: " + this.numeroDeCubos);
        this.contador++;
        puntuacion.text = "Puntuacion: " + contador;
        if (this.contador == this.numeroDeCubos) {
            this.hasGanado.gameObject.SetActive(true);
        }
    }

 


 
 
Primero destruyo el objeto con el colisiono, luego guardo en una variable de clase, la cantidad de objetos que quedan en la escena, y luego muestro por consola dicha cantidad, pero el error esta en que me vuelve a mostrar la misma cantidad con la que empece antes de que se destruya cualquier objeto.

Hola, no se si te puede ayudar en algo ni si tiene que ver, pero en las referencias dice:
 
"Actual object destruction is always dela*** until after the current Update loop, but will always be done before rendering. "
 
supongo que "estás destruyendo" pero en realidad no se realiza el proceso hasta el final del update (?), para sacarte las dudas podés hacer eso de imprimir la cantidad de objetos de un tag en update y verificar si anda, es feo hacer un find cuadro a cuadro pero bueno, a modo de test:
 

void Update()
{
this.numeroDeCubos = GameObject.FindGameObjectsWithTag("cubo").Length;
    Debug.Log("El numero de cubos es: " + this.numeroDeCubos);
}

 
y fijate si cambia el numero devuelto.
 
En la realidad vos sabés con total seguridad que si tenes "n" objetos, eliminas 1, te quedan "n-1" ...osea, no es necesario guardar un numero, luego recorrer los n objetos, contarlos, para luego imprimir el numero si ya sabés que destruíste un solo objeto, simplemente conta los objetos en start y luego anda decrementando.

Hola, si lo que pasa es que cada determinado segundos(10 segundos), se instancia un nuevo objeto(Prefab), la idea de mi juego es que una pelotita agarre todos los items que hay en la escena, pero cada ciertos segundos se instancia un nuevo item en escena, por lo cual necesito si o si saber la cantidad de items que hay, para luego hacer la comprobación si es que la pelota agarro todos los items de la Escena.
 
Algo así lo tengo hasta ahora, pero no logro resolverlo :/
 
 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ControladorDelJugador : MonoBehaviour {
    public Text puntuacion, hasGanado;
    Rigidbody rb;
    public float velocidad;
    public int contador;
    private int numeroDeCubos;
    public float contadorInstanciacion = ;
    public GameObject cuboPrefab;
    Vector3 movimiento;
    private void Awake(){
        this.rb = GetComponent<Rigidbody>();
        this.contador = ;
        this.hasGanado.gameObject.SetActive(false);
        actualizarNumerodeCubos();
    }
    private void FixedUpdate(){
        float movimientoHorizontal = Input.GetAxis("Horizontal");
        float movimientoVertical = Input.GetAxis("Vertical");
        movimiento = new Vector3(movimientoHorizontal, , movimientoVertical);
        rb.AddForce(movimiento * this.velocidad);
        contadorInstanciacion += 1 * Time.deltaTime;
        if (contadorInstanciacion >= 20) {
            contadorInstanciacion = ;
            float tamañoDelJugador = 2;
            Instantiate(cuboPrefab, new Vector3(transform.position.x + tamañoDelJugador+1, 1, transform.position.z + tamañoDelJugador + 1), transform.rotation);
            actualizarNumerodeCubos();
        }
    }
    private void actualizarNumerodeCubos() {
        this.numeroDeCubos = GameObject.FindGameObjectsWithTag("cubo").Length;
        Debug.Log("El numero de cubos es: " + this.numeroDeCubos);
    }
    public void OnTriggerEnter(Collider other){
        Destroy(other.gameObject);
        actualizarNumerodeCubos();
        this.contador++;
        puntuacion.text = "Puntuacion: " + contador;
        if (this.contador == this.numeroDeCubos) {
            this.hasGanado.gameObject.SetActive(true);
        }
    }
}

 
 

Etiquetas: