- Home /
Question by
DubstepDawg · May 05, 2015 at 12:44 PM ·
movement script
Getting Model to Rotate during movement.
hello all!
Im currently working a small 3d Platformer and i'm having the issue of having my model only move in 4 directions. up down left and right. i cant seem to get the model to rotate based on the inputs i place in on my controller.
Here is the basic code for movement i wrote.
using UnityEngine;
using System.Collections;
public class UnityChan : MonoBehaviour
{
private Vector3 movementVector;
private CharacterController characterController;
private float movementSpeed = 8;
private float jumpPower = 15;
private float gravity = 40;
void Start ()
{
characterController = GetComponent<CharacterController> ();
}
void Update()
{
movementVector.x = Input.GetAxis("LeftJoystickX") * movementSpeed;
movementVector.z = Input.GetAxis ("LeftJoystickY") * movementSpeed;
if (characterController.isGrounded)
{
movementVector.y = 0;
if(Input.GetButtonDown("A"))
{
movementVector.y = jumpPower;
}
}
movementVector.y -= gravity * Time.deltaTime;
characterController.Move (movementVector * Time.deltaTime);
}
}
any extra help would be highly appreciatged.
Comment
Answer by NathanHold · May 05, 2015 at 02:05 PM
This is some basic vector and quaternion maths.
Basically you want to use your movementVector to get the direction you are moving and face that way. Here is a step by step guide:
using UnityEngine;
public class UnityChan : MonoBehaviour
{
private Vector3 movementVector;
private CharacterController characterController;
private float movementSpeed = 8;
private float jumpPower = 15;
private float gravity = 40;
public float lookSpeed = 100.0f;
void Start ()
{
characterController = GetComponent<CharacterController> ();
}
void FaceInput ()
{
// First we transform the movement vector, the drawline debug shows what we are
// doing below.
Vector3 transformedMovementVector = new Vector3 (movementVector.x, 0, movementVector.z) + transform.position;
// Note: This line is just making sure that we don't look up or down, set this to whatever value is straight
// if this doesn't work.
transformedMovementVector.y = transform.position.y;
Debug.DrawLine (this.transform.position, transformedMovementVector, Color.red);
// Get the direction to the transformed vector.
Vector3 relativePosition = transformedMovementVector - transform.position;
// Make sure we actually need to turn (Otherwise we'll auto correct to facing global fowards.
if(relativePosition.magnitude > 0)
{
// Get the quaternion value of our rotation
Quaternion rotation = Quaternion.LookRotation (relativePosition);
// Set the rotation
// transform.rotation = rotation;
// Use the above if you don't want to have a turn/look speed.
transform.rotation = Quaternion.RotateTowards (transform.rotation, rotation, lookSpeed * Time.deltaTime);
}
}
void Update()
{
movementVector.x = Input.GetAxis("Horizontal") * movementSpeed;
movementVector.z = Input.GetAxis ("Vertical") * movementSpeed;
if (characterController.isGrounded)
{
movementVector.y = 0;
if(Input.GetButtonDown("Jump"))
{
movementVector.y = jumpPower;
}
}
movementVector.y -= gravity * Time.deltaTime;
characterController.Move (movementVector * Time.deltaTime);
FaceInput ();
}
}
I recommend getting familiar with Vector and Quaternion maths. See this link for some awesome explanations (It's in 2D but the concepts work through 3D).