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
0
Question by no_great_name · Dec 22, 2013 at 12:52 PM · collisionmovementcolliderdetectionrigid body

Collision detection and prevention between a rigid body and box collider

Hello.

This scenario that I am creating is presented in 2d although it utilizes all 3 dimensions.

I have a character that the player can move around that has a rigid body attached to it. There is also an object, a tree in this instance, that has a box collider attached to it. I have the scripting set up so that when the rigid body hits the box collider in any of the four main directions, the character will no longer be able to move in that direction, simulating having an obstacle in the way while still being able to move in any other direction.

The problem I am having however, is that my script is only working correctly if only one direction is involved. If the character is moving diagonally, the rigid body passes right through the box collider, even though I can still detect that there is, in fact, a collision.

Here's the script:

 public float movementSpeed = 5.0f;
 
     int collisionDetectedVertical = 0;      //1 = up; -1 = down
     int collisionDetectedHorizontal = 0;    //1 = right; -1 = left
 
     // Update is called once per frame
     void Update () {
 
         if(collisionDetectedVertical != 0 || collisionDetectedHorizontal != 0) {
 
             if(collisionDetectedVertical == 1) {              //is trying to move up
 
                 if(Input.GetAxis("Vertical") != -1) {       //cannot move if not pressing down
 
                     transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, 0, 0));
 
                 }
                 else {
                 
                     transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
 
                 }
             }
             else if(collisionDetectedVertical == -1) {       // is trying to move down
             
                 if(Input.GetAxis("Vertical") != 1) {         // cannot move if not pressing up
                 
                     transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, 0, 0));
                 
                 }            
                 else {
                 
                     transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
                 
                 }
             }
             if(collisionDetectedHorizontal == 1) {       // is trying to move right
             
                 if(Input.GetAxis("Horizontal") != -1) {     // cannot move if not pressing left
                 
                     transform.Translate(new Vector3(0, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
                 
                 }    
                 else {
                 
                     transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
                 
                 }
             }
             else if(collisionDetectedHorizontal == -1) {   // is trying to move left
             
                 if(Input.GetAxis("Horizontal") != 1) {     // cannot move if not pressing right
                 
                     transform.Translate(new Vector3(0, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
                 
                 }
             
                 else {
                 
                     transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
                 
                 }
             }
         }
         else {
 
             transform.Translate(new Vector3 (Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
             //print (transform.position.z);
     
         }
     }
 
     void OnTriggerEnter (Collider collider) {
 
         if (Input.GetAxis ("Vertical") == 1) {
 
             collisionDetectedVertical = 1;
             print ("There is collision up");
 
         } 
         else if (Input.GetAxis ("Vertical") == -1) {
 
             collisionDetectedVertical = -1;
             print ("There is collision down");
 
         }
         if (Input.GetAxis ("Horizontal") == 1) {
             
             collisionDetectedHorizontal = 1;
             print ("There is collision right");
             
         } 
         else if (Input.GetAxis ("Horizontal") == -1) {
             
             collisionDetectedHorizontal = -1;
             print ("There is collision left");
         
         }
     }
 
     void OnTriggerExit (Collider colliderExit) {
 
         collisionDetectedVertical = 0;
         collisionDetectedHorizontal = 0;
 
     }

I am detecting the collision by using the variables collisionDetectedVertical and collisionDetectedHorizontal, knowing that there is a collision when either of these values do not equal 0 and it is set up so that the rigid body cannot move into the collider even while holding down the up/down/left/right key.

However, if my rigid body enters diagonally, say by holding both the left and down keys at the same time, how will I prevent it from moving into the collider and only move around the edges?

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

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

18 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

Related Questions

Collision error 1 Answer

Collision detection not working properly with 2D sprites 1 Answer

Cannot move FPSController after respawning at a spawn point. 1 Answer

check if two colliders Rub against each other 1 Answer

Spawning and health script not working with collider? 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