Noticias

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

Insertar sprite en function OnGui

Iniciado por ecko, Noviembre 02, 2017, 10:51:39 AM

Tema anterior - Siguiente tema
Buenas, pues resulta que estoy haciendo una interfaz con la funcion OnGui, mi interfaz se compone de una imagen de fondo y una imagen de marco (Bordes) , el problema que tengo es el siguiente, resulta que si la imagen no es proporcional los bordes me salen desproporcionados los laterales con los horizontales, entonces pensé en hacer de la imagen de bordes un sprite pero resulta que no puedes cargar sprite desde el OnGui, entonces me gustaría oir alguna posible solución, gracias de antemano.

Hola, me parece que si tenés referenciado tu sprite podés acceder a la textura del mismo con "sprite.texture", para usarla en GUI.DrawTexture (te daría una Texture2D).
 
Supongo que querés setear el sprite en 9-slice para que sea independiente del tamaño, si es esto lo querés no te va a funcionar lo que pedís, primero porque la funcionalidad esta es del sprite Renderer, y vos querés dibujarlo vos mismo desde OnGUI. Por qué directamente no ponés el sprite en la escena? o usas la UI?

GUI.DrawTextureWithTexCoords(Posición, Textura, sprite.rect);

Buenas de nuevo, el motivo de que no use la UI se debe a que este menú que quiero mostrar es un menú que muestra las características del objeto al poner el cursor encima de el, estos objetos pueden haber de varios tipos (con diferentes componentes y diferentes variables) lo cual tendría que crear varios UI (1 diferente por cada tipo de objeto) y luego crear y destruir el objeto UI cada vez que  ponga el cursor encima de un objeto o lo quite o cambie de objeto, pienso que esto es mucho mas costoso por ello prefiero el modo OnGui pero el único problema que tengo es este que menciono ya que el marco se deforma.

Cita de: ecko date=1510129747lo cual tendría que crear varios UI (1 diferente por cada tipo de objeto) y luego crear y destruir el objeto UI cada vez que  ponga el cursor encima de un objeto o lo quite o cambie de objeto, pienso que esto es mucho mas costoso
   


Estás seguro de eso?, cada vez que apagás la luz de tu casa agarrás un martillo, rompés el foco y despues cambías el foco roto por uno nuevo? o simplemente usas un switch? ... yo uso el switch. En este caso es lo mismo, ¿para qué destruir y crear cuando podés tener el mismo UI siempre activo (el gameObject) pero ir activando o desactivando su canvas? cuando cambias de personaje modificas los valores de interés del canvas (me refiero a sus hijos, texto, imagen, etc) justo antes de activarlo.
 
Probaste eso de referenciar sprite? igual no importa, se te va a seguir deformando, porque onGUI no maneja eso que supuestamente tratás de decir, pero que no decís, asi que estoy adivinando que será eso que tengo en mente. Supongo será esto: https://docs.unity3d.com/Manual/9SliceSprites.html
 
Ya que mencionas el costo, En OnGUI  el ciclo de refresco de dibujado es cuadro a cuadro, en UI no. En OnGUI no tenés esa funcionalidad que que´res para que no se deforme la imagen, es decir no podés usar sprites, salvo su textura, que en este caso no te sirve de mucho, esto lo podés resolver con un sprite renderer o usando UI.
 
En definitiva, OnGUI se usa para Editor y para algunos comandos de Debug que te pueden servir en runtime (por su comodidad mas que nada). Toda interfaz de usuario orientada al juego deberís rehacerla en UI.

Noviembre 08, 2017, 12:25:40 PM #5 Ultima modificación: Noviembre 08, 2017, 12:28:10 PM por lightbug
Cita de: gZone date=1510137614Para hacer 9slices con OnGUI lo más fácil es usar GUI Skin, ajusta la propiedad border del elemento en cuestión que es la que le indica al sistema a partir de donde no debe deformar (OnGUI maneja perfectamente 9 slices).
   


Ah mira, bueno saberlo.
 
Cita de: gZone date=1510137614Aplicar ese método supone el recacheado completo de la fuente utilizada cada vez que se reactiva, en builds no standalone puede fácil provocar picos cercanos al medio segundo.
   


Al medio segundo? ... me suena a mucho , nunca me pasó algo así.
 
Cita de: gZone date=1510137614Claro, entonces en las versiones de Unity anteriores a la UI... ¿OnGui estaba de adorno? Por no hablar de la cantidad de assets que hay en la store para crear menús y demás accesorios con el OnGui...
   


OnGUI es un sistema IMGUI, no está pensado desde sus entrañas para ser usado como UI general de videojuegos por motivos obvios (Ej: es necesario redibujar el boton ese cada vez que se pueda? el jugador tiene acceso a redimensionar cada vez un elemento UI? ), por algo se le dió tanta importancia a la UI en 4.6 (RMGUI) y por algo el resto de los motores no tiene un sistema IMGUI para diseñar menus, botones, etc...  aunque OnGUI puede ser muy útil cuando se lo utiliza bien, dependiendo del tipo de interfaz que se quiera. Yo siempre utilicé oNGUI para todo y me fue bastante difícil despegarme de él.
 
Y a tu pregunta, no, obviamente y por sentido común OnGUI no estaba "de adorno" porque era el unico método disponible para dibujar estas cosas en pantalla.
 
 
 
 

Cita de: gZone date=1510140972Es mucho más que botones, pero eso ya es otro tema...
   


 

   En realidad no, es casi eso, botones, ponele text fields, y algunas cosas más (widgets personalizados de cualquier tipo)...Revisá el asset store de vuelta, y fijate como los assets más po***res, conocidos y caros están basados en UI y no en OnGUI. (Por lo menos los orientados a UI-InGame y posteriores a Unity 5).

 
Cita de: gZone date=1510140972PD: el asunto es "pedían un como hacer" y ahí dejo la solución ;)
   


Lo que pide el autor del topic es una posible solución, pero más allá de eso lo importante es siempre dar un punto de vista alternativo si es que el problema no es encarado como se debe, (o por lo menos nos parece). Las soluciones "directas" a casi cualquier problema se encuentran en el manual o referencia, (ni hablar de google), solo hay que seguir leyendo. La ventaja de un foro es que los integrantes que lo conformamos no somos "páginas" de un manual. Te digo esto no para que lo tomes a mal, sino porque con esa PD al parecer sonás desesperado para te marquen la solución .
 
 

Aguante el IMGUI - me acuerdo hace 3 años cuando me arme un sistema de UI para utilizarlo iba bastante bien, a los 3 meses unity saco su sistema jaajaja
 


   
eature=oembed" width="480">

 
La diferencia entre IMGUI y El nuevo sistema mas que en las prestaciones esta el desarrollador, con IMGUI se logran buenos resultados y bastante ligeros, sin embargo no se pueden realizar las animaciones, rotaciones y muchas cosas que van de la mano con un diseño 3D -
 
Desde mi punto de vista, es el desarrollador quien tiene que decidir que sistema usar, diseñar y ver si el elegido no le va a generar inconvenientes en un futuro.

Noviembre 08, 2017, 03:32:44 PM #8 Ultima modificación: Noviembre 08, 2017, 03:34:07 PM por lightbug
Cita de: francoe1 date=1510149742Aguante el IMGUI - me acuerdo hace 3 años cuando me arme un sistema de UI para utilizarlo iba bastante bien, a los 3 meses unity saco su sistema jaajaja
   


Jajaa Te quedó exelente esa UI! yo tenía un sistema parecido en OnGUI pero no tan lindo como este, simplemente agregabas tres o cuatro elementos basicos y ahora lo estoy portando a UI pero con editor de nodos en vez de customInspector, la parte de los nodos es un bardo, pero bueno, de a poco va quedando.
 
Yo también era pro OnGUI, me encantaba programar absolutamente todo, el código daba esa exactitud que por alguna razón con la "nueva UI" no podía encontrar... hasta que aprendí a usar correctamente los anchors  y la cosa cambió notablemente, desde el diseño y desde la programación de la UI.
 
Cita de: francoe1 date=1510149742La diferencia entre IMGUI y El nuevo sistema mas que en las prestaciones esta el desarrollador, con IMGUI se logran buenos resultados y bastante ligeros, sin embargo no se pueden realizar las animaciones, rotaciones y muchas cosas que van de la mano con un diseño 3D -
   


Si, totalmente de acuerdo, por eso arriba puse "cuando se lo utiliza bien", si querés un boton que se mueva sinusoidalmente, cambie constantemente de color, se agrande y achique, etc, tener que manejarte por RmGUI para redibujarlo no es para nada amigable con la performance, es preferible usar ImGUI, y por esto Unity se paso a ImGUI para el editor, sobre todo para dockear ventanas y demás, además de la posibilidad de que el usuario promedio que usaba OnGUI sabía como pasarlo al Inspector, o una Window, etc, la interfaz mejoró muchisimo cuando lo hicieron no recuerdo bien la versión.
 
Fijate este asset (basado en UI), como maneja las transiciones, por poner un ejemplo que la UI no tiene porque ser tan dura.
 


   
eature=oembed" width="480">

 
 

Hasta el momento en el nuevo UI me siento mal cuando programo, veo que todo queda más o menos, no veo lógico tener que instanciar objetos cuando es necesario nuevos "ITEMS", y la verdad es que de a poco me voy adaptando, aunque tambien como vos, estoy realizando un sistema basados en nodos para poder crear las transiciones entre menús, porque es un dolor de cabeza tener referencias en un componente que esté comprobando si pasa X cosa, a parte de que toda la lógica la baso en eventos, evito los flags en bloques repetitivos para evitar cosas raras, algo que con IMGUI era totalmente natural.
 
Por ejemplo, actualmente estoy en el desarrollo de un Juego de Cartas, se generan muchísimo eventos a nivel interfaz, porque a pesar de que el juego cuente con pocos "menús" se basa totalmente en este el GamePlay, pero queda muy mal hacer esto-
 

private void Update()
{
if(NetworkConnection.IsConnect)
   ShowLogin();
else
   HideLogin();
}

 
Por lo que terminas basando en eventos las cosas y a la larga termina siendo un quilom

bo -
 
Por lo general armo todos mis juegos en IMGUI y luego paso a la nueva UI cuando están finalizados, creo que es el último paso -
 
 
 
Hablando de Anchors - En el sistema de UI estuve haciendo unas funciones para ocultar y mostrar menús con slides Top,Bottom,Left,Right pero me encuentro con el problema del pivote y los anc***d 
 
Si tenes un objeto padre con los anc***d al centro el pivote de los objetos hijos van relativamente bien de acuerdo a sus propios valores de anc***d, pero si cambias de lugar los anc***d el pivote no cumple ningún rol-
 
Por ejemplo -
 
Objecto Padre - Pivote en El centro - Anc***d en el centro - width 500px - height 500px.

Objecto Padre - Pivote en El centro - Anc***d fijado en los extremos del hijo - width 200px - height 200px.
 
¿Como mierda afecta el anc***d al pivote?
 
Me rompi la cabeza y no lo pude solucionar.
 
Si queres sacar la distancia que necesitar para poner el objeto fuera del padre se te hace imposible!

Noviembre 08, 2017, 05:55:05 PM #10 Ultima modificación: Noviembre 08, 2017, 05:59:59 PM por lightbug
Cita de: francoe1 date=1510153953¿Como mierda afecta el anc***d al pivote?
   


El pivot se mide desde los bordes de tu elemento (en relacion al ancho y alto total), no le importa el anchor
 
El anc***d position es la posicion del pivot de un objeto respecto a sus propios anchors, osea en cristiano: Punto azul vs "X" , es también la posicion que te figura en inspector, fijate que cambiando los anchor point cambia la pos. Osea más que como afecta el anc***d al pivot es alrevés. Si el anc***d es un rect (y no un punto .."X") ahora tenés top, bottom, left y right, el anc***d position ahora se mide "pivot vs punto medio del rect".
 

 
 
 
Cita de: francoe1 date=1510153953Si queres sacar la distancia que necesitar para poner el objeto fuera del padre se te hace imposible!
   


bueno eso lo podés hacer, primero (importante) es tener bien en claro la jerarquía que vas a usar, ya que por más que el anc***dPosition se mida desde el anchor de un mismo elemento, podrías llegar a tener hermanos que miden todos desde un punto en común y se te hace mucho más facil. Te paso una imagen del ejemplo, aunque esoy medio quemado jajaj pero bueno si queréspor ejemplo sacarlos por abajo independientemente del pivot y compartiendo un anchor debería funcionar:
 

 
 
 
Con el tema del padre despues lo veo, me parece que haciendo alguna que otra relacion con los anchors podés hacer lo mismo y no tener que hacerlo así.
 
 
 
 

Buenas, primero agradecer toda la información dada ya que me ha servido de gran ayuda, he estado configurando todo según los tutoriales que me mandasteis y hice lo siguiente:

Cree un sprite con su rect transform, asignandole los ejes en el editor 

Cree una GuiSkin y asocié el sprite en el apartado Box/Normal
 
Hasta aquí bien ya que muestra la imagen a la perfección pero tengo el siguiente problema, a la hora de crear la interface creo un box y luego sobre el voy insertando textos label lo cual estos textos deben de tener un margen con respecto al box,

entonces al cambiar las dimensiones lógicamente el margen es distinto (no siempre va a tener el mismo margen de separación estos textos).
 
Mi pregunta es, no hay forma de decirle al texto que se coloque siempre en el border L del sprite? 

Otra posible solución sería colocar el texto al centro del box, pero claro no sé cuanto tengo que desplazarlo luego a la izquierda dicho texto ya que dependiendo del número de caracteres de dicho texto tendré que desplazar mas o menos a la izquierda del centro del box y no hay forma de saber cuantos pixeles ocupa cada caracter para saber cuanto tengo que desplazarlo y además dependiendo de cada pantalla tendrá mas o menos pixeles... lo cual incrementa el problema.

Cita de: gZone date=1510234273Si desconoces el funcionamiento (como ha sucedido con el caso del border) no deberías aseverar, en todo caso opinar para tratar de ayudar pero sin afirmar y mucho menos dejando infestado el foro con malas prácticas de uso con Unity. (90% de tu contenido)
   


Faa 90% ... se ve que me estuviste revisando los 1383 posts ... picarón, debo de haberte tenido todo el día ocupado
 
-------------------------------------------------------------------------------------------------------------------------------------------
 
Bueno, ahora en serio, a ver, voy a tratar de razonar con vos porque tenés fascinación por tirarme mierda cada vez que podés (en el 90% de tu contenido ;) )  aunque en este caso en particular estás y no estás acertado... es un acierto cuántico si querés.
 
Primero decirte que tenés razon (50%), pero solo porque "queda feo" afirmar algo que no es, lo hice desde mi propia experiencia con GUI, aunque lo feo de la situación está complemente dirigido hacia mi mismo, el lector puede optar por ignorar mi mensaje si lo quiere o si tiene dudas averiguar él mismo (no hace falta decir que existen cientos de miles de recursos dando vueltas).
 
Hombre, a ver... trata de entender por un momento que significaría este lugar de encuentro "idealmente", si te metés al foro a "aprender" estás errado de entrada, por lo que mi palabra de "esto es así" no debería valer nada.
 
primero por el eslogan que don pioj no se cansa de repetir: "UnitySpain no es una comunidad de aprendizaje" , por lo menos la mesa de ayuda no está o debería estar enfocada en esto ya que todo contenido parte de una consulta , distinto es un recurso, o articulo, etc... algo que alguien ofrece y vos como usuario lo tomás o dejás ...
 
y segundo porque si todo usuario hiciera "lo que debe hacer" a la hora de incorporar un nuevo conocimiento de Unity o eliminar una duda especifica, el contenido efectivo de la mesa de ayuda seria del 1% del actual (sino menos).
 
Quien soy yo para dar la última palabra??? quien sos vos para dar la última palabra??? quien es X para dar la última palabra??? aca nadie recibe dinero de Pioj por "enseñar" por lo que la persona que quiere aprender un nuevo concepto debería tomar todo con pinzas, independientemente de quién lo diga... Otra vez... no somos páginas de un manual ... no tenemos ninguna verdad de nada, somos simples humanos conversando y quizás debatiendo sobre algún tema, obviamente podemos decir cualquier cosa (like real life).
 
Te parece que es importante que no desinforme? yo? un simple usuario de los miles que hay?
 
Un saludito Yizoun
 
 

Etiquetas: