Jump to content
Mantis

[Aporte] Control de Botones Básico para Android

Recommended Posts

Hola a todos. A petición de un usuario voy a aportar un script para controlar un objeto mediante botones (GUITextures) en Android o dispositivos móviles. Es un script muy simple con cuatro botones, pero pienso será de gran ayuda para el que esté comenzando con esto de los móviles.

public var boton_abajo: GUITexture;
public var boton_izquierda : GUITexture;
public var boton_derecha: GUITexture;

private var boton_arriba_pulsado : boolean;
private var boton_abajo_pulsado : boolean;
private var boton_izquierda_pulsado : boolean;
private var boton_derecha_pulsado : boolean;

public var speed : float = 10.0;

function Awake(){

    SituarControles();   
}

function Update(){

    if(Input.touchCount > 0){
        for (var i = 0; i < Input.touchCount; ++i) {   
            if(boton_arriba.HitTest(Input.GetTouch(i).position)){	                     
                 boton_arriba_pulsado = true;  	                                       	           
            }else if(boton_abajo.HitTest(Input.GetTouch(i).position)){	        
                boton_abajo_pulsado = true;   	                                                                   	             
            }else if(boton_izquierda.HitTest(Input.GetTouch(i).position)){	                     
                boton_izquierda_pulsado = true; 		                                                                  
            }else if(boton_derecha.HitTest(Input.GetTouch(i).position)){	        
                boton_derecha_pulsado = true; 
            }             
        } 
    } 
    
    //UNA VEZ HEMOS RECIBIDO LAS ENTRADAS. ACTUAMOS!!!
    if(boton_abajo_pulsado){    
        transform.Translate(-Vector3.up * speed * Time.deltaTime);         
    }else if(boton_arriba_pulsado){    
        transform.Translate(Vector3.up * speed * Time.deltaTime); 
    }    
          
    if(boton_derecha_pulsado){   
         transform.Translate(Vector3.right * speed * Time.deltaTime);          
    }else if(boton_izquierda_pulsado){    
        transform.Translate(-Vector3.right * speed * Time.deltaTime);      
    }     
     		    	
    //LO PONEMOS A FALSE PARA COMPROBAR EN EL SIGUIENTE Update() SI SE SIGUEN PULSANDO O NO.
    boton_derecha_pulsado = false;
    boton_izquierda_pulsado = false;
    boton_arriba_pulsado = false;	
    boton_abajo_pulsado = false;
}

function SituarControles(){

    //CONTROL ABAJO      
    boton_abajo_pulsado.transform.position = Vector3.zero;
    boton_abajo_pulsado.transform.localScale = Vector3.zero; 
    boton_abajo_pulsado.guiTexture.pixelInset.width = Screen.width/7;
    boton_abajo_pulsado.guiTexture.pixelInset.height =  boton_abajo_pulsado.guiTexture.pixelInset.width;     
    boton_abajo_pulsado.guiTexture.pixelInset.x = Screen.width - (boton_abajo_pulsado.guiTexture.pixelInset.width * 1.1);
    boton_abajo_pulsado.guiTexture.pixelInset.y =  Screen.height/30;
    
    //CONTROL ARRIBA     
    boton_arriba_pulsado.transform.position = Vector3.zero;
    boton_arriba_pulsado.transform.localScale = Vector3.zero; 
    boton_arriba_pulsado.guiTexture.pixelInset.width = Screen.width/7;
    boton_arriba_pulsado.guiTexture.pixelInset.height = boton_arriba_pulsado.guiTexture.pixelInset.width;     
    boton_arriba_pulsado.guiTexture.pixelInset.x = Screen.width - (boton_arriba_pulsado.guiTexture.pixelInset.width * 1.1);
    boton_arriba_pulsado.guiTexture.pixelInset.y =  Screen.height/3;  
                                
    //CONTROL DERECHA       
    boton_derecha_pulsado.transform.position = Vector3.zero;
    boton_derecha_pulsado.transform.localScale = Vector3.zero; 
    boton_derecha_pulsado.guiTexture.pixelInset.width = Screen.width/7;
    boton_derecha_pulsado.guiTexture.pixelInset.height = boton_derecha_pulsado.guiTexture.pixelInset.width;     
    boton_derecha_pulsado.guiTexture.pixelInset.x = boton_derecha_pulsado.guiTexture.pixelInset.width + 
    boton_derecha_pulsado.guiTexture.pixelInset.width/1.8; 
    boton_derecha_pulsado.guiTexture.pixelInset.y =  Screen.height/30;
       
    //CONTROL IZQUIERDA       
    boton_izquierda_pulsado.transform.position = Vector3.zero;
    boton_izquierda_pulsado.transform.localScale = Vector3.zero; 
    boton_izquierda_pulsado.guiTexture.pixelInset.width = Screen.width/7;
    boton_izquierda_pulsado.guiTexture.pixelInset.height = boton_izquierda_pulsado.guiTexture.pixelInset.width;     
    boton_izquierda_pulsado.guiTexture.pixelInset.x =  Screen.width/50;
    boton_izquierda_pulsado.guiTexture.pixelInset.y =  Screen.height/30;                          
}

USO: Este script se lo ponen al objeto que vayan a mover. Luego se crean 4 GUitextures y se le agregan al script desde el inspector Saludos

Edited by Mantis

Share this post


Link to post
Share on other sites

Sencillamente genial. Espero que llegue el momento en que yo pueda hacer aportes del mismo calibre! Gracias por compartir. Buah, creo que lo entiendo todo, además parece ser que esta ajustado a la pantalla , que interesante me voy a dormir ya mismo para madrugar y empezar pruebas cuanto antes.

Share this post


Link to post
Share on other sites
Sencillamente genial. Espero que llegue el momento en que yo pueda hacer aportes del mismo calibre! Gracias por compartir. Buah, creo que lo entiendo todo, además parece ser que esta ajustado a la pantalla , que interesante me voy a dormir ya mismo para madrugar y empezar pruebas cuanto antes.
Los GUITexture se ajustarán a cualquier resolución. :cheer: En el script uso transform.Translate() pero este código lo puedes modificar o añadir más cosas, como que el objeto gire en la dirección del movimiento o lo que se te ocurra. me alegro que te sirva saludos

Share this post


Link to post
Share on other sites
Guest

Genial aporte... Mantis... muchas gracias. Yo ahora estoy empezando con Android, y he visto que tú usas Input.touchCount Yo, en las pruebas que estoy haciendo, uso GUItexture con OnMouseDown, para detectar la pulsación del botón, y funciona bien en el móvil que uso de pruebas, un S2. Lo veo más fácil... Qué diferencia hay? Me dará problemas a la larga??

Share this post


Link to post
Share on other sites
Genial aporte... Mantis... muchas gracias. Yo ahora estoy empezando con Android, y he visto que tú usas Input.touchCount Yo, en las pruebas que estoy haciendo, uso GUItexture con OnMouseDown, para detectar la pulsación del botón, y funciona bien en el móvil que uso de pruebas, un S2. Lo veo más fácil... Qué diferencia hay? Me dará problemas a la larga??
Aunque he visto que ciertas funciones que se usan para recibir las entradas del Mouse "funcionan" en Android, desconozco si a la larga tendrás problemas o no con ellas. En la documentación te dice que OnMouseDown() no tiene efectos en iPhone, pero no dice nada de Android. Piensa también que en algún momento te pueden hacer falta usar los Touch.phase, para saber el comprotamiento de la pulsación y tendrás que usar Input.touch. saludos.

Share this post


Link to post
Share on other sites
Guest
Piensa también que en algún momento te pueden hacer falta usar los Touch.phase, para saber el comprotamiento de la pulsación y tendrás que usar Input.touch. saludos.
Me podrías explicar algún ejemplo práctico para entender eso del "comportamiento de la pulsación"??

Share this post


Link to post
Share on other sites
Me podrías explicar algún ejemplo práctico para entender eso del "comportamiento de la pulsación"??
Claro.. Me refiero a saber si el dedo que hace el touch permanece tocando la pantalla, se ha movido , ha dejado de pulsarlo etc... Para eso está Touch.phase: http://docs.unity3d.com/Documentation/ScriptReference/Input.GetTouch.html Aunque es posible controlar algunos de estos estados sin usar Touch.phase. En mi script, por ejemplo, no los uso y controlo cuando se deja de pulsar el guitexture. Pero creo que para saber si el dedo se ha movido durante la pulsación sí que usaría TouchPhase.Moved, más que nada por facilidad.

Share this post


Link to post
Share on other sites
Guest

Siempre son de agradecer tus explicaciones, Mantis. Uno ya supone que no es fácil crear un juego, pero hasta que no lo intenta, no se da realmente cuenta, ja, ja... Y es que hay tantísimas cosas a tener en cuenta... Muchas gracias de nuevo...

Share this post


Link to post
Share on other sites
Guest

Hola soy nuevo en el foro y e visto gran aporte y le querido aprovechar y aprender sobre el pero me pasa una cosa incrustarle y todo se mueve y eso pero no colisiona el personaje queria saber el porque ? P.s : en los controles de pc si funciona la colision

Share this post


Link to post
Share on other sites
Guest

que bien Mantis, tambien estoy terminando el mio para dar el aporte, quería preguntarte este es para que tipo de mecanica de juego. osea el personaje se movería como.

Share this post


Link to post
Share on other sites
que bien Mantis, tambien estoy terminando el mio para dar el aporte, quería preguntarte este es para que tipo de mecanica de juego. osea el personaje se movería como.
Que tal. Solo tienes que ver el script y comprobarás que el objeto se mueve con transform.Translate(). Pero el script sirve para cualquier tipo de control a base de botones. Solo hay que cambiar transform.Translate() por lo que tu hagas para mover a tu personaje cuando pulses el botón.

Share this post


Link to post
Share on other sites

Hola Mantis. He estado dos semanas liado con unos retoques y up dates en el juego de brain paint y vuelvo a la carga con unity para conseguir resultados más profesionales. He creado tu script a mano, y no veo ningún fallo aún así me personaje no se mueve ni hace nada. La consola arroja el error "Missing MethodException : UnityEngine.Guitexture.BitTest Vale, es que es Hit no Bit xDDD Tengo que ponerme más cerca del monitor.

Share this post


Link to post
Share on other sites
Guest

oye disculpa pero no pude implementar ese scrip no se si pudieras ayudarme :) te lo agradeseria mucho

Share this post


Link to post
Share on other sites
oye disculpa pero no pude implementar ese scrip no se si pudieras ayudarme :) te lo agradeseria mucho
Que te ocurre?. Donde está el problema?. Has añadido los GUITexture a la escena? Has puesto el script al objeto que quieres mover?

Share this post


Link to post
Share on other sites

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