Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 WaterMinecraft · Sep 04, 2014 at 10:25 PM · speedchange

How do I change my speed based on certain events?

(CODE BELOW) I've gotten myself into a kind of rut. I got help with some code a while back which allowed me to run and walk and crouch. I then tried to change the speed based a courotine. This.. used to work, I changed some things and now it does not change my speed. I got help with this part too. So, I think the problem is with my speed variable. Everything is being changed through my speed variable I think. While what I added was based on other speed values (walkSpeed, runSpeed, & crouchSpeed). I tried to make speed equal these variables... but it doesn't seem to have worked. Thank you for anybody that can help! (:

Also, if anybody knows how to put these into spoilers, that would be great too!

 using UnityEngine;
 using System.Collections;
 
 [RequireComponent (typeof (CharacterController))]
 public class FPSwalkerEnhanced: MonoBehaviour {
 
     public float walkSpeed = 6.0f;
     public float walk;
     public float runSpeed = 11.0f;
     public float run;
     public float crouchSpeed = 2.0f;
     public float crouch;
     
     public float slowWalkSpeed = 1.0f;
     public float slowRunSpeed = 1.5f;
     public float slowCrouchSpeed = 0.5f;
 
     public bool walking = true;
     public bool running = false;
     public bool crouching = false;
 
     
     public float runTimer = 15; // how long you can run without getting tired
     public float endTime = 0;
 
     // If true, diagonal speed (when strafing + moving forward or back) can't exceed normal move speed; otherwise it's about 1.4 times faster
     public bool limitDiagonalSpeed = true;
 
     // If checked, the run key toggles between running and walking. Otherwise player runs if the key is held down and walks otherwise
     // There must be a button set up in the Input Manager called "Run"
     public bool toggleRun = false;
 
     public float jumpSpeed = 8.0f;
     public float gravity = 20.0f;
 
     // Units that player can fall before a falling damage function is run. To disable, type "infinity" in the inspector
     public float fallingDamageThreshold = 10.0f;
 
     // If the player ends up on a slope which is at least the Slope Limit as set on the character controller, then he will slide down
     public bool slideWhenOverSlopeLimit = false;
 
     // If checked and the player is on an object tagged "Slide", he will slide down it regardless of the slope limit
     public bool slideOnTaggedObjects = false;
 
     public float slideSpeed = 12.0f;
 
     // If checked, then the player can change direction while in the air
     public bool airControl = false;
 
     // Small amounts of this results in bumping when walking down slopes, but large amounts results in falling too fast
     public float antiBumpFactor = .75f;
 
     // Player must be grounded for at least this many physics frames before being able to jump again; set to 0 to allow bunny hopping
     public int antiBunnyHopFactor = 1;
 
     private Vector3 moveDirection = Vector3.zero;
     private bool grounded = false;
     private CharacterController controller;
     private Transform myTransform;
     private float speed;
     private RaycastHit hit;
     private float fallStartLevel;
     private bool falling;
     private float slideLimit;
     private float rayDistance;
     private Vector3 contactPoint;
     private bool playerControl = false;
     private int jumpTimer;
     private float cameraYOffset;
 
     private bool crouchKeyWasDown;
     private float crouchHeight;
     private float standardHeight;
     private GameObject mainCamera;
     private float height;
 
     void Start() {
         controller = GetComponent<CharacterController>();
         myTransform = transform;
         speed = walkSpeed;
         rayDistance = controller.height * .5f + controller.radius;
         slideLimit = controller.slopeLimit - .1f;
         jumpTimer = antiBunnyHopFactor;
         height = controller.height;
         mainCamera = GameObject.FindWithTag("MainCamera");
         cameraYOffset = mainCamera.transform.localPosition.y;
         crouchHeight = controller.height/2;
 
         walking = true;
         running = false;
         crouching = false;
 
         StartCoroutine (Speed());
         
     }
 
 
     void FixedUpdate() {
         float inputX = Input.GetAxis("Horizontal");
         float inputY = Input.GetAxis("Vertical");
         // If both horizontal and vertical are used simultaneously, limit speed (if allowed), so the total doesn't exceed normal move speed
         float inputModifyFactor = (inputX != 0.0f && inputY != 0.0f && limitDiagonalSpeed)? .7071f : 1.0f;
 
         if (grounded) {
                         bool sliding = false;
                         // See if surface immediately below should be slid down. We use this normally rather than a ControllerColliderHit point,
                         // because that interferes with step climbing amongst other annoyances
                         if (Physics.Raycast (myTransform.position, -Vector3.up, out hit, rayDistance)) {
                                 if (Vector3.Angle (hit.normal, Vector3.up) > slideLimit)
                                         sliding = true;
                         }
             // However, just raycasting straight down from the center can fail when on steep slopes
             // So if the above raycast didn't catch anything, raycast down from the stored ControllerColliderHit point instead
             else {
                                 Physics.Raycast (contactPoint + Vector3.up, -Vector3.up, out hit);
                                 if (Vector3.Angle (hit.normal, Vector3.up) > slideLimit)
                                         sliding = true;
                         }
 
                         // If we were falling, and we fell a vertical distance greater than the threshold, run a falling damage routine
                         if (falling) {
                                 falling = false;
                                 if (myTransform.position.y < fallStartLevel - fallingDamageThreshold)
                                         FallingDamageAlert (fallStartLevel - myTransform.position.y);
                         }
 
                         // If running isn't on a toggle, then use the appropriate speed depending on whether the run button is down
                         if (!toggleRun)
                                 speed = Input.GetButton ("Run") ? runSpeed : walkSpeed;
 
                         // If sliding (and it's allowed), or if we're on an object tagged "Slide", get a vector pointing down the slope we're on
                         if ((sliding && slideWhenOverSlopeLimit) || (slideOnTaggedObjects && hit.collider.tag == "Slide")) {
                                 Vector3 hitNormal = hit.normal;
                                 moveDirection = new Vector3 (hitNormal.x, -hitNormal.y, hitNormal.z);
                                 Vector3.OrthoNormalize (ref hitNormal, ref moveDirection);
                                 moveDirection *= slideSpeed;
                                 playerControl = false;
                         }
             // Otherwise recalculate moveDirection directly from axes, adding a bit of -y to avoid bumping down inclines
             else {
                                 moveDirection = new Vector3 (inputX * inputModifyFactor, -antiBumpFactor, inputY * inputModifyFactor);
                                 moveDirection = myTransform.TransformDirection (moveDirection) * speed;
                                 playerControl = true;
                         }
 
                         // Jump! But only if the jump button has been released and player has been grounded for a given number of frames
                         if (!Input.GetButton ("Jump"))
                                 jumpTimer++;
                         else if (jumpTimer >= antiBunnyHopFactor) {
                                 moveDirection.y = jumpSpeed;
                                 jumpTimer = 0;
                         }
 
         }
         
         {
             // If we stepped over a cliff or something, set the height at which we started falling
             if (!falling) {
                 falling = true;
                 fallStartLevel = myTransform.position.y;
             }
 
             // If air control is allowed, check movement but don't touch the y component
             if (airControl && playerControl) {
                 moveDirection.x = inputX * speed * inputModifyFactor;
                 moveDirection.z = inputY * speed * inputModifyFactor;
                 moveDirection = myTransform.TransformDirection(moveDirection);
             }
         }
 
         // Apply gravity
         moveDirection.y -= gravity * Time.deltaTime;
 
         // Move the controller, and set grounded true or false depending on whether we're standing on something
         grounded = (controller.Move(moveDirection * Time.deltaTime) & CollisionFlags.Below) != 0;
 
     
         // If running isn't on a toggle, then use the appropriate speed depending on whether the run button is down
         if(Input.GetKey(KeyCode.LeftControl)){
 
             //crouchKeyWasDown = true;
             //crouching = !crouching;
             //controller.height = crouchHeight;
             //controller.center = new Vector3 (0, -1, 0);
 
             //Debug.Log(mainCamera);
             //mainCamera.transform.localPosition.y = cameraYOffset + standardHeight;
             crouching = true;
             Debug.Log ("Is Crouching.");
 
         } else{
 
             //controller.height = standardHeight ;
             //controller.center = new Vector3 (0, 0, 0);
             //mainCamera.transform.localPosition.y = cameraYOffset + crouchHeight;
             crouching = false;
             Debug.Log ("Is NOT Crouching.");
 
         } 
 
         if (crouching && Input.GetKeyUp(KeyCode.LeftControl)) {
             //crouchKeyWasDown = false;
         }
 
         if ((Input.GetKey (KeyCode.LeftShift))) {
                         running = true;
                         walking = false;
             Debug.Log ("Is running.");
                 } else {
             running = false;
             walking = true;
             Debug.Log ("Is NOT running.");
                 }
     
     }
 
     void Update () {
 
 
         // If the run button is set to toggle, then switch between walk/run speed. (We use Update for this...
         // FixedUpdate is a poor place to use GetButtonDown, since it doesn't necessarily run every frame and can miss the event)
         if (toggleRun && grounded && Input.GetButtonDown("Run"))
             speed = (speed == walkSpeed? runSpeed : walkSpeed);
 
         if ((Input.GetKey (KeyCode.LeftShift))) {
             running = true;
             walking = false;
             Debug.Log ("Is running.");
         } else {
             running = false;
             walking = true;
             Debug.Log ("Is NOT running.");
         }
         
         if(grounded){
         if (walking == true){
             speed = walkSpeed;
         } 
         if (running == true){
             speed = runSpeed;
         }
         if (crouching == true){
             speed = crouchSpeed;
         }
         
         }
     }
     
 
     // Store point that we're in contact with for use in FixedUpdate if needed
     void OnControllerColliderHit (ControllerColliderHit hit) {
         contactPoint = hit.point;
     }
 
     // If falling damage occured, this is the place to do something about it. You can make the player
     // have hitpoints and remove some of them based on the distance fallen, add sound effects, etc.
     void FallingDamageAlert (float fallDistance) {
         print ("Ouch! Fell " + fallDistance + " units!");   
     }
 
     void OnGUI()
     {
         GUILayout.Label("\n" + "\n" + "Time Remaining - " + endTime.ToString() + "\n" + "Press 'L_Shift' Key to activate the timer.");
     }
 
 
      IEnumerator Speed(){
         while (true){
             endTime = 15;
             SetSpeedNormal();
             while (endTime >= 0){
                 if((Input.GetKey ("left shift") || Input.GetKey ("right shift"))) {
                     endTime -= Time.deltaTime;
                 } else {                
                     if (endTime < 15){
                         endTime += Time.deltaTime;
                     }
                 }
                 yield return null;
             }
 
             SetSpeedSlow();
             yield return new WaitForSeconds(6);
         }
     }
     
       void SetSpeedNormal (){
         walk = walkSpeed;
         run = runSpeed;
         crouch = crouchSpeed;
     }
     
       void SetSpeedSlow (){
         walk = slowWalkSpeed;
         run = slowRunSpeed;
         crouch = slowCrouchSpeed;
     }
 }

~WM

Comment
Add comment · Show 2
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
avatar image WaterMinecraft · Sep 09, 2014 at 06:29 PM 0
Share

Any help would be fantastic! I'm thinking I need to not be depending on the "speed" variable and try to make it so that it relies on the separate values for walking, running, and crouching.

~W$$anonymous$$

avatar image fafase · Sep 09, 2014 at 06:32 PM 2
Share

You have 295 lines of code there. You probably know your code quite well so isolate the relevant parts so that we can help faster. I doubt this is all related to your issue.

0 Replies

· Add your reply
  • Sort: 

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

22 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Click on an object and then edit the speed of my player? 1 Answer

how can i change animation speed forever 2 Answers

Scroll to change walk speed... 1 Answer

I'm making a game where 1-4 enemies follow me. I want to make the Enemy AI's move at different speeds, so they won't combine and become one ball. How do I do that? Do I make 4 different scripts, one for each enemy? Thanks in advance 1 Answer

Change speed on Touch 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