playMaker

Author Topic: [Solved] Unity 5, Standard asset, RigidBodyFPSController, Mid air Jump?  (Read 3263 times)

createasaurus

  • Full Member
  • ***
  • Posts: 146
Hi!
I would like to make the Unity 5, Standard asset, RigidBodyFPSController, do infinate Mid air Jumps.  Imagine you are flapping your wings, so you can just keep jumping without needing to touch the ground.

Is there a PlayMaker solution to this??  If not, would someone be willing to advise me?

I have been trying to study the script: I've been cuting and pasting things, changing falses to trues, looking for is_grounded statements,   All randomly throwing darts... and I just keep breaking the script.

Thank you so much for any help,
Createasaurus

Here is the code I'm trying to modify:
Code: [Select]
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
 
namespace UnityStandardAssets.Characters.FirstPerson
{
    [RequireComponent(typeof (Rigidbody))]
    [RequireComponent(typeof (CapsuleCollider))]
    public class RigidbodyFirstPersonController : MonoBehaviour
    {
        [Serializable]
        public class MovementSettings
        {
            public float ForwardSpeed = 8.0f;   // Speed when walking forward
            public float BackwardSpeed = 4.0f;  // Speed when walking backwards
            public float StrafeSpeed = 4.0f;    // Speed when walking sideways
            public float RunMultiplier = 2.0f;   // Speed when sprinting
           public KeyCode RunKey = KeyCode.LeftShift;
            public float JumpForce = 30f;
            public AnimationCurve SlopeCurveModifier = new AnimationCurve(new Keyframe(-90.0f, 1.0f), new Keyframe(0.0f, 1.0f), new Keyframe(90.0f, 0.0f));
            [HideInInspector] public float CurrentTargetSpeed = 8f;
 
#if !MOBILE_INPUT
            private bool m_Running;
#endif
 
            public void UpdateDesiredTargetSpeed(Vector2 input)
            {
               if (input == Vector2.zero) return;
                if (input.x > 0 || input.x < 0)
                {
                    //strafe
                    CurrentTargetSpeed = StrafeSpeed;
                }
                if (input.y < 0)
                {
                    //backwards
                    CurrentTargetSpeed = BackwardSpeed;
                }
                if (input.y > 0)
                {
                    //forwards
                    //handled last as if strafing and moving forward at the same time forwards speed should take precedence
                    CurrentTargetSpeed = ForwardSpeed;
                }
#if !MOBILE_INPUT
               if (Input.GetKey(RunKey))
               {
                   CurrentTargetSpeed *= RunMultiplier;
                   m_Running = true;
               }
               else
               {
                   m_Running = false;
               }
#endif
            }
 
#if !MOBILE_INPUT
            public bool Running
            {
                get { return m_Running; }
            }
#endif
        }
 
 
        [Serializable]
        public class AdvancedSettings
        {
            public float groundCheckDistance = 0.01f; // distance for checking if the controller is grounded ( 0.01f seems to work best for this )
            public float stickToGroundHelperDistance = 0.5f; // stops the character
            public float slowDownRate = 20f; // rate at which the controller comes to a stop when there is no input
            public bool airControl; // can the user control the direction that is being moved in the air
        }
 
 
        public Camera cam;
        public MovementSettings movementSettings = new MovementSettings();
        public MouseLook mouseLook = new MouseLook();
        public AdvancedSettings advancedSettings = new AdvancedSettings();
 
 
        private Rigidbody m_RigidBody;
        private CapsuleCollider m_Capsule;
        private float m_YRotation;
        private Vector3 m_GroundContactNormal;
        private bool m_Jump, m_PreviouslyGrounded, m_Jumping, m_IsGrounded;
 
 
        public Vector3 Velocity
        {
            get { return m_RigidBody.velocity; }
        }
 
        public bool Grounded
        {
            get { return m_IsGrounded; }
        }
 
        public bool Jumping
        {
            get { return m_Jumping; }
        }
 
        public bool Running
        {
            get
            {
#if !MOBILE_INPUT
                return movementSettings.Running;
#else
               return false;
#endif
            }
        }
 
 
        private void Start()
        {
            m_RigidBody = GetComponent<Rigidbody>();
            m_Capsule = GetComponent<CapsuleCollider>();
            mouseLook.Init (transform, cam.transform);
        }
 
 
        private void Update()
        {
            RotateView();
 
            if (CrossPlatformInputManager.GetButtonDown("Jump") && !m_Jump)
            {
                m_Jump = true;
            }
        }
 
 
        private void FixedUpdate()
        {
            GroundCheck();
            Vector2 input = GetInput();
 
            if ((Mathf.Abs(input.x) > float.Epsilon || Mathf.Abs(input.y) > float.Epsilon) && (advancedSettings.airControl || m_IsGrounded))
            {
                // always move along the camera forward as it is the direction that it being aimed at
                Vector3 desiredMove = cam.transform.forward*input.y + cam.transform.right*input.x;
                desiredMove = Vector3.ProjectOnPlane(desiredMove, m_GroundContactNormal).normalized;
 
                desiredMove.x = desiredMove.x*movementSettings.CurrentTargetSpeed;
                desiredMove.z = desiredMove.z*movementSettings.CurrentTargetSpeed;
                desiredMove.y = desiredMove.y*movementSettings.CurrentTargetSpeed;
                if (m_RigidBody.velocity.sqrMagnitude <
                    (movementSettings.CurrentTargetSpeed*movementSettings.CurrentTargetSpeed))
                {
                    m_RigidBody.AddForce(desiredMove*SlopeMultiplier(), ForceMode.Impulse);
                }
            }
 
            if (m_IsGrounded)
            {
                m_RigidBody.drag = 5f;
 
                if (m_Jump)
                {
                    m_RigidBody.drag = 0f;
                    m_RigidBody.velocity = new Vector3(m_RigidBody.velocity.x, 0f, m_RigidBody.velocity.z);
                    m_RigidBody.AddForce(new Vector3(0f, movementSettings.JumpForce, 0f), ForceMode.Impulse);
                    m_Jumping = true;
                }
 
                if (!m_Jumping && Mathf.Abs(input.x) < float.Epsilon && Mathf.Abs(input.y) < float.Epsilon && m_RigidBody.velocity.magnitude < 1f)
                {
                    m_RigidBody.Sleep();
                }
            }
            else
            {
                m_RigidBody.drag = 0f;
                if (m_PreviouslyGrounded && !m_Jumping)
                {
                    StickToGroundHelper();
                }
            }
            m_Jump = false;
        }
 
« Last Edit: August 14, 2015, 03:49:15 PM by createasaurus »

createasaurus

  • Full Member
  • ***
  • Posts: 146
Re: [Solved] Unity 5, Standard asset, RigidBodyFPSController, Mid air Jump?
« Reply #1 on: August 14, 2015, 03:51:13 PM »
Cool... so I took this up in the Unity forums.  Someone there helped me modify the code.