- Home /
Rigidbody Controller move forward in the direction of the camera
I'm trying to make my character move in such way that when I move my joystick in the upwards direction, the character should move forward in the direction the camera is facing, and not in character's own forward direction. I have created this script which is basically everything that you can see in this page: https://wiki.unity3d.com/index.php/RigidbodyFPSWalker with the small diference that i'm obtaining horizontal axis and vertical axis from joystick. However, as i mentioned, the player is moving in its own forward vector and not of camera's, how can i make this change? Thank you in advance
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(CapsuleCollider))]
public class PlayerControllerRigid : MonoBehaviour
{
public float speed = 10.0f;
public float gravity = 10.0f;
public float maxVelocityChange = 10.0f;
public bool canJump = true;
public float jumpHeight = 2.0f;
private bool grounded = false;
private new Rigidbody rigidbody;
public Joystick joystick;
void Awake()
{
rigidbody = GetComponent<Rigidbody>();
rigidbody.freezeRotation = true;
rigidbody.useGravity = false;
}
void FixedUpdate()
{
if (grounded)
{
float horizontal = joystick.Horizontal;
float vertical = joystick.Vertical;
// Calculate how fast we should be moving
Vector3 targetVelocity = new Vector3(horizontal, 0, vertical);
targetVelocity = transform.TransformDirection(targetVelocity);
targetVelocity *= speed;
// Apply a force that attempts to reach our target velocity
Vector3 velocity = rigidbody.velocity;
Vector3 velocityChange = (targetVelocity - velocity);
velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
velocityChange.y = 0;
rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
// Jump
if (canJump && Input.GetButton("Jump"))
{
rigidbody.velocity = new Vector3(velocity.x, CalculateJumpVerticalSpeed(), velocity.z);
}
}
// We apply gravity manually for more tuning control
rigidbody.AddForce(new Vector3(0, -gravity * rigidbody.mass, 0));
grounded = false;
}
void OnCollisionStay()
{
grounded = true;
}
float CalculateJumpVerticalSpeed()
{
// From the jump height and gravity we deduce the upwards speed
// for the character to reach at the apex.
return Mathf.Sqrt(2 * jumpHeight * gravity);
}
}
Your answer
Follow this Question
Related Questions
Camera relative rigidbody third person player movement 1 Answer
How to rotate camera diagonally over players shoulder while still facing towards players direction 0 Answers
Rigidbody movement in direction of camera? 1 Answer
How do I make my cameras parent follow my player? 0 Answers
Camera is shaking. Unity 3D 0 Answers