Jump to content
p3dr0h4ck

Identificar BOX de la GUI

Recommended Posts

Buenas estoy probando a tener un pequeño inventario/menú con 5 elementos diferentes el caso es que el método GUI.Box http://docs.unity3d.com/ScriptReference/GUI.Box.htm

es un método de tipo void y por lo cual no me devuelve nada, y me gustaría manipular este menú mediante las teclas, es decir algo parecido a esto:

-Ver imagen.

 

Mi idea es que pudiera acceder a estas distintas cajas mediante un array, pero lo dicho, como no devuelve nada no se como acceder a ello, ¿alguien tiene alguna idea, o ha tenido una situación parecida?

Un saludo y gracias.

ejemplo.png

Share this post


Link to post
Share on other sites

Creo que te sería más sencillo hacerlo con la UI, e incluso con Event Triggers puedes hacerlo con menos programacion y con clicks.

Share this post


Link to post
Share on other sites

tambien puedes hacerlo con botones y despues de dibujar los botones dibujas encima el cuadro blanco o rojo

lo de mas es la variable seleccion para dibujar que cuadro se dibujara

Share this post


Link to post
Share on other sites

Creo que te sería más sencillo hacerlo con la UI, e incluso con Event Triggers puedes hacerlo con menos programacion y con clicks.

Probare haciéndolo directamente con la UI, aunque me gustaría que lo pudiera mover la selección del cuadro (BOX) con el teclado. Un saludo

tambien puedes hacerlo con botones y despues de dibujar los botones dibujas encima el cuadro blanco o rojo

lo de mas es la variable seleccion para dibujar que cuadro se dibujara

De esa forma es cierto que podría saber cual esta seleccionado, http://docs.unity3d.com/ScriptReference/GUI.Button.html , Ya que devuelve un valor boolean cuando se esta presionando pero repito, me refiero a utilizarlo sin clickeo, o tactil, solamente con las teclas. Un saludo

Share this post


Link to post
Share on other sites

Claro, antes que saliera la version 4.6 todo era con las GUI y ese tipo de cosas eran frecuentes; para responderte una forma podria ser crear una variable (int por ejemplo), y controlar esta en el Update () para que aumente en 1 o disminuya en 1 segun corresponda, al presionar la tecla que le asignes, luego con "if" en OnGUI () por cada valor muestras la box en la posicion que deseas.

Espero te sirva

Share this post


Link to post
Share on other sites

Claro, antes que saliera la version 4.6 todo era con las GUI y ese tipo de cosas eran frecuentes; para responderte una forma podria ser crear una variable (int por ejemplo), y controlar esta en el Update () para que aumente en 1 o disminuya en 1 segun corresponda, al presionar la tecla que le asignes, luego con "if" en OnGUI () por cada valor muestras la box en la posicion que deseas.

Espero te sirva

Podría ser una opción, ya que en OnGUI se esta redibuja constantemente el código que existe por lo cual en referencía a lo que usted dice el codigo quedaria de la sigiente forma más o menos:

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{

	//Array de tipo booleano que almacenara cual de los tres elementos esta activo
	bool[] posiciones = new bool[3];
	char[] letras = new char[3];
	void Start ()
	{
		//Por defecto estara activo el primero de ellos
		posiciones [0] = true;
		posiciones [1] = false;
		posiciones [2] = false;
		//El 0 lo utilizamos para representar el que esta marcado, como vemos corresponde con la posicion
		//en posiciones - true
		letras [0] = 'O';
		letras [1] = 'X';
		letras [2] = 'X';

	}

	void Update ()
	{
		//Si pulsamos "A" vamos hacia atras, y si estamos en el primero al ultimo
		if (Input.GetKeyUp (KeyCode.A)) {
			//El bucle debera cerrarse en caso de realizarse un cambio
			bool cierreBucle=false;
			for (int i=0; i<posiciones.Length && !cierreBucle; i++) {
				//Se ejecutara cuando estemos en el selecionado y no sea el primero, si no se produciria
				//un error debido a que lo pasariamos al posiciones[-1] que no existe 
				if (posiciones [i] && i != 0) {
					posiciones [i] = false;
					posiciones [i - 1] = true;
					cierreBucle=true;
					print ("Pasamos del: " + i + " - " + posiciones [i] + " al " + (i - 1) + " - " + posiciones [i - 1]);
					//Si es el primero este se vuelve a false y true el ultimo
				} else if (posiciones [i] && i == 0) {
					posiciones [i] = false;
					posiciones [posiciones.Length - 1] = true;
					cierreBucle=true;
					print ("Pasamos del: " + i + " - " + posiciones [i] + " al " + (posiciones.Length - 1) + " - " + posiciones [posiciones.Length - 1]);

				}
			}
			//Si pulsamos "D" vamos hacia adelante, y si estamos en el ultimo al primero
		} else if (Input.GetKeyUp (KeyCode.D)) {
			//El bucle debera cerrarse en caso de realizarse un cambio
			bool cierreBucle=false;
			for (int i=0; i<posiciones.Length && !cierreBucle; i++) {
				//Se ejecutara cuando estemos en el selecionado y no sea el ultimo, si no se produciria
				//un error debido a que lo pasariamos al posiciones[3] que no existe 
				if (posiciones [i] && i != (posiciones.Length - 1)) {
					posiciones [i] = false;
					posiciones [i + 1] = true;
					cierreBucle=true;
					print ("Pasamos del: " + i + " - " + posiciones [i] + " al " + (i + 1) + " - " + posiciones [i + 1]);
					//Si es el ultimo este se vuelve a false y true el primero
				} else if (posiciones [i] && i == (posiciones.Length - 1)) {
					posiciones [i] = false;
					posiciones [0] = true;
					cierreBucle=true;
					print ("Pasamos del: " + i + " - " + posiciones [i] + " al 0 " + posiciones [0]);
				}
			}
		} 



	}

	void OnGUI ()
	{
		for (int i=0; i<posiciones.Length; i++) {
			//vamos igualando donde la posicion sea true añadimos el el elemento letra que
			//sea igual a "O"
			if(posiciones[i]){
				letras[i]='O';
			}else{
				letras[i]='X';
			}
		
		}

		//Podriamos automatizarlo pero de esta manera es mas rapida para una simple prueba
		GUI.Button (new Rect (10, 10, 100, 50), "Opc: "+letras[0]);
		GUI.Button (new Rect (110, 10, 100, 50), "Opc: "+letras[1]);
		GUI.Button (new Rect (210, 10, 100, 50), "Opc: "+letras[2]);

			
	}

}

 

Con este ejemplo conseguimos lo que se ve en la imagen, si ha alguien se le ocurre otra forma, agradecería que la compartiera. Un saludo y gracias :D

Captura.PNG

Share this post


Link to post
Share on other sites

Aqui esta mi codigo p3dr0h4ck en update esta el codigo si quieres moverlo por teclado con A y S y enter para hacer algo si quieres y en OnGUI es para seleccionarlo por el raton

var posicion : int = 0;
var rojo : Texture2D;
var blanco : Texture2D;
var recu : Rect = Rect(20,20,70,70);

function Update () {
	//MOVIENDO Y SELECCIONANDO POR TECLADO
	if (posicion > 0 && Input.GetKeyUp (KeyCode.A))
		posicion--;	
	if (posicion < 4 && Input.GetKeyUp (KeyCode.D))
		posicion++;	
	if (Input.GetKeyUp (KeyCode.Return)){
		Debug.Log("ENTER EN "+posicion);///////////////////////////////////////////
	}	
}

function OnGUI() {
	recu.x = 20;
	for (var i : int =0; i < 5; i++){
		//////LO QUE PASA AL PRESIONAR A CON EL RATON
		if (GUI.Button(recu, "No."+i)){
			posicion = i;
			Debug.Log("SE SELECCIONO "+posicion);///////////////////////////////////////////
		}
		if (i != posicion)
			GUI.DrawTexture(recu, blanco);
		else
			GUI.DrawTexture(recu, rojo);
		recu.x +=70+10;
	}
}

 

Edited by jeico008

Share this post


Link to post
Share on other sites

 

Aqui esta mi codigo p3dr0h4ck en update esta el codigo si quieres moverlo por teclado con A y S y enter para hacer algo si quieres y en OnGUI es para seleccionarlo por el raton

var posicion : int = 0;
var rojo : Texture2D;
var blanco : Texture2D;
var recu : Rect = Rect(20,20,70,70);

function Update () {
	//MOVIENDO Y SELECCIONANDO POR TECLADO
	if (posicion > 0 && Input.GetKeyUp (KeyCode.A))
		posicion--;	
	if (posicion < 4 && Input.GetKeyUp (KeyCode.D))
		posicion++;	
	if (Input.GetKeyUp (KeyCode.Return)){
		Debug.Log("ENTER EN "+posicion);///////////////////////////////////////////
	}	
}

function OnGUI() {
	recu.x = 20;
	for (var i : int =0; i < 5; i++){
		//////LO QUE PASA AL PRESIONAR A CON EL RATON
		if (GUI.Button(recu, "No."+i)){
			posicion = i;
			Debug.Log("SE SELECCIONO "+posicion);///////////////////////////////////////////
		}
		if (i != posicion)
			GUI.DrawTexture(recu, blanco);
		else
			GUI.DrawTexture(recu, rojo);
		recu.x +=70+10;
	}
}

 

Gracias espero que esto ayude a más gente :D

Edited by p3dr0h4ck

Share this post


Link to post
Share on other sites

Prueba este script tambien es una opcion.

public class Inventario : MonoBehaviour {

	int seleccionado;

	void Update () {
		if (Input.GetKeyDown (KeyCode.A))
		{
			seleccionado--;
		}
		if (Input.GetKeyDown (KeyCode.D))
		{
			seleccionado++;
		}
		if (seleccionado > 4)
			seleccionado = 0;
		else if (seleccionado < 0)
			seleccionado = 4;
	}

	void OnGUI ()
	{
		int numeroBox = 5;
		for (int contador = 0; contador < numeroBox; contador++)
		{

			if (seleccionado != contador)
			{
				GUI.Box (new Rect (100 + 50 * contador,100,30,30), "");

			}
			else
			{
				GUI.Box (new Rect (100 + 50 * seleccionado - 5,100 - 5,40,40), "");
			}
		}


	}

 

Share this post


Link to post
Share on other sites

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