Jump to content
Sign in to follow this  
Salva

Duda con OnMouseDown

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

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.

Share this post


Link to post
Share on other sites

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

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).

Share this post


Link to post
Share on other sites

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

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).

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.

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

Share this post


Link to post
Share on other sites

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

 

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

De nada, por supuesto. Para eso está la comunidad de UnitySpain! :P Si quieres te puedo pasar algunas plantillas para hacer lo que quieres explicadas paso a paso. Me llevaría algún tiempo para probarlas y comprobar que funcionan correctamente, pero la verdad es que a mi me va mejor aprender viendo el propio script y viendo en él lo que hacen

Share this post


Link to post
Share on other sites

De nada, por supuesto. Para eso está la comunidad de UnitySpain! :P Si quieres te puedo pasar algunas plantillas para hacer lo que quieres explicadas paso a paso. Me llevaría algún tiempo para probarlas y comprobar que funcionan correctamente, pero la verdad es que a mi me va mejor aprender viendo el propio script y viendo en él lo que hacen

Joder, pues estaria genial, si no es mucha molestia claro, te agradezco mucho la oferta!!:D:rolleyes:

Share this post


Link to post
Share on other sites

Joder, pues estaria genial, si no es mucha molestia claro, te agradezco mucho la oferta!!:D:rolleyes:

De acuerdo, hago el código y en cuanto lo tenga lo comparto :D

EDIT:
Perfecto! Ya lo tengo hecho. Me ha llevado poco tiempo después de todo... :P

Aquí está:

• SeleccionNivel.cs:

using UnityEngine;
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! :P

Cualquier duda o problema que tengas, sin dudarlo me lo comentas! :D

Por cierto, creo que haré algunos post para ayudar a gente que este entrando en el mundillo de Unity... pueden ser útiles (entre ellos irá algo como esto) :P

Edited by Edgargaza
Código creado

Share this post


Link to post
Share on other sites

De acuerdo, hago el código y en cuanto lo tenga lo comparto :D

EDIT:
Perfecto! Ya lo tengo hecho. Me ha llevado poco tiempo después de todo... :P

Aquí está:

• SeleccionNivel.cs:

using UnityEngine;
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! :P

Cualquier duda o problema que tengas, sin dudarlo me lo comentas! :D

Por cierto, creo que haré algunos post para ayudar a gente que este entrando en el mundillo de Unity... pueden ser útiles (entre ellos irá algo como esto) :P

wow gracias, estas hecho un maquina, ojala y vea mas post tuyos de este estilo como me comentas!

Share this post


Link to post
Share on other sites

por que no encapsulas la propiedad y au?

private string nombre
public string Nombre
{
    get{return nombre;}
    set{nombre = value;}
}

 

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 :P

Edited by Edgargaza

Share this post


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

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