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 /
This question was closed Feb 27, 2018 at 04:55 AM by cbholmes03 for the following reason:

The question is answered, right answer was accepted

avatar image
1
Question by cbholmes03 · Feb 26, 2018 at 04:21 AM · c#oncollisionenteroncollisionexit

C#: How can you make your character jump only when you are touching the top of the object?

I have tried looking at a lot of other questions that are similar but all of them have the same problem: that you can jump up the wall. Here is my code: using System.Collections; using System.Collections.Generic; using UnityEngine;

 public class Movement : MonoBehaviour {
     public float movementSpeed = 20f;
     public float jumpHeight = 1250f;
     private Rigidbody2D rb2d;
     private bool isJumping = true;
     void Start ()
     {
         rb2d = GetComponent<Rigidbody2D>();
     }
     private void FixedUpdate()
     {
         float move = Input.GetAxis("Horizontal");
         Vector2 movement = new Vector2(move * movementSpeed, 0f);
         rb2d.AddForce(movement);
     }
     private void OnCollisionEnter2D(Collision2D collision)
     {
         if (collision.gameObject.tag == "Ground")
         {
             isJumping = false;
         }
     }
     private void OnCollisionExit2D(Collision2D collision)
     {
         if (collision.gameObject.tag == "Ground")
         {
             isJumping = true;
         }
     }
     void Update ()
     {
         if ((Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow)) && !isJumping)
         {
             rb2d.AddForce(Vector2.up * jumpHeight);
         }
     }
 }

Is there any other way I can use the OnCollisionEnter2D to specify what side it collides on?

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

2 Replies

  • Sort: 
avatar image
-1

Answer by vanjasretenovic123 · Feb 26, 2018 at 10:00 PM

First create empty child for that object and on that child add Collider to top of the child and create this function in script and add script to child


public RigidBody2D object;//this is object which will jump, attach him to script in editor

private void OnCollisionEnter2D(Collision collider)

{

object.AddForce(Vector2.up*speed);

}

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
avatar image
0

Answer by ElijahShadbolt · Feb 26, 2018 at 06:23 AM

You could use Collision2D.contacts, get the average Normal vector of all contact points, and compare that to vertical by using Vector3.Angle(). If the angle between the normal and Vector3.up is less than, say, 30 degrees, the player can jump.


EDIT

Instead of getting the average, this script tests each contact normal to see if at least one is within the minimum incline angle.

I think I may have gotten something wrong with my currentCollisions set, though. This should work for now.

Movement.cs

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class Movement : MonoBehaviour
 {
     public float movementSpeed = 20f;
     public float jumpImpulse = 20f;
     public float maxGroundedAngle = 30f;
 
     private Rigidbody2D rb2d;
     private bool isJumping = true;
 
     // set of colliders currently in contact.
     private List<Collider2D> currentCollisions = new List<Collider2D>();
 
     void Start()
     {
         rb2d = GetComponent<Rigidbody2D>();
     }
 
     private void FixedUpdate()
     {
         float move = Input.GetAxis("Horizontal");
         Vector2 movement = new Vector2(move * movementSpeed, 0f);
         rb2d.AddForce(movement);
     }
 
     void Update()
     {
         TryJump();
     }
 
     // attempts to make the object jump.
     private void TryJump()
     {
         // if they can jump, and player presses jump button
         if ((Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow)) && !isJumping)
         {
             isJumping = true;
 
             // apply an impulse at this moment of time (not a force over a long time).
             rb2d.AddForce(Vector2.up * jumpImpulse, ForceMode2D.Impulse);
         }
     }
 
     // every frame it is in contact with a collider...
     private void OnCollisionStay2D(Collision2D collision)
     {
         if (collision.gameObject.tag == "Ground")
         {
             // add the collider to the set of current collisions
             if (!currentCollisions.Contains(collision.collider))
                 currentCollisions.Add(collision.collider);
 
 
             // Check if they can jump.
 
             // default value for if no contacts fulfilled the condition.
             isJumping = true;
 
             Vector2 up = Vector2.up; // or you could use -Physics2D.gravity
 
             // They can jump if any contact has a normal pointing up (within a maximum angle).
             foreach (ContactPoint2D contact in collision.contacts)
             {
                 // for visualization in scene view
                 Debug.DrawRay(contact.point, contact.normal, Color.red);
                 Debug.DrawRay(contact.point, up, Color.blue);
 
                 // if within maximum angle
                 if (Vector2.Angle(contact.normal, up) < maxGroundedAngle)
                 {
                     isJumping = false;
                     break; // exit for loop
                 }
             }
         }
     }
 
     private void OnCollisionExit2D(Collision2D collision)
     {
         if (collision.gameObject.tag == "Ground")
         {
             // remove the collider from the current collisions
             currentCollisions.Remove(collision.collider);
 
             // if that was the last collider to leave,
             if (currentCollisions.Count == 0)
             {
                 isJumping = true; // the object is in the air.
             }
         }
     }
 
     private void UpdateIsJumping()
     {
         // if there are no more colliders touching the object,
         if (currentCollisions.Count == 0)
         {
             isJumping = true; // it is in the air.
         }
         else // if there is at least one collider,
         {
             isJumping = false; // it is still on the ground.
         }
     }
 }
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 cbholmes03 · Feb 26, 2018 at 08:41 PM 0
Share

Thank you. That helped a lot.

Follow this Question

Answers Answers and Comments

452 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

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

Illuminating a 3D object's edges OnMouseOver (script in c#)? 1 Answer

I don't think I get collision box, can someone help? 0 Answers

Collision Detection between two instantiate clone 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