Noticias

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

[Aporte] Control de Botones Básico para Android

Iniciado por Mantis, Marzo 21, 2013, 09:20:53 PM

Tema anterior - Siguiente tema
Marzo 21, 2013, 09:20:53 PM Ultima modificación: Octubre 28, 2014, 11:58:33 AM por Mantis
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

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



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.


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.[/quote]

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

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



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??

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??[/quote]

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.

FNK Games  Games Developer  -  Juegos realizados en Unity para iOS y 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.[/quote]

Me podrías explicar algún ejemplo práctico para entender eso del "comportamiento de la pulsación"??



Me podrías explicar algún ejemplo práctico para entender eso del "comportamiento de la pulsación"??[/quote]

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.

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



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

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

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 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.[/quote]

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.

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



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.

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

oye disculpa pero no pude implementar ese scrip no se si pudieras ayudarme  te lo agradeseria mucho[/quote]

Que te ocurre?. Donde está el problema?. Has añadido  los GUITexture a la escena?  Has puesto el script al objeto que quieres mover?

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



Etiquetas: