Jump to content
Sign in to follow this  
Ufita

Duda GetComponent<script>()

Recommended Posts

Buenas noches compañeros como saben soy bastante nuevo por aquí, así que no me maten con la duda. 

Comentar que en unos ejercicios ya aplique esto y funciona bien, pero en otro proyecto que estoy haciendo no me permite hacer "GetComponent<script>()".

A ver si me explico bien: 

Tengo una escena que monto por script (es un ejercicio que estoy ampliando), por lo tanto en pantalla solo tengo la camara, luz y dos GO vacíos. 

Tengo 2 prefabs (2 fichas de puzzle) y uno de ellos tiene textura (hasta aquí todo bien), el que tiene textura se parte mediante script y se forma el puzzle en pantalla.

imagen puzzle.png

El problema viene cuando en uno de esos go, tengo seteado que imagen usar, desde un menú digo que imagen quiero usar, si veo el GO la variable se asigna bien pero al momento de leerla desde mi script par amontar el puzzle no me permite inspeccionar ese elemento. 

Quiero poner GameObject.Find ("AdminUI").GetComponent<script>(); (esto lo tengo en otro proyecto) y no me permite poner script GameObject.Find ("AdminUI").GetComponent<------>();  aquí salen muchas opciones pero no script.

 

Seguro que estoy haciendo algo mal, pero no doy con que, la idea es acceder al script y a su variable Texture, para asignarla al puzzle. Si alguno me da un poquito de luz, estaré muy agradecido, si estoy preguntando una chorrada os pido disculpas y agradecería un "algo" para saber por donde seguir. 

En AdminUI, tengo:

 

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class AdminUI : MonoBehaviour {

	public static AdminUI adminUI;
	public Texture textura;

	void Awake(){
		if (adminUI == null) {
			adminUI = this;
			DontDestroyOnLoad (gameObject);
		} else {
			if (adminUI != this)
				Destroy (gameObject);
		}
	}

	public void SetImagen (Texture pTextura){
		textura = pTextura;
	}


	public void CargarEscena(string pEscena){
		SceneManager.LoadScene (pEscena);
	}
		
}

Y luego en PuzzleSetup, intento en el start hacer lo que explicaba, (obtener la variable publica textura) aclaro que no es un proyecto mio super chuli, sino que es un ejercicio que hice hace tiempo y quería perfeccionarlo un poquillo, 

 

Bueno no os doy más guerra, mil gracias. 

 

Saludos; 

 

EDITO:

Al parecer en este caso hay otra forma de acceder que es directamente a la variable por medio de la clase estática. AdminUI.adminUI.textura; 

Lo que sigo sin entender porque no me funciona el find. Accediendo a la clase estática logro la funcionalidad que busco. 

 

Edited by Ufita

Share this post


Link to post
Share on other sites

la primera pregunta (y más evidente) que se me ocurre es ¿por qué estás intentando acceder a un script que tienes EN OTRO PROYECTO? No soy más que un novato, pero desde mi ignorancia, lo que planteas suena bizarro xD. Copialo a tu proyecto y vuelve a hacer la prueba. Hasta donde sé, Game.Find no encontrará nada fuera del proyecto!

 

 

 

Share this post


Link to post
Share on other sites

Como dice farenhai, no vas a poder acceder a cualquier cosa de otro proyecto. Se complicarían mucho las dependencias entre proyectos.

Si deseas utilizar de manera común scripts de otros proyectos y no quieres ir copiando scripts para no complicar el mantenimiento, create una DLL en un proyecto aparte a nivel de C# y copia la DLL en los proyectos en vez de los scripts.

Share this post


Link to post
Share on other sites

en caso de q SI este en el mismo proyecto, puede ser q estas mezclando clases de JS y C#, o q la clase esta en un namespace… en el primer caso es mejor usar solo un lenguaje (recomiendo C#), en el segundo pones el nombre del namescape delante (ej. ElNamespaceDeMiClase.MiClase).

Share this post


Link to post
Share on other sites

Muchas gracias por vuestras respuestas, pero no estoy en los casos que comentan: 

1) Es el mismo proyecto, son dos escenas y dos scripts pero del mismo proyecto. Lo que comento de "otro proyecto" es que uso esa forma de buscar un script y en ese "otro proyecto" va bien, como lo dicen en varios vídeos y tutoriales. 

2) Estoy en todo momento trabajando con C#.

 

Yo creo que viene relacionado al tema de instanciar al clase como static, como decía si accedo directamente a la clase funciona, ahora mismo tengo la funcionalidad que quiero pero obviamente me gustaría entender por qué no va del otro modo. :22_stuck_out_tongue_winking_eye:

 

Nuevamente mil gracias por la ayuda. 

Share this post


Link to post
Share on other sites

Pues la respuesta experta la dejo para los expertos... pero Sí: si instancias como la variable Static, no te deja hacerlo a través de GetComponent. La pregunta es: ¿para qué hacerlo si ya la tienes declarada como static? Supongo (en respuesta a tu pregunta) que una vez declarada la variable como static, la variable queda en RAM (además de ser única), por lo que sería más rápida y menos costosa (el gasto mayoritario ya los has hecho al declararla static).

 

Sospecho que la razón es equivalente a: ¿Para qué gastar tu dinero en construir una carretera comarcal (más barata) cuando ya tienes una autopista (que costó más dinero, pero que funciona mejor y más rápido) si llevan al mismo lugar?... Por este mismo motivo, C# no te dejaría acceder a una variable static a través de GetComponent (ya tienes una autopista hecha!!!)

 

De todas formas, esto es meramente especulativo por mi parte y probablemente esté equivocado... Seguro que los compañeros podrán arrojar más y mejor luz sobre esta duda que me parece teorícamente interesante, aunque no sé si especialmente relevante...

 

Un saludo!!

Share this post


Link to post
Share on other sites
hace 3 horas, Ufita said:

Muchas gracias por vuestras respuestas, pero no estoy en los casos que comentan: 

1) Es el mismo proyecto, son dos escenas y dos scripts pero del mismo proyecto. Lo que comento de "otro proyecto" es que uso esa forma de buscar un script y en ese "otro proyecto" va bien, como lo dicen en varios vídeos y tutoriales. 

2) Estoy en todo momento trabajando con C#.

 

Yo creo que viene relacionado al tema de instanciar al clase como static, como decía si accedo directamente a la clase funciona, ahora mismo tengo la funcionalidad que quiero pero obviamente me gustaría entender por qué no va del otro modo. :22_stuck_out_tongue_winking_eye:

 

Nuevamente mil gracias por la ayuda. 

Una clase static no se instancia nunca.

Share this post


Link to post
Share on other sites
hace 1 minuto, iRobb said:

Una clase static no se instancia nunca.

Creo que intenta entender el motivo "profundo" (la razón que motiva que no se pueda instanciar), más allá de la "gramática"...  y yo ya me quedo con la duda... ¿Va bien encaminado lo que decía yo en el post anterior?

Share this post


Link to post
Share on other sites

Claro, como dices. El GetComponent() es para un objeto que está realmente instanciado. Piénsalo como un prefab con Instantiate.

Una clase static no debe instanciarse y se accede globalmente por su nombre de definición. En un objeto hay un nombre de definición y uno de declaración que son diferentes. En una clase static los dos son los mismos.

Pero cuidado con las clases static. Una cosa es la necesidad (por ejemplo una clase de Debug) y otro ir haciéndolo por la pereza de no pasar parámetros o no utilizar GetComponents en clases.

Share this post


Link to post
Share on other sites

Gracias por las respuestas, 

Efectivamente quería saber si era por lo de Static (lo suponía). 

A ver la idea de todo esto es: 

1 menú con varias imágenes (escena 1)  que pasa por parámetro  (eso intentaba)  la imagen seleccionada, para que luego el puzzle se monte con esa imagen. 

 

Por lo que vi para poder trabajar con esos parametros lo mejor era definir esa clase como static. Variables entre objetos ya se obtenerlas (GameObjet.find)  pero entre escenas no vi como podía hacerlo que no fuera con static. 

 

Si hubiera otra forma también se agradece una pequeña luz, pero con la explicación que se da por varios compañeros ya estoy satisfecho. 

Share this post


Link to post
Share on other sites

 

hace 15 minutos, Ufita said:

Si hubiera otra forma también se agradece una pequeña luz, pero con la explicación que se da por varios compañeros ya estoy satisfecho. 

 

 

En según qué situaciones, te puede interesar el método DontDestroyOnLoad() (que imagino que ya conoces, pero por si las moscas te recuerdo) para conservar el GO entre una escena y otra  ...

Edited by farenhai

Share this post


Link to post
Share on other sites
Sign in to follow this  

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