Jump to content
Null

[Ayuda] Problema con rotación al inicio del juego

Recommended Posts

Holas.

Tengo un problema :(
Supongamos que en la ventana Scene ajusto la rotación del player, de modo que cuando se inicie el juego, él comience mirando hacia 'x' dirección...
Bueno, pues resulta que al iniciar el juego, el jugador ignora la rotación que yo le asigné y en su lugar se orienta hacia el eje Z... siempre.

Mirad esta pequeña secuencia de ejemplo.

Este es el script del jugador:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour {
    private static CharacterController _cc;
    private static float _currentSpeed = 2f;
    private static bool _canMove = true;

    public static CharacterController CC { get { return _cc; } set { _cc = value; } }

    private void Awake() {
        _cc = GetComponent<CharacterController>();
    }

    private void Update() {
        float hAxis = Input.GetAxis("Horizontal") * _currentSpeed;
        float vAxis = Input.GetAxis("Vertical") * _currentSpeed;
        Vector3 movement = new Vector3(hAxis, PlayerJump.Gravity, vAxis);

        movement = transform.rotation * movement;

        if (_canMove)
            _cc.Move(movement * Time.deltaTime);
    }
}

A ver si alguien me echa el guante.
Muchas gracias, de verdad (:

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites

Hola Null lo vi por arriba y pense que asignabas algun transform.rotation pero NO, solo tenes Move del characterController, no entiendo porque hace eso, revisaste si es el Unico script que tenes, que pudiera estar creando el problema? probaste quitando todo el scirpt, desactivandolo, y ver si ocurre lo mismo? podra ser algun scirpt de la camara?

saludos

Share this post


Link to post
Share on other sites

1º Para realizar un movimiento con "Motion" tienes que tener un AXIS en modo RAW.

2º Debes normalizar los axis.

3º Transformar la dirección del jugador en el sentido adelante.

4º Multiplicar el de dirección por la velocidad.

5º Utilizar CharacterController.Move con nuestro vector de movimiento.

6º Aplicar simulación de gravedad en el eje Y.

 

private float m_speed = 10;
private float m_gravity = 20;
private Vector3 m_move = Vector3.zero;
private Vector3 m_axis = Vector3.zero;

private void Update()
{
	//1
	m_axis.x = Input.GetAxisRaw("Horizontal");
	m_axis.z = Input.GetAxisRaw("Vertical");
	//2
	m_axis.Normalize();
	//3
	m_move = transform.TransformDirection(m_axis);
	//4
	m_move *= m_speed;
	//5
	m_controller.Move(m_move * Time.deltaTime);
	//6
	m_move.y -= m_gravity * Time.deltaTime;
}

Proba de esta manera, aunque esto no afecta la rotación en ningún aspecto.

Share this post


Link to post
Share on other sites

Hola @lightbug! Desactivé todos los scripts y probé uno por uno.  Sí, el causante parece ser el script de la cámara, el cual es este:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour {
    private static bool _canMoveCamera = true;

    private float _xSensitivity = 1.5f;
    private float _ySensitivity = 1.5f;

    private float _xRot;
    private float _yRot;

    private float _xRotSpeed;
    private float _yRotSpeed;

    private float _currentXRot;
    private float _currentYRot;

    private float _smoothTime = .055f;

    public static bool CanMoveCamera { get { return _canMoveCamera; } set { _canMoveCamera = value; } }

    private void Update() {
        if (_canMoveCamera) {
            _xRot -= Input.GetAxis("Mouse Y") * _xSensitivity;
            _yRot += Input.GetAxis("Mouse X") * _ySensitivity;

            _xRot = Mathf.Clamp(_xRot, -70f, 70f);

            _currentXRot = Mathf.SmoothDamp(_currentXRot, _xRot, ref _xRotSpeed, _smoothTime);
            _currentYRot = Mathf.SmoothDamp(_currentYRot, _yRot, ref _yRotSpeed, _smoothTime);

            transform.rotation = Quaternion.Euler(_currentXRot, _currentYRot, 0f);
            transform.parent.rotation = Quaternion.Euler(0f, _currentYRot, 0f);
        } else {
            _currentXRot = transform.eulerAngles.x;
            _currentYRot = transform.eulerAngles.y;
            _xRot = transform.eulerAngles.x;
            _yRot = transform.eulerAngles.y;
        }
    }
}


Hola @francoe1! Muchas gracias por tu respuesta, me va a servir muchísimo!! :b

Share this post


Link to post
Share on other sites
6 hours ago, Null said:

transform.rotation = Quaternion.Euler(_currentXRot, _currentYRot, 0f); transform.parent.rotation = Quaternion.Euler(0f, _currentYRot, 0f);

Ah claro ahi esta el error por el "=" , fijate que siempre te conviene modificar el transform.rotation actual (con un operador "+=" por ejemplo) o usando el transform.Rotate().

Otra cosa, si la camara es hija del cuerpo o player, cuando giras la camara (en eje Y, para izq y der) lo que gira es el padre solamente. cuando giras en eje x lo que gira es la camara solamente.

Saludos

 

Share this post


Link to post
Share on other sites
hace 15 horas, lightbug said:

Ah claro ahi esta el error por el "=" , fijate que siempre te conviene modificar el transform.rotation actual (con un operador "+=" por ejemplo) o usando el transform.Rotate().

Otra cosa, si la camara es hija del cuerpo o player, cuando giras la camara (en eje Y, para izq y der) lo que gira es el padre solamente. cuando giras en eje x lo que gira es la camara solamente.

Saludos

 

Hola!
He probado a modificar el transform.rotation como me propones, pero no consigo solucionarlo :(
Gracias por decirme lo de la cámara, por cierto!
 

Share this post


Link to post
Share on other sites

Hazlo con un "Offset", guarda tu rotacion inicial en una variable, y luego asignas la rotacion + las rotacion inicial.

Share this post


Link to post
Share on other sites

Hola, mira te paso mi scirpt de la camara (en el Player lo tenia en este caso) para tener una idea:

	private float sensitivity;
	private Transform cam;
	float anglePitch;

	void Start () {
		cam = Camera.main.transform;
		anglePitch = 0;
		sensitivity = 2;		
	}
	

	void Update () {	

		anglePitch -= Input.GetAxis ("Mouse Y");

		if (anglePitch > 90)
			anglePitch = 90;

		if (anglePitch < -90)
			anglePitch = -90;

		transform.eulerAngles += new Vector3 (0 ,  Input.GetAxis ("Mouse X"), 0) * sensitivity;
		cam.localEulerAngles = new Vector3 (anglePitch , 0, 0) * sensitivity;
	}
}

---------------------------------------------------------------------------------------------------------------------------------------------------

En la camara lo que hago es imponer que localmente tenga un angulo X (anglePitch) y el resto cero (para un FPS).

cam.localEulerAngles = new Vector3 (anglePitch , 0, 0) * sensitivity;

---------------------------------------------------------------------------------------------------------------------------------------------------

En el player lo que hago es decirle que su pitch y roll sea cero (logico para un fps o 3ra persona) y le agrego un angulo dependiendo del movimiento del mouse. La razon por la que no llevo cuenta del valor es que no interesa tanto como el del pitch de la camara (-90 a 90 grados)

transform.eulerAngles += new Vector3 (0 ,  Input.GetAxis ("Mouse X"), 0) * sensitivity;

 

Con esto solo controlas a la camara y al player (sin desplazamientos) quiza tendria que haber llamado al script como "Player_Mouse" y no "Player_Camera" jajaj

Saludos!

Share this post


Link to post
Share on other sites

Muchas gracias @francoe1!
He conseguido solucionarlo basándome en parte del código que puso @lightbug.
Mi única duda es cómo añadiré el SmoothDamp con eso.
Saludos a ambos! :P

Share this post


Link to post
Share on other sites

Me alegro que funcione! SmoothDamp te referis a desplazamientos suavizados? yo siempre uso rawAxis (actualmente) y el efecto lo logro con un Lerp de Vector3. Va en gustos supongo.

Saludos

PD: tus variables me hacen acordar a cuando le metia guion bajo a todo para diferenciar variables locales o argumentos de variables miembro, propias de la clase jajaja, con el tiempo empece a usar los famosos "m_...." por que los veia en todos lados.

Share this post


Link to post
Share on other sites

Sí, desplazamientos suavizados.
He intentado hacerlo así...

transform.eulerAngles += new Vector3(0f, Mathf.SmoothDamp(transform.eulerAngles.y, PlayerMovement.XRot, ref _xRotSpeed, _smoothTime), 0f) * _sensitivity;
_cam.localEulerAngles = new Vector3(Mathf.SmoothDamp(transform.eulerAngles.x, _yRot, ref _yRotSpeed, _smoothTime), 0f, 0f) * _sensitivity;

... pero acabo de comprobar que es evidente que no funciona. Estoy haciendo una locura?
Sí, acostumbro a meterles _ todo el tiempo jajaja
A ver cuánto tardo en añadir también la "m" :3_grin:

Share this post


Link to post
Share on other sites

El smooth damp nunca lo usé por lo que lei y por el nombre le da un "amortiguamiento", es decir que va al valor pero se estabiliza oscilando, o por lo menos es lo logico, no se si es lo que realmente queres. Por que si lo que queres es llegar al valor (sin pasarte) de forma suave usa Mathf.Lerp(tuvalor, valorFinal, factor)

Si no te funciona es porque en tiempo real estas tomando el GetAxis del mouse, un valor muy pequeño y si encima al valor ese le aplicas el SmoothDamp (con un determinado tiempo) supongo que lo hara practicamente nulo (el Lerp tambien lo haria con un factor bajo), no termina nunca de llegar al valor optimo, para el cuadro que sigue el GetAxis cambia y estas en la misma. Para probar si es asi podes tocarle el SmoothTime, bajalo a  cero (ya se, no tiene gracia) y de ahi proba. Y exageradamente move el mouse todo lo que puedas deberia moverse muuuy poco jajaj.

Te repito nunca use el smoothDamp. Quiza alguien te puede dar mejor informacion.

Saludos

 

Share this post


Link to post
Share on other sites

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