Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 11 Next capture
2021 2022 2023
1 capture
11 Jun 22 - 11 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by $$anonymous$$ · Aug 03, 2015 at 05:29 PM · movementrigidbodycharactercontrollerjumpyaxis

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.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
1
Best Answer

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).

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

2 People are following this question.

avatar image avatar image

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


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges