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*;*
  •  	}*
    
  •  	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*;_
_
}_
_
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())*
* GetComponent().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.

Mixing CharacterController and Rigidbody can lead to some deleterious bugs. It’d probably be easier to just keep track of y-velocity manually, subtracting gravityTime.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, yVelocityTime.deltaTime, 0) as well as verticalMovement and horizontalMovement in the Move() call (this would replace the second Move call).