Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: ftejada en Abril 12, 2017, 04:29:38 PM

Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: ftejada en Abril 12, 2017, 04:29:38 PM
Hola a todos!!!
 
Tengo un problema que es bastante raro o al menos no sabia que pudiese pasar algo asi.
 
 
 
Tengo un script llamemosle "Script_A" (el nombre de la clase y del script es el mismo "Script_A / Script_A.cs"), que tiene entre mucho codigo, una funcion publica. Algo asi:
 

public class Script_A : MonoBehaviour
{
//all code ....

public Vector3 calcularVerticesTessellation()
{
   ....
}
//all code ....
}

 
Y desde otro script estoy intentando acceder a este script para utilizar la funcion calcularVerticesTessellation(), pero no me reconoce que exista el script_A:
 

public class otroScript : MonoBehaviour
{
public GameObject gameObjectQueTieneComponent_script_A;
//.... code
void Update()
{
   Vector3 pos = gameObjectQueTieneComponent_script_A.GetComponent<Script_A>().calcularVerticesTessellation(); //PERO ESTO ME DA ERROR POR QUE NO RECONOCE QUE EXISTA EL Script_A
}
}

 
 
 
Tampoco puedo crear variables de tipo "Script_A" en el "otroScript". El Script_A no está dentro de ningun namespace... con que no debo de tener que utilizar ningun using para poder acceder a el.
 
 
 
Pero lo mas raro es que desde algunos scripts del proyecto SI me lo reconoce y no tengo problemas y desde otros NO.... Por ejemplo en el script de los standardAsset de ThirdPersonCharacter.cs no me lo reconoce, pero desde otros que yo creo, si.
 
Este problema también me está pasando con un namespace, en el que intento hacer un "using nombreDelNamespace;" pero tampoco me lo detecta. Como si no existiera. Sin embargo desde otros scripts si me reconoce ese namespaces y puedo utilizarlo haciendo el using...
 
 
 
Alguien sabe por qué tengo este problema y como sulucionarlo????
 
 
 
Saludos y gracias de antemano.
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: lightbug en Abril 12, 2017, 05:04:02 PM
Probaste rehacer todo? es decir copiar el cuerpo de la clase, borrar el archivo .cs y crear uno nuevo (nombre de archivo y clase coincidente). Mirando el script que subiste pareceria estar bien, aunque usaste un ejemplo, te diria que en casos asi subas exactamente lo que tenes, aunque sea una porcion del codigo, porque a la hora de ver nombres y estar tanto tiempo programando tu cabeza muchas veces te engaña, me paso muchas vece esto. Igual si desde otro lado te anda y no desde otro algo esta bien y mal al mismo tiempo. Proba rehacerlo y deci si tenes el mismo error, si es asi proba crear un proyecto nuevo y hace lo mismo, las veces que me paso que nada andaba y era porque me descargue algo del assetStore y me quebro inexplicablemente todo...
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: kingtrase en Abril 12, 2017, 07:22:19 PM
el nombre del fichero se llama como el nombre de la clase?
 
me refiero a que si el nombre del fichero tambien es Script_A y otroscript, unity obliga a que las clases derivantes de monoBehaviour tengan el mismo nombre de archivo que de nombre de la clase.
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: ftejada en Abril 13, 2017, 11:11:58 AM
Cita de: ftejada date=1492007378Tengo un script llamemosle "Script_A" (el nombre de la clase y del script es el mismo "Script_A / Script_A.cs"),
   


 
 
Cita de: kingtrase date=1492017739el nombre del fichero se llama como el nombre de la clase?
   
   
      me refiero a que si el nombre del fichero tambien es Script_A y otroscript, unity obliga a que las clases derivantes de monoBehaviour tengan el mismo nombre de archivo que de nombre de la clase.
   


 Gracias a ambos por contestar. kingtrase creo que te referias a eso de arriba...
 
 
 
Cita de: lightbug date=1492009442Probaste rehacer todo? es decir copiar el cuerpo de la clase, borrar el archivo .cs y crear uno nuevo (nombre de archivo y clase coincidente). Mirando el script que subiste pareceria estar bien, aunque usaste un ejemplo, te diria que en casos asi subas exactamente lo que tenes, aunque sea una porcion del codigo, porque a la hora de ver nombres y estar tanto tiempo programando tu cabeza muchas veces te engaña, me paso muchas vece esto. Igual si desde otro lado te anda y no desde otro algo esta bien y mal al mismo tiempo. Proba rehacerlo y deci si tenes el mismo error, si es asi proba crear un proyecto nuevo y hace lo mismo, las veces que me paso que nada andaba y era porque me descargue algo del assetStore y me quebro inexplicablemente todo...
   


lightbug no he subido lo que tengo porque son scripts de dos asset (MegaSplat y Final IK) y tiene mucho codigo.
 
He probado en un proyecto nuevo desde totalmente desde cero, he probado con monodevelope, visual studio, versiones diferentes de visualstudio, versiones distintas de Unity... He probado un monton de cosas.
 
Asumo que el codigo está bien y no hay fallos en ese aspecto. Ademas el problema tiene que venir, intuyo que, por otra cosa porque también me pasa lo siguiente:
 
Imagino que está relacionado. Y es que hay ciertos namespace que tampoco puedo utilizar con el "using" por que sencillamente no aparecen. He probado a crear un namespace propio, para intentar usar la directiva using en "otroScript", pero no me encuentra el espacio de nombres propio que habia creado para probar.... Este ultimo problema y el anteriormente citado, me sucede en scripts de Final IK pero tambien me pasa en el script de los standard asset "ThirdPersonCharacter.cs". Sin embargo en otros script propios que yo creo si me reconoce el espacio de nombres que habia creado para probar. Dejo enlace a video para que veais a qué me refiero exactamente y si veis algo que yo no se ver...
 
https://youtu.be/UKpjdyzYDSU (//%5Byoutube%5Dhttps://youtu.be/UKpjdyzYDSU%5B/youtube%5D)
 
 
 
Saludos y gracias de nuevo por la ayuda.
 
 
 
 
 
 
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: lightbug en Abril 13, 2017, 02:51:57 PM
ya lo mire, la verdad es que es bien raro, parece que tenes el problema con los namespaces anidados (en "RootMotion.FinalIK" y en "UnityStandardAssets.Character.ThirdPerson"), no se si con todos te pasará. Probaste si compilaba no (es q he tenido errores de sintaxis cuando el compilador no tenia problema por eso pregunto)? Probaste tipiando todo el namespace, sin hacer uso de los using?
 
A modo de test proba crear una clase en cualquier de los dos scripts problematicos (por ej en thirdperson), que esté fuera del namespace (o con su propio namespace), e intenta referenciar el HolaMundo que hiciste, es posible?
 
PD: que tosesita jaja
 
 
 
 
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: francoe1 en Abril 13, 2017, 04:00:50 PM
Efectivamente el problema es de los espacios de nombre..
 
Pero más que nada presiento que estás teniendo un error de referencias ¿Todos los script pertenecen al mismo proyecto?. Por ejemplo cuando utilizas Unit***itor, necesitas colocar el script dentro de una carpeta nombrada "Editor" y a su vez todos los script que se encuentren dentro de una carpeta "Editor" pertenecen a un proyecto independiente a los UnityEngine... (Explicación cutre).
 
La única razón por la cual este surgiendo este problema es que estés trabajando con proyectos no relacionados mediante referencia.
 
 
 
La clase GrounderFBBIK pertenece efectivamente a otro proyecto.. Terrain.Plugins a esto me refería, estás teniendo errores de referencia.
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: ftejada en Abril 14, 2017, 01:37:30 PM
De nuevo gracias por contestar...
 
Cita de: lightbug date=1492087917A modo de test proba crear una clase en cualquier de los dos scripts problematicos (por ej en thirdperson), que esté fuera del namespace (o con su propio namespace), e intenta referenciar el HolaMundo que hiciste, es posible?
   
   
      PD: que tosesita jaja
   


@lightbug Ando un poco perjudicado estos días con el resfriado... jeje.
 
Si, pero no funcionaba tampoco.  Los tiros van por donde ha dicho @francoe1
 
Cita de: francoe1 date=1492092050Efectivamente el problema es de los espacios de nombre..
   
   
      Pero más que nada presiento que estás teniendo un error de referencias ¿Todos los script pertenecen al mismo proyecto?. Por ejemplo cuando utilizas Unit***itor, necesitas colocar el script dentro de una carpeta nombrada "Editor" y a su vez todos los script que se encuentren dentro de una carpeta "Editor" pertenecen a un proyecto independiente a los UnityEngine... (Explicación cutre).
   
   
      La única razón por la cual este surgiendo este problema es que estés trabajando con proyectos no relacionados mediante referencia.
   
   
       
   
   
      La clase GrounderFBBIK pertenece efectivamente a otro proyecto.. Terrain.Plugins a esto me refería, estás teniendo errores de referencia.
   


@francoe1 hay varias cosas que no entiendo de este asunto ya que no sabia nada de lo que has mencionado. He mirado por internet pero no encuentro información clara para mi que me ayude a entender como funcionan todo el asunto de las referencias y como Unity estructura estos "distintos proyectos" dentro de un solo proyecto.
 
Dices que la clase GrounderFBBIK pertenece a otro proyecto, concretamente a "Terrain.Plugins" pero ¿A qué proyecto pertenece el script "ThirdPersonCharacter.cs"? ¿Cómo puedo yo saber eso? ¿Donde encuentro la información y cual es esa información que indica que pertenece a otro proyecto y el nombre de este?
 
Cuando me preguntaste que si "¿Todos los script pertenecen al mismo proyecto?" Debido a mi desconocimiento sobre este asunto te hubiese respondido que si... menos mal que diste la explicación despues y mas o menos ya me hice una idea de por donde iban los tiros.
 
Por dicha explicación me he formado una idea, aunque no se si es muy correcta, asi que la expongo para que me corrijas si procede... Por lo que entiendo ¿depende de en qué carpetas estén los script para pertenecer a uno u otro "subProyecto" dentro del proyecto?
 
Debe ser asi porque despues de tu explicación he probado a cambiar el script de los standard asset "ThirdPersonCharacter.cs" de la carpeta donde viene y lo he puesto colgando directamente de la carpeta Asset. Y ahora si me reconocía los script "HolaMundo.cs", los namespaces de "JBooth" y etc.
 
Pero claro!! al sacarlo de dicha carpeta se generan varios errores de compilacion ya que ahora otros scripts no pueden encontrar la referencia del "ThirdPersonCharacter.cs" ya que lo he cambiado de carpeta.
 
 
 
¿Como puedo solucionarlo sin tener que cambiarlos de carpetas? ¿Cómo puedo reconocer todos los "subProyectos" distintos dentro del proyecto y referenciarlos entre ellos para poder trabajar con todos entre si?
 
 
 
Saludos
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: francoe1 en Abril 14, 2017, 04:07:50 PM


   Soluciones, Proyectos y Referencia


   No se trata de sub proyectos, son proyectos independientes que están relacionados y pertenecen a una solución, es decir uno o un conjunto de proyectos pertenecen a una solución. Los proyectos dentro de una solución pueden o no estar "relacionados". En el caso de unity la solución puede contener varios proyectos.


   Aca te dejo una referencia de los mismos: http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder (http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder)


   ¿Porque varios proyectos?


   En muchos lugares varios proyectos se llaman capas, existen diferentes tecnicas de programacion por capa como lo son el modelo vista-controlador, modelo-negocio, etc. Estos tipos de "Soluciones" cuentan con 3 o más proyectos, por ejemplo en el modelo vista-controlador se encuentra 3 proyectos.


   -vistas -datos -controles


   En unity pasa exactamente lo mismo, cuando creamos un "Proyecto de Unity" se nos crea una "Solución" la cual podemos trabajar con Visual Studio, MonoDevelop, etc.(TODOS LOS "IDE" FUNCIONAN DEL MISMO MODO).


    


   ¿Cuando se crean más proyectos?


    


   se crean mas proyectos cuando unity lo requiere, existen casos concretos, por ejemplo, podemos vamos a programar un Plugin's nativamente para Windows, entonces podemos ubicarlo dentro de "Assets/MiCarpeta/Plugins/Windows/script.cs", automáticamente esta estructura de carpeta indica a unity que debe crear un proyecto nuevo, lo mismo sucede cuando utilizamos el Editor personalizado. "Assets/MiCarpeta/Editor/script.cs".


   En el caso de Plugins se añadirá a la solución un nuevo proyecto "Plugins", lo mismo para el caso de "Editor".


    


   ¿Cómo se comunican dos proyectos?


    


   La comunicacion entre proyectos se llama referencias, vamos a un ejemplo. Tenemos una solución que contiene 2 proyectos, A y B, ahora dentro del proyecto A tenemos una clase que se llama Player y dentro de B otra llamada Enemigo entonces: A.Player - B.Enemigo las dos clases se encuentran en diferentes proyectos entonces necesitamos crear la referencia.


    


   Para agregar una referencia en Visual C#:

   1º  - En el Explorador de soluciones, haga clic con el botón secundario del mouse en el nodo del proyecto y seleccione Agregar referencia.

   2º - En el cuadro de diálogo Agregar referencia, seleccione la ficha que indique el tipo de componente al que desea hacer referencia.

   3º - Seleccione los componentes a los que desee hacer referencia y haga clic en Aceptar.


    


   Una vez creada la referencia de la clase B en A, es decir, ahora A puede acceder a B pero B no puede acceder a A pero si agregariamos las referencias en los dos proyectos entonces esto funcionaria. 


   Ahora desde cualquier clase del proyecto A podemos acceder a la Clase enemigo que se encuentra en el proyecto B.


    


   
      Nota: Cuando no se utilizar namespace el espacio de nombre por defecto es el nombre del proyecto, en el ejemplo anterior los espacios de nombre para Player es A y para Enemigo es B.
   
   
       
   
   
      Soluciones
   
   
      1º A.Player 
   
   
       
   
   
      2º using A;
   
   
       
   


    
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: pioj en Abril 14, 2017, 06:56:13 PM
Muy bonito, pero por favor, se ruega respetar el formato clásico del texto en los mensajes, para una mayor claridad de lectura para el resto de los usuarios. Muchas gracias.
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: francoe1 en Abril 15, 2017, 01:46:08 AM
Cita de: pioj date=1492188973Muy bonito, pero por favor, se ruega respetar el formato clásico del texto en los mensajes, para una mayor claridad de lectura para el resto de los usuarios. Muchas gracias.
   


Jajajajajaja, estaba de arte....
Título: [Dejo Video al final] Script y namespace no reconocido solo en algunos scripts del proyecto
Publicado por: ftejada en Abril 15, 2017, 09:06:09 PM
Cita de: francoe1 date=1492178870

      

         Soluciones, Proyectos y Referencia
      

      
         No se trata de sub proyectos, son proyectos independientes que están relacionados y pertenecen a una solución, es decir uno o un conjunto de proyectos pertenecen a una solución. Los proyectos dentro de una solución pueden o no estar "relacionados". En el caso de unity la solución puede contener varios proyectos.
      
      
         Aca te dejo una referencia de los mismos: http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder (http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder)
      
      

         ¿Porque varios proyectos?
      

      
         En muchos lugares varios proyectos se llaman capas, existen diferentes tecnicas de programacion por capa como lo son el modelo vista-controlador, modelo-negocio, etc. Estos tipos de "Soluciones" cuentan con 3 o más proyectos, por ejemplo en el modelo vista-controlador se encuentra 3 proyectos.
      
      

         -vistas -datos -controles
      
      
         En unity pasa exactamente lo mismo, cuando creamos un "Proyecto de Unity" se nos crea una "Solución" la cual podemos trabajar con Visual Studio, MonoDevelop, etc.(TODOS LOS "IDE" FUNCIONAN DEL MISMO MODO).
      
      
          
      
      

         ¿Cuando se crean más proyectos?
      

      
          
      
      
         se crean mas proyectos cuando unity lo requiere, existen casos concretos, por ejemplo, podemos vamos a programar un Plugin's nativamente para Windows, entonces podemos ubicarlo dentro de "Assets/MiCarpeta/Plugins/Windows/script.cs", automáticamente esta estructura de carpeta indica a unity que debe crear un proyecto nuevo, lo mismo sucede cuando utilizamos el Editor personalizado. "Assets/MiCarpeta/Editor/script.cs".
      
      
         En el caso de Plugins se añadirá a la solución un nuevo proyecto "Plugins", lo mismo para el caso de "Editor".
      
      
          
      
      

         ¿Cómo se comunican dos proyectos?
      

      
          
      
      
         La comunicacion entre proyectos se llama referencias, vamos a un ejemplo. Tenemos una solución que contiene 2 proyectos, A y B, ahora dentro del proyecto A tenemos una clase que se llama Player y dentro de B otra llamada Enemigo entonces: A.Player - B.Enemigo las dos clases se encuentran en diferentes proyectos entonces necesitamos crear la referencia.
      
      
          
      
      

         Para agregar una referencia en Visual C#:

         1º  - En el Explorador de soluciones, haga clic con el botón secundario del mouse en el nodo del proyecto y seleccione Agregar referencia.

         2º - En el cuadro de diálogo Agregar referencia, seleccione la ficha que indique el tipo de componente al que desea hacer referencia.

         3º - Seleccione los componentes a los que desee hacer referencia y haga clic en Aceptar.
      
      
          
      
      
         Una vez creada la referencia de la clase B en A, es decir, ahora A puede acceder a B pero B no puede acceder a A pero si agregariamos las referencias en los dos proyectos entonces esto funcionaria. 
      
      
         Ahora desde cualquier clase del proyecto A podemos acceder a la Clase enemigo que se encuentra en el proyecto B.
      
      
          
      
      

         
            Nota: Cuando no se utilizar namespace el espacio de nombre por defecto es el nombre del proyecto, en el ejemplo anterior los espacios de nombre para Player es A y para Enemigo es B.
         
         
             
         
         
            Soluciones
         
         
            1º A.Player 
         
         
             
         
         
            2º using A;
         
         
             
         
      
      
          
      
   


Gracias @francoe1 He estado mirando todo lo que me has mandado. Voy a ir por partes porque hay cosas que aun me chirrian algo...
 
Al principio me confundia bastante que en las versiones de Visual Studio Community que trae Unity (2015 y 2017) la opción de agregar referencia clickeando con el boton dch del mouse encima del nodo "referencias" de la ventana explorador de soluciones, no la encontraba por ningun lado. Y perdí bastante tiempo por culpa de eso
 
Trasteando un tiempo he llegado a la conclusión de que no existe y que hay que hacerlo de otro modo. Y la verdad es que la manera de hacerlo es algo confusa y me costo averiguarla, ya que no he encontrado información por internet que me indicase como hacerlo. Y cuando terminemos este asunto intentaré subir un pequeño videotutorial por si a alguien le sirve.
 
 
 
Al seguir investigando y buscando información, en base a los datos que me habías proporcionado, (Ya que antes no sabia ni que tenia que buscar jeje)... Por lo que he encontrado, parece que no se puede haber referencias entre proyecto_A -> proyecto_B y proyecto_B -> proyecto_A a la vez. Se llama dependencia circular creo. Por lo que Visual Studio al intentarlo te lanza un mensaje de error y no te deja.
 
O al menos yo no he podido y tampoco he encontrado info de como hacerlo. Entonces, y si me equivoco corrigeme porfa, creo que lo que me comentaste no se puede hacer:
 



   
      Una vez creada la referencia de la clase B en A, es decir, ahora A puede acceder a B pero B no puede acceder a A pero si agregariamos las referencias en los dos proyectos entonces esto funcionaria.
   

[/quote]
 
Y es una pena porque entonces la solución a mi problema pasa por tener que meter el asset "MegaSplat" dentro de la carpeta Plugins del proyecto. Y no se si esto me generará algun problema en el funcionamiento de ese asset, espero que no y lo consultaré con el creador.
 
 
 
En fin voy a seguir indagando en este tema algo más...
 
Un saludo