Noticias

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

Mover personaje

Iniciado por pyciy, Septiembre 17, 2015, 01:37:05 PM

Tema anterior - Siguiente tema
Hola a todos, necesito ayuda para enfocar un proyecto unity para android.
Lo que quiero es utilizar botones del canvas para mover un personaje. Lo he hecho con el metodo on click del boton pero yo quiero que el movimiento sea continuado y no tener que ir pulsando el boton izquierda constantemente. Espero me ayudeis.

Puedes usar booleanos para moverlo, uno para cada dirección sería lo más simple, por ejemplo; cuando pulses el botón "derecha", pones el booleano "MoverDerecha" en true y los demás en false. Sería un poco tedioso pero simple. Luego el tema es para que se pare, porque estaría moviéndose eternamente, y si lo paras por ejemplo con físicas sería conveniente poner el booleano en false...

A ver si lo he entendido... ¿quieres qué mientras esté presionado se mueva? ¿o qué una vez presionado se mueva automáticamente aunque sueltes el botón?Para lo primero, creo que la solución es el método Input.GetMouseButtonDown(0), utilizándolo dentro de Update (porque no sé si la función OnMouseDown() funciona de manera continua o sólo con la primera pulsación).Para lo segundo, tendrás que tirar de variables de condición.

Cita de: hyruleoflink date=1442512847" data-ipsquote-contentid="24567" data-ipsquote-contentcommentid="111348" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_TopicA ver si lo he entendido... ¿quieres qué mientras esté presionado se mueva? ¿o qué una vez presionado se mueva automáticamente aunque sueltes el botón?Para lo primero, creo que la solución es el método Input.GetMouseButtonDown(0), utilizándolo dentro de Update (porque no sé si la función OnMouseDown() funciona de manera continua o sólo con la primera pulsación).Para lo segundo, tendrás que tirar de variables de condición.
Quiero que cuando este el boton presionado ande y cuando lo suelte se pare

Entonces con Input.GetMouseButtonDown(0) debería funcionarte, al menos siempre que no sea multi-touch. En ese caso... tendrás que usar la estructura Touch. Esta no la tengo muy trabajada, así que te dejo la documentación oficial: http://docs.unity3d.com/ScriptReference/Touch.html


Vale, te había entendido mal :/ como te lo ha dicho el compañero se puede hacer.

Septiembre 21, 2015, 05:29:43 AM #7 Ultima modificación: Septiembre 21, 2015, 05:31:08 AM por MatiasMartin
Hola. Te dejo mi código y mi método. Puede que no sea el mas adecuado pero no conseguí hacerlo andar de otra forma. Lo hago con GUITexture y son multi-touch pero en principio deberías saber que Unity 5 ya no da la opción de agregar directamente un GUITexture, así que vas a tener que agregar un GameObjectEmpty y a este un componente GUITexture por cada boton que quieras. 

A ese GameObjectEmpty, en su correspondiente GUITexture, le vas a agregar la textura UI o Sprite que desees como boton, siempre cambiando la propiedad de la imagen de "texture" a 2D UI o algo así, no recuerdo acá. 

De esta forma ya tenemos los botones en pantalla (Los vas a tener que ubicar, si no los ves los vas ubicando con el Transform).

Ahora el código:
 using UnityEngine;
using System.Collections;public class Botonera : MonoBehaviour {    public GUITexture Avanzar;
    public GUITexture Retroceder;
    public GUITexture Derecha;
    public GUITexture Izquierda;
    public GUITexture Saltar;
    public GUITexture Prenderse;
    
    void Update()
    {
        if(Input.touchCount >= 0)
        {
            for (var i = 0; i < Input.touchCount; ++i){
                Touch G = Input.GetTouch(i);
                
                if (G.phase == TouchPhase.Began) {
                    if(Avanzar.HitTest(Input.GetTouch(i).position)){
                        MovCube.avanzar = true;
                        Debug.Log ("Estas avanzando");
                    }
                    if(Retroceder.HitTest(Input.GetTouch(i).position)){
                        MovCube.retroceder = true;
                        Debug.Log ("Estas retrocediendo");
                    }
                    if(Derecha.HitTest(Input.GetTouch(i).position)){
                        MovCube.derecha = true;
                        Debug.Log ("Girando a la derecha");
                    }
                    if(Izquierda.HitTest(Input.GetTouch(i).position)){
                        MovCube.izquierda = true;
                        Debug.Log ("Girando a la izquierda");
                    }
                    if(Saltar.HitTest(Input.GetTouch(i).position)){
                        SaltoCube.saltando = true;
                        Debug.Log ("Estas Saltando");                    }if(Prenderse.HitTest(Input.GetTouch(i).position)){
                        Pegarse.prenderse = true;
                        Debug.Log ("Estas prendido");
                    }
                }
                if (G.phase == TouchPhase.Ended) {
                    MovCube.derecha = MovCube.izquierda = MovCube.avanzar = MovCube.retroceder = SaltoCube.saltando = Pegarse.prenderse = false;
                }
            }
        }
    }    
}


Ese código va en un script llamado botonera, que lo que va a hacer es modificar las variables, estáticas de los demás scripts donde estén los movimientos en si. 

Por ejemplo, este es el de moverse:
 using UnityEngine;
using System.Collections;public class MovCube : MonoBehaviour {    public float speed = 10;
    public float rotationSpeed = 3;
    public static bool derecha = false;
    public static bool izquierda = false;
    public static bool avanzar = false;
    public static bool retroceder = false;
    // Use this for initialization
    void Start () {    }    void Update () {
        if (Input.GetKey (KeyCode.W)|| avanzar == true) {
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
        if (Input.GetKey (KeyCode.S)|| retroceder == true) {
            transform.Translate(Vector3.forward * -speed * Time.deltaTime);
        }
        if (Input.GetKey (KeyCode.A)|| izquierda == true) {
            transform.Rotate(0,-rotationSpeed*Time.deltaTime,0);
        }
        if (Input.GetKey (KeyCode.D)|| derecha == true) {
            transform.Rotate(0,rotationSpeed*Time.deltaTime,0);
        }
    }
}


Como se puede ver, en el primer script llama a una variable bool estática de el segundo script y la modifica: 

  MovCube.avanzar = true;

En el script MovCube, se avanza de dos formas posibles, o apretando la W o una vez que se preciona el botón avanzar(GUITexture).


Se me hace que no se entendió nada, pero es como yo lo hago. :S Los errores ortográficos me dio pachorra corregirlos. 

Gracias
Enviado desde mi Nexus 5 mediante Tapatalk

Etiquetas: