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 cyoder · Mar 18, 2013 at 08:12 PM · rigidbodywallsrigidbody-collisioncharactermotorsticky

Rigidbody controller with sticky walls

I'm trying to script a player controller that uses a rigidbody. Unfortunately, when moving against a wall, the force makes the rigidbody stick to the wall. I want smooth movement against them, so that it's not choppy. My first attempt involves adding the normal of the contact point to the movement vector to counteract movement into the wall, but it's still choppy. I also tried some failed experiments with Vector3.OrthoNormalize. Is there another method that is simpler and doesn't involve "brute forcing" it by specifically adding code for every wall angle scenario? (I apologize if this is an obvious/newbie question; I am a noob)

 #pragma strict
 
 // All the variables declared up here
 // I cut out a fair amount of code that doesn't pertain to the problem
 
 
 function Start () 
 {
     // set initial rigidbody settings - no gravity
     rigidbody.useGravity = false;
     rigidbody.freezeRotation = true;
     
 }
 
 function Update () 
 {
     if(isEnabled)
     {
         // input axis variables
         jumpAxis = Input.GetAxis("Jump");
         horizontalAxis = Input.GetAxis("Horizontal");
         verticalAxis = Input.GetAxis("Vertical");
         
         
         
     }
 } 
 
 function LateUpdate ()
 {
     if (isEnabled)
     {
         // jumping logic
                     
         // movement input recieved?    
         if(horizontalAxis != 0 || verticalAxis != 0)
             isMoving = true;
         else
             isMoving = false;
         
         
     }
 }
 
 function FixedUpdate ()
 {
     if (isEnabled)
     {
         // initialize variables
         ownerPosition = transform.position;
         ownerUp = transform.up;
         ownerPositionY = transform.position.y;
         ownerVerticalSpeed = rigidbody.velocity.y;
         ownerGravity = Physics.gravity;
         
         // set movedirection vector
         moveDirection = Vector3(horizontalAxis, 0, verticalAxis);
                 
         // normalize move vector
         var vectMag = moveDirection.magnitude;
         if(vectMag > 1)
             moveDirection = moveDirection.normalized;
         
         // Counteract sticky walls        
         if(isTouching)
             {
                 
                 var touchingNormal = contactnormalSide.normalized;
                 moveDirection += touchingNormal;
                 
         // Grounded/jumping/falling logic
     
         // Apply movement and gravity
         moveDirection = moveDirection * moveSpeed * Time.fixedDeltaTime;
         rigidbody.velocity = Vector3(moveDirection.x, ownerVerticalSpeed, moveDirection.z);
         rigidbody.AddForce(ownerGravity * rigidbody.mass);
         
     }
 }
 
 function OnCollisionExit ()
 {
     // Set all the bools
 }
 
 function OnCollisionStay (collision : Collision)
 {
     var targetUp = transform.up;
     for (var contact : ContactPoint in collision.contacts)
     {
          var collisionNormal = contact.normal;
         var dotprod = Vector3.Dot(collisionNormal, targetUp);
         if(dotprod > 0.5)
         {
             // set bools for grounded
             contactpointBelow = contact.point;
             contactnormalBelow = contact.normal;
             
         }
         else if(dotprod >= -0.5)
         {
             contactSide = true;
             isTouching = true;
             contactpointSide = contact.point;
             contactnormalSide = contact.normal;
 
                 // I tried adding opposite force at the point of contact, but it was still choppy
            
             //if (!isGrounded)
             //{
             //    rigidbody.AddForceAtPosition(-rigidbody.velocity, contact.point);
             //}
         }
         else
         {
             // set above bools
             contactpointAbove = contact.point;
             contactnormalAbove = contact.normal;
         }
     }
 }
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

10 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

Related Questions

Rigidbody (Player) goes through wall 2 Answers

Problem with Rigidbody control script! (collision with perpendicular walls problem) 1 Answer

Rigidbody (2D) stays in fixed angle even when colliding 1 Answer

Offsetting player position from a moving Rigidbody. 0 Answers

Rigidbody sleeping prevents collision detection 4 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