Noticias

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

Ayuda Logica

Iniciado por Jose, Noviembre 19, 2015, 03:47:48 AM

Tema anterior - Siguiente tema
Gente a ver la idea es la siguiente:Tengo una lista con varios objetos, lo que quiero hacer es una especie de scroll-bar pero por medio de botones: (ahi subo la imagen de lo que quiero lograr).La idea es cargar solo 3 objetos, el de la posicion 0,1 y 2 de la lista, si aprieto el boton con la flecha hacia abajo cargo los elementos 1,2 y 3 de la lista, si aprieto para arriba me vuele a mostrar los elementos 0,1 y 2...... y asi ir navegando la lista.Tengo el siguiente codigo pero no me esta resultando, a ver si alguien me puede ayudar: 
using UnityEngine;
using System.Collections.Generic;

public class Controlador : MonoBehaviour {

public List<GameObject> targetas;
public int contador;
public List<GameObject> tar;
public GameObject temporal;

// Use this for initialization
void Start ()
{
   for(int y=0; y<targetas.Count-1;y++)
   {
      temporal = Instantiate(targetas[y],new Vector3(0,y*2,0),Quaternion.identity) as GameObject;
      tar.Add(temporal);
   }

}

// Update is called once per frame
void Update ()
{
   if (Input.GetMouseButtonDown(0))
   {
      RaycastHit hit;
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      if (Physics.Raycast(ray, out hit))
      {
         if (hit.collider.name == "BotonAbajo")
            {
            tar.Clear();
            InterCambiar(1);
            Debug.Log("Presiono Boton Abajo");
            }
         if(hit.collider.name == "BotonArriba")
         {
            tar.Clear();
            InterCambiar(-1);
            Debug.Log("Presiono Boton Arriba");
         }
      }
      
   }   
}
public void InterCambiar(int contador)
{
   this.contador = this.contador + contador;
   int o = 0;
   for (int x=this.contador; x<targetas.Count; x++)
   {
      temporal = Instantiate (targetas
  • , new Vector3 (0, o * 2, 0), Quaternion.identity) as GameObject;
      //tar = Instantiate (targetas
  • , new Vector3 (0, o * 2, 0), Quaternion.identity) as GameObject;
      tar.Add(temporal);
      o++;
   }

   Debug.Log (this.contador);
   }
   
}
Gracias Saludos  

Bueno no se si es sumamente necesario que lo quieras asi pero pues unity cuenta con unas utilerías muy buenas, creando una mask puedes hacer que los target que tienes se muevan por medio de touch hacia arriba o hacia abajo, pero si lo que quieres es hacer que los botones sean los que controlan el scroll también te podría servir haciendo que cuando presionas ese cierto botón el panel en el que están esos botones cambiará su posición hacia arriba o hacia abajo de una manera que no se vea como scrollmira este tuto para que veas a lo que me refierohttps://www.youtube.com/watch?v=lUun2xW6FJ4

los objetos como son? son simples sprites, son gameobjects con propiedades , son animados?te pregunto todo esto por que puedes estar cambiando los elementos de diferentes formaspero para todo ocuparas un array de tus objetos. para saber el index de las 3 posiciones visibles.  saludos.

Noviembre 21, 2015, 04:41:17 PM #3 Ultima modificación: Noviembre 21, 2015, 04:51:17 PM por Jose
Buenas, Oaken3d gracias habia visto el tutorial pero como no sabia como adaptarlo con botones ya que la variable del scroll mueve de 0 a 1 y no sabia como hacer para que se mostraran de 3 por ves... Yo lo estoy intentando hacer con gameobject, intente hacer eso en el codigo pero no me salio mi idea era, muestro posicion 0,1 y 2 (el array puede contener n elementos) si aprieto el boton hacia abajo utilizaba una variable contador que le aumentaba el valor entonces ahora el array me muestra el 1,2 y 3 y si apretaba hacia arriba restaba el valor a la variable contador y entonces deberia de mostrar 0,1 y 2.....en mi cabeza la logica funcionaba jaaa pero cuando lo lleve a la practica no me resulto, por ahi le estoy escapando en algo.Gracias por las Respuestas, se agradece la ayuda. PD: el tema que no me esta resultando en mi caso es la forma de mostrar los objetos creo clones no se si sera la mejor forma, debe haber otra mejor, la mia tengo q andar creando y destruyendo clones cada ves q muevo las flechas :(.Mi objetivo es Hacer como subo ahi en la imagen una especie de intercambio de elementos, la parte que selecciono obejetos y despues los cambio la tengo hecha funciona bien, lo que me estaria faltando es mostrarlos en un panel, y bue poder ir navegandolos depende de la cantidad de targetas que tenga cada jugador (con las flechitas).

Hola, lo que quieres hacer se llama "Snap / Snapping Scroll List" , y es una de esas cosas que muchos tratan de hacer en Unity-UI (la nueva GUI que usa Unity desde la v.4.6).Esto es debido a que el ScrollRect, el componente encargado de hacer Scroll de contenido de la nueva UI, no trae soporte de snap. Hay varias soluciones buscando por Internet, pero ninguna es definitiva. Esto es, en parte, porque siempre se trata de conseguir un efecto de desplazamiento suave de tipo Carrousel, y las variables con las que trabaja el ScrollRect no tienen en cuenta el centro ni el foco de uno de los elementos contenidos durante el scroll.  Sí, es algo difícil de entender si no se conoce mucho de qué va el tema... Uno de los trucos más po***res es eliminar por completo el Scroll suave, añadir un ScrollBar invisible, junto a ese ScrollRect, y personalizar que el Script controle y posicione diferentes valores estáticos de la posición de dicho ScrollBar. Pero esto funciona sólo a medias, y teniendo en cuenta que el control que vamos a usar para realizar ese scroll es mediante la rueda del ratón. De nuevo, si no se entende de lo que estoy hablando, sería bueno que primero aprendieses cómo funciona la nueva UI, y cómo funciona internamente un ScrollRect.  A comentario personal, Yo he tratado de implementar un tipo de Scroll List controlable vía botones físicos (tecla o botón de joypad), y de momento es una locura y no he tenido mucho éxito.  Si alguien puede aportar alguna noticia relevante al respecto, se agradecerá muchísimo la colaboración, ya que es algo muy buscado en Unity3D por los diseñadores de UI. 
Añado una cosa que me he dejado, que puede ser relevante para el autor de este post: Si en tu proyecto de Unity tienes un EventSystem en la escena, con los componentes de InputModule activados, y le asignas al script de EventSystem, el 1er elemento que haya dentro, de contenido, del ScrollRect, verás que puedes recorrer toda la lista de elementos de ese ScrollRect con las teclas de cursor. Esa es una parte de la solución, ya que accedes al "elemento", a la opción seleccionada, de la lista. El problema no es ese, es lo que viene después. Resulta que debes conseguir que la Cámara y la máscara del Scroll Rect "enfoquen/apunten/muestren" y centren correctamente ese elemento de la lista seleccionado.  Porque sí, lo selecciona, pero tú no tienes por qué estar viéndolo en pantalla... 

No conocia eso de snap, vos decis algo asi? https://www.youtube.com/watch?v=OsnyJNbqYXoPero nose si esa sea la mejor (o una) solucion para lo que quiero hacer...

Yo tengo un control deslizante para ese tema en oscuridad... Lo vi por ahi en un video... Luego comparto el video...
8=========D

Noviembre 22, 2015, 02:46:27 PM #7 Ultima modificación: Noviembre 22, 2015, 02:47:53 PM por Mantis
Usa un array. Digamos que tienes 9 elementos y se muestran 3 cada vez. Al inicio tienes los 3 primeros elementos con SetActive(true) y los siguientes con SetActive(false);También usaremos un contador(int) para saber que grupo esta activo y visible. 
1. Ponemos contador a cero para empezar

2. Activamos los tres primeros elementos y desactivamos los otros seis
    array[0] hasta array[2] con SetActive(true);
    array[3] hasta array[5] con SetActive(false);
    array[6] hasta array[9] con SetActive(false);

si pulsas flechita_arriba  

    contador += 1;
    if(contador > 2){
        contador = 0;
    }

si pulsas flechita_abajo    

    contador -= 1;
    if(contador < 0){
        contador = 2;
    }

    if(contador == 0){
        array[0] hasta array[2] con SetActive(true);
        array[3] hasta array[5] con SetActive(false);
        array[5] hasta array[8] con SetActive(false);
    }else if .......
    .....
    .....
     
   
 

FNK Games  Games Developer  -  Juegos realizados en Unity para iOS y Android



[quote author=Jose" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34464" data-ipsquote-contentcommentid="123873">Mi objetivo es Hacer como subo ahi en la imagen una especie de intercambio de elementos, la parte que selecciono obejetos y despues los cambio la tengo hecha funciona bien, lo que me estaria faltando es mostrarlos en un panel, y bue poder ir navegandolos depende de la cantidad de targetas que tenga cada jugador (con las flechitas). [/quote]No es necesario ordenar manualmente los elementos. La UI los ordena verticalmente de forma automática utilizando el componente 'VerticalLayoutGroup'. Échale un vistazo al primer video que te han pasado.El componente 'VerticalLayoutGroup' ordena todos los 'children' del RectTransform donde se encuentra. Para que funcione correctamente a los children le tienes que añadir el componente 'LayoutElement' donde estableces un ancho/alto minimo.Luego para cambiar el orden utilizas el método SetSiblingIndex del componente RectTransform del botón.Enlace de descarga: http://www.speedyshare.com/uYsdF/scrolllist.unitypackage" rel="external nofollow date=1448120477]http://www.speedyshare.com/uYsdF/scrolllist.unitypackage 

Esto y el ejemplo de mantis me hizo acordar a cuando leía la famosa Paginacion en PHP jajajaja.
  

Noviembre 22, 2015, 08:27:14 PM #10 Ultima modificación: Noviembre 22, 2015, 08:30:47 PM por Jose
Kaito gracias por el ejemplo esta bueno, pero no es lo que quiero lograr no quiero cambiar el orden de los elementos (aunque ahora aprendi a hacerlo         public List<string> seleccionA;
public List<string> seleccionB;
public List<GameObject> jugadorACartas;
public List<GameObject> jugadorBCartas;

///////////Crear Targetas Jugador ///////////////////////////////////////////////
   if (creacion)
   {
      if(!chequeo)
      {
      for (int x=0; x<targetas.Count; x++) {
         tar = (GameObject)Instantiate (targetas
  • , new Vector3 (x *3, 0, 0), Quaternion.identity);
         tar.name = "targeta" + targetaContador.ToString();
         targetaContador++;
      }
         chequeo=true;
      }
   }
   //////////////Aca es la parte de seleccion con mouse////////////
   if(Input.GetMouseButtonUp(0))
   {
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      RaycastHit hit;
      
      if(Physics.Raycast(ray,out hit))
      {
         if(hit.collider)
         {
            string estable = hit.collider.name;
            SeleccionTargeta(estable);
         }
      }
   }
////////////////Funcion de Seleccion de Targeta/////////////
   void SeleccionTargeta(string asd)
{
   GameObject fix = GameObject.Find(asd);
   float xPos;
   float zPos;
   xPos = fix.transform.position.x;
   zPos = fix.transform.position.z;

   if(asd.Contains("targeta"))
   {
      if(seleccionA.Contains(asd))
         {
         seleccionA.Remove(asd);
         //GameObject fix = GameObject.Find(asd);
         fix.transform.position = new Vector3 (xPos,0,zPos);
         }
      else
      {
         //GameObject fix = GameObject.Find(asd);
         fix.transform.position = new Vector3 (xPos,2,zPos);
         seleccionA.Add (asd);
      }
   }
   if(asd.Contains("tor"))
   {
      if(seleccionB.Contains(asd))
      {
         seleccionB.Remove(asd);
         fix.transform.position = new Vector3 (xPos,0,zPos);
      }
      else
      {
         fix.transform.position = new Vector3 (xPos,2,zPos);
         seleccionB.Add (asd);
      }
   }
   //////////////////////////////Aceptar Tradeo/////////////////////////////////////////////
public void AceptarTradeo()
{
   tradear=false;
   aceptar.SetActive(false);
   rechazar.SetActive(false);
   if(B)
   {
   for(int i=0;i<seleccionA.Count;i++)
   {
      jugadorB.Add(seleccionA);
      jugadorA.Remove(seleccionA);
   }
   for(int x=0;x<seleccionB.Count;x++)
   {
      jugadorA.Add(seleccionB
  • );
      jugadorB.Remove(seleccionB
  • );
   }
      B=false;
   seleccionA.Clear();
   seleccionB.Clear();
   }
   if(C)
   {
      for(int i=0;i<seleccionA.Count;i++)
      {
         jugadorC.Add(seleccionA);
         jugadorA.Remove(seleccionA);
      }
      for(int x=0;x<seleccionB.Count;x++)
      {
         jugadorA.Add(seleccionB
  • );
         jugadorC.Remove(seleccionB
  • );
      }
      C=false;
      seleccionA.Clear();
      seleccionB.Clear();
   }

Ugh posicionar cosas del UI canvas por código es un VERDADERO dolor de pelotas... para eso mejor usar el legacy almenos te deja dibujar en posiciones absolutas de pantalla.

Ugh posicionar cosas del UI canvas por código es un VERDADERO dolor de pelotas[/quote]No, estas totalmente equivocado.@Jose, ya te han comentado arriba como se hace, si vas a tener una lista variada en cantidad de Items, entonces deberás utilizar Layout, Este Componente lo agregas al panel contenedor de Items.Con esto ya tenes solucionado el problema del 'Ordenamiento' del UI.Para lo de mas, te han dicho varias ideas, y todas están bastante buenas.   
PD: cuando usen UI acuerdense del UI SCALE MODE

Cita de: francoe1 date=1448227098" data-ipsquote="" data-cite="francoe1" class="ipsQuoteNo, estas totalmente equivocado.
Has intentado posicionar elementos del canvas por código?

[quote author=Braltor" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34464" data-ipsquote-contentcommentid="123925">Has intentado posicionar elementos del canvas por código?[/quote]Yo sí, y es mucho más práctico y fácil de lo que lo era antes del la v.4.6. A veces creo que os quejáis porque estáis chapados a la antigua y os da miedo cambiar de versión, en serio.... :D

Etiquetas: