Noticias

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

Rotación máxima.

Iniciado por juanma_teso, Agosto 31, 2015, 09:19:49 PM

Tema anterior - Siguiente tema
Hola compañeros, el problema que tengo es que no se cómo plantear exactamente la rotación de un personaje: estoy intentando que tenga una rotación máxima y que cuando la alcance empiece a rotar el personaje entero. Hasta ahora tengo una rotación parecida a un MouseLook, pero propio, en sí es esto:
void rotar (Vector2 direccion)
   {
        Vector3 dir = new Vector3 (-direccion.y, direccion.x, 0);
        Debug.Log (dir.y);
        Quaternion rotacion;
        if (dir.y < (transform.rotation.eulerAngles.y + 20) || dir.y > (transform.rotation.eulerAngles.y - 20)) {
            rotacion = Quaternion.Euler (dir);
            cabeza.rotation = Quaternion.Lerp (cabeza.rotation, rotacion, 1);
        } else {
            rotacion = Quaternion.Euler (Vector3.up * direccion.x);
            transform.rotation = Quaternion.Lerp (transform.rotation, rotacion, 1);
        }
   }
Hasta ahora funciona bien, aunque hay pequeño bug (pega un salto de repente la rotación) que más adelante intentaré solucionar.Se me había ocurrido poner un máximo y un mínimo (rotación del player + máximo || rotación del player - mínimo) y si el valor está en el rango hacer la rotación de la cámara o del player, pero no me fío porque tendría que hacerlo con los valores de euler que siempre me han dado problemas, ya que las rotaciones en euler negativas no son menos "X" sino un valor inferior a 360   por esto no funciona, porque el vector2 que le paso alcanza unos valores máximos de +-70 A alguien se le ocurre alguna maravillosa alternativa que no se me haya ocurrido?

Este script primero rota la cabeza, y al llegar a un limite, rota el resto del cuerpo hasta mantener el limite establecido: 
using UnityEngine;
using System.Collections;

public class rotar : MonoBehaviour {

public Transform cabeza,
   cuerpo;

public float limiteAngulo = 15f,
   smoothTime = 0.6f;

float x0 = 0f, y0 = 0f,
   y1 = 0f, v = 0f, rotacionInicial;
   


void Start() {

   this.rotacionInicial = this.cuerpo.eulerAngles.y;

}

void Update() {

   this.x0 -= Input.GetAxis("Mouse Y");
   this.y0 += Input.GetAxis("Mouse X");

   if(Mathf.Abs(this.y1 - this.y0) > this.limiteAngulo){

      this.y1 = Mathf.SmoothDamp(this.y1, this.y0, ref this.v, this.smoothTime);

   }

   this.cuerpo.forward = Quaternion.Euler(0f, this.rotacionInicial + this.y1, 0f) * Vector3.forward;
   this.cabeza.forward = Quaternion.Euler(this.x0, this.rotacionInicial + this.y0, 0f) * Vector3.forward;

}

}
 

Muchas gracias @kaito!! No sé si has hecho tu el script pero muchas gracias! Mañana posteo si funciona.

Etiquetas: