Noticias

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

(SOLUCIONADO)¿Como destruir un componente "Script" de un gameobject?

Iniciado por ftejada, Enero 12, 2016, 01:54:51 AM

Tema anterior - Siguiente tema
Enero 12, 2016, 01:54:51 AM Ultima modificación: Enero 21, 2016, 01:42:16 AM por ftejada
Hola a todos!!!!¿De qué manera podría destruir, limpiar, borrar de memoria o como querais llamarlo, un script que es un componente de un gameobject sin tener que destruir ni desactivar dicho gameobject?He probado a desactivar el script con...
GetComponent<Script>().enable = false;
pero esto no me sirve.... Espero vuestra respuesta, saludos y gracias por adelantado.

Para destruir puedes utilizar la función Destroy.
Destroy(GetComponent<ElComponente>());
Suerte!

[quote author=francoe1 date=1452561202" data-ipsquote="" data-cite="francoe1" class="ipsQuote">Para destruir puedes utilizar la función Destroy.
Destroy(GetComponent<ElComponente
								

Vuelvo a sacar este tema a la luz porque queria preguntar algo... ¿¿¿desde el gameObjectA se puede destruir un script que está en el gameobjectB???Lo pregunto porque llevo horas intentandolo y no se destruyen, solo se desactivan (lo que viene a hacer el .enable)He probado:
//Este script está en otro gameobject
void OnTriggerEnter(Collider col)
{
    if(col.gameobject.tag == "xxx")
    {
        Object.Destroy(col.gameObject.GetComponent<SelectTarget>());
    }
}
Pero no funciona...Es que solo se pueden destruir componentes desde el propio gameobject???????
[quote author=ftejada date=1453335316" data-ipsquote="" data-cite="ftejada" class="ipsQuote">Vuelvo a sacar este tema a la luz porque queria preguntar algo... ¿¿¿desde el gameObjectA se puede destruir un script que está en el gameobjectB???Lo pregunto porque llevo horas intentandolo y no se destruyen, solo se desactivan (lo que viene a hacer el .enable)He probado:
//Este script está en otro gameobjectvoid OnTriggerEnter(Collider col)
{
    if(col.gameobject.tag == "xxx")
    {
        Object.Destroy(col.gameObject.GetComponent<SelectTarget>());
    }
}
Pero no funciona...Es que solo se pueden destruir componentes desde el propio gameobject???????[/quote]Nada... era una tonteria mia que no me habia dado cuenta....

Cita de: ftejada date=1453335316" data-ipsquote="" data-cite="ftejada" class="ipsQuoteNada... era una tonteria mia que no me habia dado cuenta....
Puedes decir cual era la tonteria please ? El unico error que yo veo es que usas object.Destroy () y la funcion Destroy es de la clase GameObject o MonoBehaviour, no de la clase Object; si la llamas desde un script que hereda de MonoBehaviour puedes llamarla sin mas con Destroy () ... no importa que quieras destruir del mismo GameObject o de otro que no es el mismo porque es una funcion estatica. Dejo claro que estoy escribiendo sin estar delante de Unity ni la pagina de referencia de Unity (por si estoy equivocado con lo de la clase object).P.D. lo que ha hecho que me llame la atencion es que los dos codigos son identicos. Gracias

Cita de: Arthure date=1453360183" data-ipsquote="" data-cite="Arthure" class="ipsQuotePuedes decir cual era la tonteria please ? El unico error que yo veo es que usas object.Destroy () y la funcion Destroy es de la clase GameObject o MonoBehaviour, no de la clase Object; si la llamas desde un script que hereda de MonoBehaviour puedes llamarla sin mas con Destroy () ... no importa que quieras destruir del mismo GameObject o de otro que no es el mismo porque es una funcion estatica. Dejo claro que estoy escribiendo sin estar delante de Unity ni la pagina de referencia de Unity (por si estoy equivocado con lo de la clase object).P.D. lo que ha hecho que me llame la atencion es que los dos codigos son identicos. Gracias
LA tonteria a la que me referia y que como estaba ya mareao despues de varias horas trabajamdo, era que tenia un trozo de codigo en el cual tenia tres if / else if. En dos de ellos tenia puesto el codigo de arriba destruyendo los componentes del gameobject que me interesaba... pero el otro else if no tenia el Destroy por que se me pasó ponerlo.El caso es que cuando el codigo entraba por el else if que no tenia el destroy evidentemente no destruia nada. Y yo como un tonto revisaba el codigo de los dos else if primeros viendo que estaba implementado el destroy y que debia funcionar, sin percatarme de que me faltaba implementarlo en uno aun.... Na... despistes tontos que tiene uno y te cuesta en algunos casos varias horas de trabajo.... Pero cuando mueves codigos de cierta embergadura es normal que de vez en cuando te pasen estas cosas... Digo yo!!!! Saludos y gracias por la explicacion

[quote author=ftejada date=1453376334" data-ipsquote="" data-cite="ftejada" class="ipsQuote">LA tonteria a la que me referia y que como estaba ya mareao despues de varias horas trabajamdo, era que tenia un trozo de codigo en el cual tenia tres if / else if.[/quote]Gracias por sacar de dudas
        Destroy (col.gameObject.GetComponent<Script>());
        this.transform.Translate (Vector.right);
    }
    else if (col.gameobject.tag == "yyy") {
        Destroy (col.gameObject.GetComponent<Script>());
        this.transform.Translate (Vector.left);
    }
    else if (col.gameobject.tag == "zzz") {
        Destroy (col.gameObject.GetComponent<Script>());
        this.transform.Translate (Vector.up);
    }
}
private void OnTriggerEnter (Collider col) {

    if (col.gameObject.tag == "xxx" || col.gameObject.tag == "yyy" ...) {
        Destroy (col.gameObject.GetComponent<Script> ());
    }

    if (col.gameobject.tag == "xxx") {
         this.transform.Translate (Vector.right);
    }
    else if (col.gameobject.tag == "yyy") {
         this.transform.Translate (Vector.left);
    }
    else if (col.gameobject.tag == "zzz") {
         this.transform.Translate (Vector.up);
    }
}
De ese modo, ademas de ocuparte menos lineas tu funcion (que tampoco es importante mientras este bien, las dos formas lo estan), no te encontraras con problemas de ese tipo que son "tontos" pero que te hizo perder varias horas. Suerte

Cita de: Arthure date=1453387420" data-ipsquote="" data-cite="Arthure" class="ipsQuote">Gracias por sacar de dudas {if (col.gameobject.tag == "xxx") {
        Destroy (col.gameObject.GetComponent<Script>());
        this.transform.Translate (Vector.right);
    }
    else if (col.gameobject.tag == "yyy") {
        Destroy (col.gameObject.GetComponent<Script>());
        this.transform.Translate (Vector.left);
    }
    else if (col.gameobject.tag == "zzz") {
        Destroy (col.gameObject.GetComponent<Script>());
        this.transform.Translate (Vector.up);
    }
}
private void OnTriggerEnter (Collider col) {

    if (col.gameObject.tag == "xxx" || col.gameObject.tag == "yyy" ...) {
        Destroy (col.gameObject.GetComponent<Script> ());
    }

    if (col.gameobject.tag == "xxx") {
         this.transform.Translate (Vector.right);
    }
    else if (col.gameobject.tag == "yyy") {
         this.transform.Translate (Vector.left);
    }
    else if (col.gameobject.tag == "zzz") {
         this.transform.Translate (Vector.up);
    }
}
De ese modo, ademas de ocuparte menos lineas tu funcion (que tampoco es importante mientras este bien, las dos formas lo estan), no te encontraras con problemas de ese tipo que son "tontos" pero que te hizo perder varias horas. Suerte
Dices poniendo dos funciones OnTriggerEnter() o más dentro del mismo script y cada una con codigo distinto????Pues no lo he intentado nunca porque pensé que pudiera dar algun tipo de problema de deteccion al ejecutar el gameplay.... pero parece muy buena idea/practica... En cuanto me contestes si lo que he creido entender, lo tomaré muy en serio. Muchas gracias por la idea...

Cita de: ftejada date=1453399364" data-ipsquote="" data-cite="ftejada" class="ipsQuote">Dices poniendo dos funciones OnTriggerEnter() o más dentro del mismo script y cada una con codigo distinto????/quote]Nooo xDDD eran dos ejemplos para ver la diferencia ... si los comparas, veras que hacen exactamente lo mismo. en el primer ejemplo, hay codigo que se repite en los tres casos del if anidado y en el segundo ejemplo he sacado ese codigo repetido y lo he puesto fuera de los if anidados.Asi cuando tengas que cambiar algo, no tendras que cambiarlo en todos los casos ... no se si entiendes lo que quiero decir. En los ejemplos he puesto una sola linea de codigo repetido, la funcion Destroy, pero que pudiera tener varias lineas.La idea es que cuando tengas un if anidado, sacar fuera todo el codigo repetido para tener que escribirlo solo una vez ... asi cuando tengas que modificar algo, añadir o eliminar, solo tendras que hacerlo una vez y no habra riesgo de que te dejes uno de los if sin modificar ;)

[quote author=Arthure date=1453399893" data-ipsquote="" data-cite="Arthure" class="ipsQuote">Nooo xDDD eran dos ejemplos para ver la diferencia ... si los comparas, veras que hacen exactamente lo mismo. en el primer ejemplo, hay codigo que se repite en los tres casos del if anidado y en el segundo ejemplo he sacado ese codigo repetido y lo he puesto fuera de los if anidados.Asi cuando tengas que cambiar algo, no tendras que cambiarlo en todos los casos ... no se si entiendes lo que quiero decir. En los ejemplos he puesto una sola linea de codigo repetido, la funcion Destroy, pero que pudiera tener varias lineas.La idea es que cuando tengas un if anidado, sacar fuera todo el codigo repetido para tener que escribirlo solo una vez ... asi cuando tengas que modificar algo, añadir o eliminar, solo tendras que hacerlo una vez y no habra riesgo de que te dejes uno de los if sin modificar ;)

Etiquetas: