Advertisement
Guest User

DragRigidbody

a guest
Feb 15th, 2013
4,615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.80 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class DragRigidbody : MonoBehaviour
  5. {
  6.     public float maxDistance = 100.0f;
  7.    
  8.     public float spring = 50.0f;
  9.     public float damper = 5.0f;
  10.     public float drag = 10.0f;
  11.     public float angularDrag = 5.0f;
  12.     public float distance = 0.2f;
  13.     public bool attachToCenterOfMass = false;
  14.  
  15.     private SpringJoint springJoint;
  16.    
  17.     void Update()
  18.     {
  19.         if(!Input.GetMouseButtonDown(0))
  20.             return;
  21.        
  22.         Camera mainCamera = FindCamera();
  23.        
  24.         RaycastHit hit;
  25.         if(!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), out hit, maxDistance))
  26.             return;
  27.         if(!hit.rigidbody || hit.rigidbody.isKinematic)
  28.             return;
  29.        
  30.         if(!springJoint)
  31.         {
  32.             GameObject go = new GameObject("Rigidbody dragger");
  33.             Rigidbody body = go.AddComponent<Rigidbody>();
  34.             body.isKinematic = true;
  35.             springJoint = go.AddComponent<SpringJoint>();
  36.         }
  37.        
  38.         springJoint.transform.position = hit.point;
  39.         if(attachToCenterOfMass)
  40.         {
  41.             Vector3 anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position;
  42.             anchor = springJoint.transform.InverseTransformPoint(anchor);
  43.             springJoint.anchor = anchor;
  44.         }
  45.         else
  46.         {
  47.             springJoint.anchor = Vector3.zero;
  48.         }
  49.        
  50.         springJoint.spring = spring;
  51.         springJoint.damper = damper;
  52.         springJoint.maxDistance = distance;
  53.         springJoint.connectedBody = hit.rigidbody;
  54.        
  55.         StartCoroutine(DragObject(hit.distance));
  56.     }
  57.    
  58.     IEnumerator DragObject(float distance)
  59.     {
  60.         float oldDrag             = springJoint.connectedBody.drag;
  61.         float oldAngularDrag     = springJoint.connectedBody.angularDrag;
  62.         springJoint.connectedBody.drag             = this.drag;
  63.         springJoint.connectedBody.angularDrag     = this.angularDrag;
  64.         Camera cam = FindCamera();
  65.        
  66.         while(Input.GetMouseButton(0))
  67.         {
  68.             Ray ray = cam.ScreenPointToRay(Input.mousePosition);
  69.             springJoint.transform.position = ray.GetPoint(distance);
  70.             yield return null;
  71.         }
  72.        
  73.         if(springJoint.connectedBody)
  74.         {
  75.             springJoint.connectedBody.drag             = oldDrag;
  76.             springJoint.connectedBody.angularDrag     = oldAngularDrag;
  77.             springJoint.connectedBody                 = null;
  78.         }
  79.     }
  80.    
  81.     Camera FindCamera()
  82.     {
  83.         if (camera)
  84.             return camera;
  85.         else
  86.             return Camera.main;
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement