Noticias

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

[TUTORIAL] Movimiento de un indicador

Iniciado por Jose134, Octubre 21, 2015, 05:17:37 PM

Tema anterior - Siguiente tema
Hola a todos. Hace tiempecillo que no publico nada asi que os traigo un pequeño tutorial de como hacer un script para mover un indicador hacia arriba y abajoFUNCIONAMIENTOEl script es basicamente consiste en asignar el coseno de una varible a la que le sumamos Time.deltaTime a la posicion en le eje Y de nuestra flecha. Este valor va a estar multiplicado por unas variables para controlar la posicion maxima (el coseno devuelve valores entre 1 y -1 asi que con una variable lo multiplicamos para que por ejemplo esos valores sean 0.5 y -0.5) y la velocidad (funciones seno y coseno representadas graficamente)public float posMultiplier;
public float speedMultiplier;

private float angle;
private float startY;Ahora en el metodo Awake vamos a asignar la variable startY
void Awake () {
    startY = transform.position.y;
}
 Ahora ya podemos empezar con el movimiento de la flecha (a partir de aqui todo sera dentro del metodo Update). Primero vamos a asignar la variable angle
void Update () {
    angle += Time.deltaTime * speedMultiplier;
    if (angle >= 360) {
        angle = 0;
    }
}
Ya tenemos los angulos que asignaremos a la funcion de coseno
void Update () {
    float cos = Mathf.Cos(angle);
}
Ahora crearemos y asignaremos la variable que usaremos como posicion Y final. Esta variable la haremos de la siguiente forma (startY + cos) * posMultiplier la suma de startY y cos es para que podamos colocar la flecha en otro lugar y al asignarle el coseno no se vaya a la posicion 0 en el eje Y sino que se quede donde esta y ahi aplique el coseno. Y esta suma la multiplicamos por posMultiplier para modificar las posiciones maxima y minima
void Update () {
    float yPos = (startY + cos) * posMultiplier;
    transform.position = new Vector3(transform.position.x, yPos, transform.position.z);
}
Y con esto ya tenemos el script completo y listo para probar, yo en mi escena de prueba he usado estos valoresposMultiplier = 0.2;speedMultiplier = 6; SCRIPT COMPLETO
using UnityEngine;
using System.Collections;

public class MarkerMovement : MonoBehaviour {

    public float posMultiplier;
    public float speedMultiplier;

    private float angle;
    private float startY;
   
    void Awake ()
    {
        startY = transform.position.y;
    }

    void Update ()
    {
        angle += Time.deltaTime * speedMultiplier;
        if (angle >= 360)
        {
            angle = 0;
        }

        float cos = Mathf.Cos(angle);
        float yPos = (startY + cos) * posMultiplier;
        transform.position = new Vector3(transform.position.x, yPos, transform.position.z);
    }
}
 Espero que os sea util, suerte con vuestros proyectos


Cita de: iRobb date=1445440826" data-ipsquote="" data-cite="iRobb" class="ipsQuoteMuy bien. Es genial!
Muchas gracias. La verdad es que lo hice porque estaba buscando no me acuerdo que en google y me encontre con la explicacion del coseno y de ejemplo ponia un indicador como este y me puse a replicarlo en unity para aprender... Asi ya me lo se para cuando me lo expliquen en matematicas xD

Aqui teneis una pequeña mejora que le he añadido al script. Ahora se puede modificar el eje al que se le aplica el movimiento y he añadido una variable para añadir offset al comenzar, es decir, que espera X tiempo y empiece a moverse. No explicare como funcionan los cambios hechos a no ser que alguien me lo pida 
using UnityEngine;
using System.Collections;

public class ObjectMovement : MonoBehaviour {

public enum Axis {
   x,
   y,
   z
}
public Axis axis;

public float posMultiplier;
public float speedMultiplier;
public float startTimeOffset;

private float angle;
private float startPos;
private float startTime;

void Awake () {

   if (axis == Axis.x) { startPos = transform.position.x; }
   if (axis == Axis.y) { startPos = transform.position.y; }
   if (axis == Axis.z) { startPos = transform.position.z; }

}

void Update () {

   if (startTime >= startTimeOffset)
   {

   angle += Time.deltaTime * speedMultiplier;
   if (angle >= 360) {
      angle = 0;
   }
   
   float cos = Mathf.Cos(angle);
   float pos = (startPos + cos) * posMultiplier;

   if (axis == Axis.x) { transform.position = new Vector3(pos, transform.position.y, transform.position.z); }
   if (axis == Axis.y) { transform.position = new Vector3(transform.position.x, pos, transform.position.z); }
   if (axis == Axis.z) { transform.position = new Vector3(transform.position.x, transform.position.y, pos); }


   }
   else
   {
      startTime += Time.deltaTime;
   }
}
}
 

Etiquetas: