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.