Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 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
0
Question by kmkittyhawk · May 17, 2018 at 02:07 AM · c#3d2d gamejumpingsidescroller

Better 2D Sprite Jump in 3D Plane

Hey there, I'm having trouble with creating a 'jumping' script for my game. I have scoured the internet for almost a week looking for a solution to this, but everyone seems to solve the problem in many different ways that don't quite fit or help my issue, so finally, I am posting in hopes this can help me and perhaps others who may have the issue.

My player is a 2D car sprite that drives along a road collecting gas and such, but I need to have a good jump mechanic to get over obstacles. At the moment the player sort of teleports up and floats down which is quite jarring. My player also has a time-limit health bar above their head, just so you know I guess. See the attached image for more background information. ![alt text][1] [1]: /storage/temp/117024-example.png Now, here's my MoveForward Script (I need to the change the awful name I know)

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class MoveForward : MonoBehaviour
 {
     //Variables for the pacing of general movement
 
     //thrust handles general movements such as left and right
     public float thrust;
     public float jumpForce = 2.0f;
 
     //declares the variable 'rb' as a 2D Rigidbody
     public Rigidbody2D rb;
     public Vector2 jump;
 
     //Bool checks whether player is on the ground or not, if so, they can jump, if not, they can't
     public bool isGrounded;
 
 
     void Start()
     {
         //Gets the Rigidbody component
         rb = gameObject.GetComponent<Rigidbody2D>();
     }
 
     void OnCollisionStay2D(Collision2D collision)
     {
         //On collision with the ground this becomes true, once the collision stops it becomes false!
         isGrounded = true;
     }
 
 
     void FixedUpdate()
     {
         //General Movements, Left, Right, and Down
 
         //Drive Left
         if (Input.GetKey(KeyCode.A))
         {
             rb.AddForce(transform.position += Vector3.left  * thrust * Time.deltaTime);
         }
         //Drive Right
         if (Input.GetKey(KeyCode.D))
         {
             rb.AddForce(transform.position += Vector3.right * thrust * Time.deltaTime);
         }
         //Jump Script
         if (Input.GetKey(KeyCode.Space) && isGrounded)
         {
 
             rb.AddForce(transform.position += Vector3.up * jumpForce * Time.deltaTime);
             isGrounded = false;
 
         }
     }
 }

example.png (424.6 kB)
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
0
Best Answer

Answer by Eno-Khaon · May 17, 2018 at 05:09 AM

Your movement scheme at the moment is... thoroughly confusing right now, to say the least.

Here's a rundown of how your car moves at the moment:

Let's say your car starts at (-41, 5, 0). You hold 'D' to move right. Well, here's how you move instead:

First, we take your position (-41, 5, 0) and apply that as a force, scaled by Time.deltaTime squared, since AddForce() inherently provides that modification. So, in one second of input, you can anticipate moving approximately 40/50 units *left* (since you slightly tone down that movement using Vector2.right * thrust), while also trying to move up slightly. Default gravity would push you down by 9.81 units per second, so you wouldn't successfully rise into the air in a meaningful way.

On top of all of this, you use transform.position += Vector2.right inside AddForce(), which simply makes an even bigger mess of things.

First off, you don't need to factor your position into your use of AddForce(). You also don't need to factor in Time.deltaTime.

 // Push object toward world-right
 rb.AddForce(Vector2.right * thrust);
 // ... is the same as...
 rb.AddForce(Vector2.right * thrust, ForceMode2D.Force);
 
 // If you want to ignore your car's mass...
 rb.AddForce(Vector2.right * thrust * rb.mass, ForceMode2D.Force);


Do note that you'll probably want to reduce your current thrust value by 50 times (based on Unity's default setting for Time.fixedDeltaTime of 0.02, or 50 per second).

As for jumping itself, there's a different matter to deal with. You only need to apply a jumping force while you're currently on the ground. Therefore, you only need to apply that force once at a time.

I've previously provided an example function here on how to calculate the force necessary to jump to a specified height, so after that's calculated, you simply apply it:

 // Apply the force immediately, rather than over 1 second
 // Also, this ignores mass by factoring it in
 rb.AddForce(Vector2.up * jumpForce * rb.mass, ForceMode2D.Impulse);


A confounding factor in all of this, however, is the fact that Input occurs during the Update() function. If you try to receive Input during FixedUpdate(), it can miss key moments, such as GetKeyDown.

Therefore, I recommend the following:

Get your left/right controls and your jumping during Update(), then apply the left/right during FixedUpdate().

 Vector2 movementInput = Vector2.zero;

 void Update()
 {
     movementInput = new Vector2(Input.GetAxis("Horizontal"), 0.0f);
     // Ideally, use GetButtonDown() instead, but may need to be defined in the input manager
     // Using Spacebar instead as a fallback
     if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
     {
         // A single, immediate force can more-safely be applied outside of FixedUpdate()
         // But don't count on it for a constant force
         rb.AddForce(Vector2.up * jumpForce * rb.mass, ForceMode2D.Impulse);
     }
 }

 void FixedUpdate()
 {
     rb.AddForce(movementInput * thrust * rb.mass);
 }


Edit: Whoops, made some changes for Physics2D-based algorithms.
Comment
Add comment · Show 1 · 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
avatar image kmkittyhawk · May 18, 2018 at 03:48 AM 0
Share

Thanks for this, it was really helpful and the explanations were really useful too! I'm not a good programmer but it feels like this really helped put things in perspective. I did end up changing to 'GetButtonDown' but it all works pretty well :) Thanks!

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

506 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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

I have a problem with my sidescroller movement script 0 Answers

Jumping effectively in a 2D sidescroller 0 Answers

Double Jump 1 Answer

a better movement code C# 3 Answers

How to convert Raycast3D to Raycast2D 1 Answer


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