- Home /
Rigidbody Jumping for Character Controller
I just finished my character controller except for the fact it can't jump. When I have tried to make it jump with CharacterController.move, it teleports upward then slowly falls down. I would like to make my game have realistic physics all around, so I thought I should make a gameObject with a rigidbody that does all the gravity based physics. My hierarchy has an empty Player GameObject with a PlayerModel GameObject(Controlls movement and has controller on it), PlayerCamera, and a PlayerRigidbody that is an empty game object with a rigidbody attached to it. I would like to know the best way to move my rigidbody with the player and then let my player be affected by the way the rigidbody moves on the y-axis. Here is my code PlayerController:
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {
private CharacterController player;
public float forwardMult = 1;
public float backwardMult = 1;
public float sidewaysMult = 1;
public float gravity = -2;
public float jumpHeight = 10;
SmoothMouseLook smoothMouseLook;
float jump = 0;
Rigidbody rb;
Camera firstCam;
GameObject parent;
void Start () {
parent = transform.parent.gameObject;
player = gameObject.GetComponent<CharacterController> ();
rb = parent.GetComponentInChildren<Rigidbody> ();
firstCam = parent.GetComponentInChildren<Camera> ();
}
void FixedUpdate () {
float moveVertical = Input.GetAxis ("Vertical");
float moveHorizontal = Input.GetAxis ("Horizontal");
//Applies forward/backward multipliers
if (moveVertical > 0) {
moveVertical *= forwardMult;
}else if (moveVertical < 0){
moveVertical *= backwardMult;
}
//Moves the Camera & Rigidbody
firstCam.transform.position = new Vector3(transform.position.x, transform.position.y + 1, transform.position.z);
//Adds Camera Rotation
Vector3 tempRot = new Vector3 (0.0f, firstCam.transform.eulerAngles.y, 0.0f);
transform.eulerAngles = tempRot;
//Defines player movement
Vector3 verticalMovement = transform.forward * moveVertical * Time.deltaTime;
Vector3 horizontalMovement = transform.right * moveHorizontal * Time.deltaTime * sidewaysMult;
//Jumps
//Moves Player
player.Move (verticalMovement + horizontalMovement);
player.Move (new Vector3(0.0f, gravity, 0.0f));
}
}
SmoothMouseLook:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[AddComponentMenu("Camera-Control/Smooth Mouse Look")]
public class SmoothMouseLook : MonoBehaviour {
public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float minimumX = -360F;
public float maximumX = 360F;
public float minimumY = -60F;
public float maximumY = 60F;
float rotationX = 0F;
float rotationY = 0F;
private List<float> rotArrayX = new List<float>();
float rotAverageX = 0F;
private List<float> rotArrayY = new List<float>();
float rotAverageY = 0F;
public float frameCounter = 20;
Quaternion originalRotation;
void Update ()
{
if (axes == RotationAxes.MouseXAndY)
{
rotAverageY = 0f;
rotAverageX = 0f;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationX += Input.GetAxis("Mouse X") * sensitivityX;
rotArrayY.Add(rotationY);
rotArrayX.Add(rotationX);
if (rotArrayY.Count >= frameCounter) {
rotArrayY.RemoveAt(0);
}
if (rotArrayX.Count >= frameCounter) {
rotArrayX.RemoveAt(0);
}
for(int j = 0; j < rotArrayY.Count; j++) {
rotAverageY += rotArrayY[j];
}
for(int i = 0; i < rotArrayX.Count; i++) {
rotAverageX += rotArrayX[i];
}
rotAverageY /= rotArrayY.Count;
rotAverageX /= rotArrayX.Count;
rotAverageY = ClampAngle (rotAverageY, minimumY, maximumY);
rotAverageX = ClampAngle (rotAverageX, minimumX, maximumX);
Quaternion yQuaternion = Quaternion.AngleAxis (rotAverageY, Vector3.left);
Quaternion xQuaternion = Quaternion.AngleAxis (rotAverageX, Vector3.up);
transform.localRotation = originalRotation * xQuaternion * yQuaternion;
}
else if (axes == RotationAxes.MouseX)
{
rotAverageX = 0f;
rotationX += Input.GetAxis("Mouse X") * sensitivityX;
rotArrayX.Add(rotationX);
if (rotArrayX.Count >= frameCounter) {
rotArrayX.RemoveAt(0);
}
for(int i = 0; i < rotArrayX.Count; i++) {
rotAverageX += rotArrayX[i];
}
rotAverageX /= rotArrayX.Count;
rotAverageX = ClampAngle (rotAverageX, minimumX, maximumX);
Quaternion xQuaternion = Quaternion.AngleAxis (rotAverageX, Vector3.up);
transform.localRotation = originalRotation * xQuaternion;
}
else
{
rotAverageY = 0f;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotArrayY.Add(rotationY);
if (rotArrayY.Count >= frameCounter) {
rotArrayY.RemoveAt(0);
}
for(int j = 0; j < rotArrayY.Count; j++) {
rotAverageY += rotArrayY[j];
}
rotAverageY /= rotArrayY.Count;
rotAverageY = ClampAngle (rotAverageY, minimumY, maximumY);
Quaternion yQuaternion = Quaternion.AngleAxis (rotAverageY, Vector3.left);
transform.localRotation = originalRotation * yQuaternion;
}
}
void Start ()
{
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true;
originalRotation = transform.localRotation;
}
public static float ClampAngle (float angle, float min, float max)
{
angle = angle % 360;
if ((angle >= -360F) && (angle <= 360F)) {
if (angle < -360F) {
angle += 360F;
}
if (angle > 360F) {
angle -= 360F;
}
}
return Mathf.Clamp (angle, min, max);
}
}
Any help is appreciated.
Answer by zach-r-d · Aug 04, 2015 at 11:58 AM
Mixing CharacterController and Rigidbody can lead to some deleterious bugs. It'd probably be easier to just keep track of y-velocity manually, subtracting gravity*Time.deltaTime from it every frame, adding a fairly large number when jumping, zeroing it out whenever the return value of .Move() contains CollisionFlags.Below, and finally adding (0, yVelocity*Time.deltaTime, 0) as well as verticalMovement and horizontalMovement in the Move() call (this would replace the second Move call).
Your answer
Follow this Question
Related Questions
Two near-identical scripts cause a cat to jump in different ways - why? 2 Answers
How to handle movement in a multiplayer FPS? 0 Answers
GetButtonDown is unresponsive 0 Answers
moving with rigidbody without acceleration 0 Answers
Making character dash forward 0 Answers