# Constrain local X movement

Howdy, I’m attempting to make a little skate game.
And all I want to do is make it so that when the player has jumped, they continue along the same vector, but can rotate around local Y ( e.g to do a 360 ollie or whatever ).
Here’s what I have so far:

``````using UnityEngine;

public class PlayerController : MonoBehaviour
{
Rigidbody playerRigidbody;

float acceleration = 5, deceleration = 2;
float currentSpeed, minSpeed = 0, maxSpeed = 20;
float turn, turnSpeed = 2;
float jumpForce, jumpForceModifier = 4, minJumpForce = 2, maxJumpForce = 5;

Vector3 preJumpVector;

void Awake()
{
playerRigidbody = GetComponent<Rigidbody>();
}

void Start()
{
jumpForce = minJumpForce;
}

void Update()
{
Impetus();
Turn();
Jump();
}

bool OnGround()
{
return (Physics.Raycast(transform.position, Vector3.down, .1f));
}

void Impetus()
{
if (OnGround())
{
if (Input.GetKeyDown(KeyCode.W))
currentSpeed += acceleration;
else if (Input.GetKeyDown(KeyCode.S))
currentSpeed -= acceleration;

transform.Translate(Vector3.forward * Time.deltaTime * currentSpeed);
}

else
{
transform.Translate(preJumpVector * Time.deltaTime * currentSpeed);     //here's where I think it needs to change
}

currentSpeed -= deceleration * Time.deltaTime;
currentSpeed = Mathf.Clamp(currentSpeed, minSpeed, maxSpeed);
}

void Turn()
{
turn = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up * turn * turnSpeed);
}

void Jump()
{
if (Input.GetButton("Jump") && jumpForce <= maxJumpForce)
{
jumpForce += jumpForceModifier * Time.deltaTime;
}

if (Input.GetButtonUp("Jump") && OnGround())
{
jumpForce = minJumpForce;
preJumpVector = Vector3.forward;   //think this should give the pre jump vector, then I want to constrain movement to this whilst not OnGround(), but still be able to rotate
}
}
}
``````

I’ve been helped with this question elsewhere (by Sebastian Lague. Highly recommend his tutorials : Sebastian Lague - YouTube)

line 50 just needed to be
transform.Translate(preJumpVector * Time.deltaTime * currentSpeed, Space.World);

and 74 should’ve been
preJumpVector = transform.forward; //transform.forward, rather than Vector3.forward

so easy… (kinda figured it’d be something real simple)

All you have to do is use the constaints of the playerRigidBody.

Just put this on your Jump function, when a jump is starting:

playerRigidbody.constraints = RigidbodyConstraints.FreezePositionX || RigidbodyConstraints.FreezePositionZ || RigidbodyConstraints.FreezePositionZ || RigidbodyConstraints.FreezeRotationX;

And put this when a jump is over (OnGround, Impetus method)

playerRigidbody.constraints = RigidbodyConstraints.None;