Noticias

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

Duda con OnMouseDown

Iniciado por Salva, Septiembre 05, 2015, 05:30:02 PM

Tema anterior - Siguiente tema
Saludos gente, soy muy novato por aqui en el tema de la creacion de videojuegos y tengo una duda, estoy haciendoo una especie de seleccion de nivel muy simple para un juego 2D, consiste en una imagen central que es un collider 2D para entrar al susodicho nivel y a ambos lados unas flechas para pasar a la pantalla del siguiente nivel y asi sucesivamente. El problema que se me presenta es que no se como hacer para que con un mismo script decirle a unity: diferenciame a que collider le hago click, si a la flecha o al nivel y actua en consecuencia"Gracias de antemano

No te es más fácil crear 2 objetos distintos con scripts distintos y ya?

[quote author=leocub58" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="21467" data-ipsquote-contentcommentid="107908 date=1441516416]No te es más fácil crear 2 objetos distintos con scripts distintos y ya?[/quote]Diría que lo primero que deberían aprender es en pensar en componentes. Creo que vienen con pensamiento de código centralizado, o sea, código que tiene que distribuir y enviar mensajes a todo el UI centralizando todos los objetos p.ej.

Saludos gente, soy muy novato por aqui en el tema de la creacion de videojuegos y tengo una duda, estoy haciendoo una especie de seleccion de nivel muy simple para un juego 2D, consiste en una imagen central que es un collider 2D para entrar al susodicho nivel y a ambos lados unas flechas para pasar a la pantalla del siguiente nivel y asi sucesivamente. El problema que se me presenta es que no se como hacer para que con un mismo script decirle a unity: diferenciame a que collider le hago click, si a la flecha o al nivel y actua en consecuencia"Gracias de antemano[/quote]Tal y como he entendido, quieres hacer una interfaz (GUI). Para ello te dejo la documentación oficial de Unity sobre componentes GUI. Lo que quieres son 'GUI.Button' y diferentes GUI.Label (quizá algún GUI.DrawImage) para mostrar qué nivel es el que está seleccionado actualmente. La mecánica es simple: un array que contenga todos los niveles, al pulsar el botón de la izquierda, baje en ese array (a no ser que esté seleccionado ya el primer nivel), y al pulsar el botón de la derecha, suba en ese array (a no ser que esté seleccionado ya el último nivel).

Tengo poca idea de programacion, lo mas basico de lo basico, me informaré en lo que me comentais de GUI y a ver que pasa, muchas gracias por vuestro tiempo chicos 
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="21467" data-ipsquote-contentcommentid="107932">Diría que lo primero que deberían aprender es en pensar en componentes. Creo que vienen con pensamiento de código centralizado, o sea, código que tiene que distribuir y enviar mensajes a todo el UI centralizando todos los objetos p.ej.[/quote]Tengo poca idea de programacion, lo mas basico de lo basico, me informaré en lo que me comentais de GUI y a ver que pasa, muchas gracias por vuestro tiempo chicos :P

[quote author=Salva date=1441573407" data-ipsquote="" data-cite="Salva">Tengo poca idea de programacion, lo mas basico de lo basico, me informaré en lo que me comentais de GUI y a ver que pasa, muchas gracias por vuestro tiempo chicos [/quote]De nada, por supuesto. Para eso está la comunidad de UnitySpain! :P

[quote author=Edgargaza" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="21467" data-ipsquote-contentcommentid="108117">De nada, por supuesto. Para eso está la comunidad de UnitySpain! :rolleyes:

Septiembre 08, 2015, 02:02:43 PM #7 Ultima modificación: Septiembre 08, 2015, 03:27:28 PM por Edgargaza
[quote author=Salva date=1441711971" data-ipsquote="" data-cite="Salva">Joder, pues estaria genial, si no es mucha molestia claro, te agradezco mucho la oferta!!using UnityEngine;
using System.Collections;

/**
 * - Esta clase es nuestro nivel. No puede ser añadida a ningun objeto del juego, y por ende, no puede formar parte de la escena.
 * No obstante, se puede crear una instancia de esta clase escribiendo, en un atributo de tipo Nivel, new Nivel("Nombre", id)
 *
 * * El nombre es el nombre de la escena. Es recomendable que se ponga el mismo nombre que la escena
 *
 * * El ID es el numero de identificacion de la escena. Si vamos al editor de unity y entramos en
 * File > Build Settings..., podremos añadir una nueva escena, y asi poder cargarla. Asi pues,
 * el numero de identificacion es el numero que nos sale a la derecha de cada escena añadida
 */
public class Nivel {
private string nombre;
private int numeroNivel;

// Constructor de la clase Nivel
public Nivel(string nombre, int numeroNivel) {
   this.nombre = nombre;
   this.numeroNivel = numeroNivel;
}

// GETTERS & SETTERS
   // Getters..
public string getNombre() { // Metodo que devuelve el nombre del nivel
   return nombre;
}

public int getNumeroNivel() { // Metodo que devuelve el numero de identificacion del nivel
   return numeroNivel;
}

   // Setters..
public void setNombre(string nombre) { // Metodo que modifica el nombre del nivel por un nombre definido en el parametro
   this.nombre = nombre;
}

public void setNumeroNivel(int number) { // Metodo que modifica el numero de identificacion del nivel por un numero definido en el parametro
   this.numeroNivel = number;
}

// Metodos funcionales
public void loadLevel() { // Metodo para cargar este nivel
   Application.LoadLevel (numeroNivel+1); // Aqui lo cargamos con el identificador del nivel. Podemos hacerlo tambien con el mismo nombre, pero si existen dos niveles nombrados de igual manera, pueden haber errores.
}
}
Como he explicado en los comentarios de cada clase, debes añadir el script SeleccionNivel a un objeto cualquiera de la escena la cual será para cargar los diferentes niveles, además de que tendrá que existir al menos una cámara para poder renderizar el GUI.Para añadir diferentes niveles, primero deberás añadir la escena al Build, para poder cargarlas. Para ello, antes que nada debes abrir la escena que quieres guardar. Entonces, debes ir a "File > Build Settings...", y dentro, con la escena cargada, darle al botón "Add Current". Así se añadirá la escena al compilador. Una vez añadida, te saldrá un número a la derecha de la nueva escena: es el número de identificación. Con él puedes cargar cualquier escena (como se ha hecho dentro de la clase Nivel.cs, en el método loadLevel()').Para añadir una nueva escena al selector (al GUI de SeleccionNivel.cs), solamente tendrás que crear una nueva variable tipo Nivel en el método Start de la misma clase (por ejemplo, Nivel nivel3 = new Nivel("Nivel3", 2)) y añadirla a la lista mediante el método local "añadirNivel(Nivel)". Una vez hecho esto, el nivel será añadido a la lista de niveles seleccionables.Como se ha explicado en el comentario de la clase Nivel.cs, es recomendable que en el constructor Nivel(string nombre, int id) pongas como nombre el nombre exacto de la escena, y como id, el valor previamente nombrado (número de identificación del nivel).Espero que te haya servido de algo!

[quote author=Edgargaza" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="21467" data-ipsquote-contentcommentid="108501">De acuerdo, hago el código y en cuanto lo tenga lo comparto ;using System.Collections;
using System.Collections.Generic;

/**
 * - Esta clase será nuestra interfaz para cargar el nivel. Para que se muestre, debemos añadirla
 * como componente a un objeto dentro del juego, y crear una nueva cámara
 */
public class SeleccionNivel : MonoBehaviour {
// Atributos privados
private List<Nivel> listaNiveles = new List<Nivel>(); // Lista de niveles
private Nivel nivelSeleccionado; // Nivel seleccionado

/**
 *  - Metodo preconstruido por UnityEngine que se autoejecuta al iniciar el juego
 */
public void Start() {
   // Añadimos dos niveles ("Nivel1" y "Nivel2")
   Nivel nivel1 = new Nivel ("Nivel1", 0);
   Nivel nivel2 = new Nivel ("Nivel2", 1);

   añadirNivel (nivel1);
   añadirNivel (nivel2);

   // Comprobacion de que los niveles se han añadido correctamente
   Debug.Log ("Niveles en la lista: " + listaNiveles.Count.ToString ());

   // Añadimos el primer nivel creado como el nivel seleccionado por defecto
   nivelSeleccionado = listaNiveles[0];

}

/**
 * - Metodo para añadir un nivel especifico a la lista de niveles
 */
public void añadirNivel(Nivel nivel) {
   if (!listaNiveles.Contains (nivel)) {
      listaNiveles.Add (nivel);
      Debug.Log ("Nuevo nivel añadido! Nombre: " + nivel.getNombre () + ", id: " + nivel.getNumeroNivel());
   } else {
      Debug.LogError ("El nivel que intentas añadir ya existe! (nombre: " + nivel.getNombre() + ", id: " + nivel.getNumeroNivel() + ")");
   }
}

/**
 * - Metodo para eliminar un nivel especifico de la lista de niveles
 */
public void eliminarNivel(Nivel nivel) {
   if(listaNiveles.Contains (nivel)) {
      listaNiveles.Remove (nivel);
      Debug.Log ("El nivel ha sido eliminado correctamente! (nombre: " + nivel.getNombre() + ", id: " + nivel.getNumeroNivel() + ")");
   } else {
      Debug.LogError ("El nivel no existe dentro de la lista de niveles! (nombre: " + nivel.getNombre() + ", id: " + nivel.getNumeroNivel() + ")");
   }
}

/**
 * - Metodo preconstruido por UnityEngine para dibujar todos los elementos de una GUI (Graphic User Interface)
 */
public void OnGUI() {
   // Crea un contenedor para organizar visualmente la interfaz
   GUI.Box (new Rect (5,5,160,50), ""); // El segundo parametro es un string el cual se refiere al nombre que mostraria el contenedor. En este caso, no le ponemos nombre

   // Crea dos labels (textos) para mostrar tanto el nombre del nivel como su numero de identificacion (id)
   GUI.Label (new Rect (10, 10, 150, 30), "Nombre: " + nivelSeleccionado.getNombre()); // Nombre del nivel
   GUI.Label (new Rect (10, 30, 150, 30), "ID: " + nivelSeleccionado.getNumeroNivel().ToString()); // Identificador del nivel

   // Crea los botones para seleccionar los respectivos niveles
   if (GUI.Button (new Rect (10, 60, 150, 30), "Siguiente")) { // Boton para avanzar
      int indexNivelSeleccionado = listaNiveles.IndexOf (nivelSeleccionado); // Posicion que ocupa el nivel en la lista

      if(indexNivelSeleccionado < listaNiveles.Count-1) // Si el nivel seleccionado no es el ultimo, se avanza. Si no, no se hace nada
         nivelSeleccionado = listaNiveles[indexNivelSeleccionado+1];
   }

   if (GUI.Button (new Rect (10, 95, 150, 30), "Atras")) { // Boton para retroceder
      int indexNivelSeleccionado = listaNiveles.IndexOf (nivelSeleccionado); // Posicion que ocupa el nivel en la lista
      
      if(indexNivelSeleccionado > 0) // Si el nivel seleccionado no es el primero, se retrocede. Si no, no se hace nada
         nivelSeleccionado = listaNiveles[indexNivelSeleccionado-1];
   }

   // Crea un boton para cargar el nivel seleccionado
   if (GUI.Button (new Rect (10, 130, 150, 30), "Cargar nivel")) {
      nivelSeleccionado.loadLevel ();
      Debug.Log ("Nivel cargado: " + nivelSeleccionado.getNombre() + "(" + nivelSeleccionado.getNumeroNivel() + ")");
   }
}
}• Nivel.cs (Objeto):
using UnityEngine;
using System.Collections;

/**
 * - Esta clase es nuestro nivel. No puede ser añadida a ningun objeto del juego, y por ende, no puede formar parte de la escena.
 * No obstante, se puede crear una instancia de esta clase escribiendo, en un atributo de tipo Nivel, new Nivel("Nombre", id)
 *
 * * El nombre es el nombre de la escena. Es recomendable que se ponga el mismo nombre que la escena
 *
 * * El ID es el numero de identificacion de la escena. Si vamos al editor de unity y entramos en
 * File > Build Settings..., podremos añadir una nueva escena, y asi poder cargarla. Asi pues,
 * el numero de identificacion es el numero que nos sale a la derecha de cada escena añadida
 */
public class Nivel {
private string nombre;
private int numeroNivel;

// Constructor de la clase Nivel
public Nivel(string nombre, int numeroNivel) {
   this.nombre = nombre;
   this.numeroNivel = numeroNivel;
}

// GETTERS & SETTERS
   // Getters..
public string getNombre() { // Metodo que devuelve el nombre del nivel
   return nombre;
}

public int getNumeroNivel() { // Metodo que devuelve el numero de identificacion del nivel
   return numeroNivel;
}

   // Setters..
public void setNombre(string nombre) { // Metodo que modifica el nombre del nivel por un nombre definido en el parametro
   this.nombre = nombre;
}

public void setNumeroNivel(int number) { // Metodo que modifica el numero de identificacion del nivel por un numero definido en el parametro
   this.numeroNivel = number;
}

// Metodos funcionales
public void loadLevel() { // Metodo para cargar este nivel
   Application.LoadLevel (numeroNivel+1); // Aqui lo cargamos con el identificador del nivel. Podemos hacerlo tambien con el mismo nombre, pero si existen dos niveles nombrados de igual manera, pueden haber errores.
}
}
Como he explicado en los comentarios de cada clase, debes añadir el script SeleccionNivel a un objeto cualquiera de la escena la cual será para cargar los diferentes niveles, además de que tendrá que existir al menos una cámara para poder renderizar el GUI.Para añadir diferentes niveles, primero deberás añadir la escena al Build, para poder cargarlas. Para ello, antes que nada debes abrir la escena que quieres guardar. Entonces, debes ir a "File > Build Settings...", y dentro, con la escena cargada, darle al botón "Add Current". Así se añadirá la escena al compilador. Una vez añadida, te saldrá un número a la derecha de la nueva escena: es el número de identificación. Con él puedes cargar cualquier escena (como se ha hecho dentro de la clase Nivel.cs, en el método loadLevel()').Para añadir una nueva escena al selector (al GUI de SeleccionNivel.cs), solamente tendrás que crear una nueva variable tipo Nivel en el método Start de la misma clase (por ejemplo, Nivel nivel3 = new Nivel("Nivel3", 2)) y añadirla a la lista mediante el método local "añadirNivel(Nivel)". Una vez hecho esto, el nivel será añadido a la lista de niveles seleccionables.Como se ha explicado en el comentario de la clase Nivel.cs, es recomendable que en el constructor Nivel(string nombre, int id) pongas como nombre el nombre exacto de la escena, y como id, el valor previamente nombrado (número de identificación del nivel).Espero que te haya servido de algo! [/quote]wow gracias, estas hecho un maquina, ojala y vea mas post tuyos de este estilo como me comentas!

por que no encapsulas la propiedad y au?
private string nombre
public string Nombre
{
    get{return nombre;}
    set{nombre = value;}
}
 

Septiembre 11, 2015, 11:36:29 AM #10 Ultima modificación: Septiembre 11, 2015, 11:37:24 AM por Edgargaza
[quote author=H@pesend date=1441944209" data-ipsquote="" data-cite="H@pesend">por que no encapsulas la propiedad y au?
private stringpublic string Nombre
{
    get{return nombre;}
    set{nombre = value;}
}
 [/quote]Hace tiempo que no usaba Unity (concretamente C#), y me olvidé de bastantes cosas. Además, después de dejar temporalmente de programar en Unity, me fui con Netbeans y su Java a programar algunos plugins con un colega. En Java no hay encapsulamiento, por lo que siempre ponía getProp() y setProp(), y me he acostumbrado. De todas maneras, ahora he empezado a recordarlo y de hecho no lo he editado aquí, pero lo uso siempre en mis proyectos

Etiquetas: