topical media & game development

talk show tell print

lib-unity-future-HouseOfTheFuture-Assets-Scripts-DragRigidbody.js / js



  var spring = 50.0;
  var damper = 5.0;
  var drag = 10.0;
  var angularDrag = 5.0;
  var distance = 0.2;
  var pushForce = 0.2;
  var attachToCenterOfMass = false;
  
  var highlightMaterial : Material;
  private var highlightObject : GameObject;
  
  private var springJoint : SpringJoint;
  
  function Update()
  {
          var mainCamera : Camera = FindCamera();
          var theGO : GameObject;
          
          highlightObject = null;
          if( springJoint != null && springJoint.connectedBody != null )
          {
                  highlightObject = springJoint.connectedBody.gameObject;
          }
          else
          {
                  // We need to actually hit an object
                  var hitt : RaycastHit;
                  if( Physics.Raycast(mainCamera.ViewportPointToRay(Vector3(0.5, 0.5, 0) ),  hitt, 100 ) ) {
                          theGO = hitt.transform.gameObject;
                          if( theGO.tag=="Interactable" && (!hitt.rigidbody || !hitt.rigidbody.isKinematic) ) {
                                  highlightObject = theGO;
                                  GameGUI.SetMessage("You can interact with this object");
                          }
                  }
          }
          
                  
          // Make sure the user pressed the mouse down
          if (!Input.GetMouseButtonDown (0))
                  return;
  
          if(theGO && theGO.tag=="Interactable"){
                  theGO.SendMessage("Interact");
                  return;
          }else{
                  
                  // We need to actually hit an object
                  var hit : RaycastHit;
                  if (!Physics.Raycast(mainCamera.ViewportPointToRay(Vector3(0.5, 0.5, 0) ),  hit, 100 ) ) {
                          return;
                  }
                  // We need to hit a rigidbody that is not kinematic
                  if (!hit.rigidbody || hit.rigidbody.isKinematic) {
                          return;
                  }
                  
                  if (!springJoint)
                  {
                          var go = new GameObject("Rigidbody dragger");
                          body = go.AddComponent ("Rigidbody");
                          springJoint = go.AddComponent ("SpringJoint");
                          body.isKinematic = true;
                  }
                  
                  springJoint.transform.position = hit.point;
                  if (attachToCenterOfMass)
                  {
                          var anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position;
                          anchor = springJoint.transform.InverseTransformPoint(anchor);
                          springJoint.anchor = anchor;
                  }
                  else
                  {
                          springJoint.anchor = Vector3.zero;
                  }
                  
                  springJoint.spring = spring;
                  springJoint.damper = damper;
                  springJoint.maxDistance = distance;
                  springJoint.connectedBody = hit.rigidbody;
                  
                  DragObject(hit.distance, hit.point, mainCamera.ViewportPointToRay(Vector3(0.5, 0.5, 0) ).direction);
          }
  }
  
  function DragObject (distance : float, hitpoint : Vector3, dir : Vector3)
  {
          var startTime = Time.time;
          var mousePos = Input.mousePosition;
                  
          var oldDrag = springJoint.connectedBody.drag;
          var oldAngularDrag = springJoint.connectedBody.angularDrag;
          springJoint.connectedBody.drag = drag;
          springJoint.connectedBody.angularDrag = angularDrag;
          var mainCamera = FindCamera();
          while (Input.GetMouseButton (0))
          {
                  var ray = mainCamera.ViewportPointToRay(Vector3(0.5, 0.5, 0) );
                  springJoint.transform.position = ray.GetPoint(distance);
                  yield;
          }
          
          if (Mathf.Abs(mousePos.x - Input.mousePosition.x) <= 2 && Mathf.Abs(mousePos.y - Input.mousePosition.y) <= 2 && Time.time - startTime < .2 && springJoint.connectedBody)
          {
                  dir.y = 0;
                  dir.Normalize();
                  springJoint.connectedBody.AddForceAtPosition(dir * pushForce, hitpoint, ForceMode.VelocityChange);
                  ToggleLight( springJoint.connectedBody.gameObject );
          }        
          
          
          if (springJoint.connectedBody)
          {
                  springJoint.connectedBody.drag = oldDrag;
                  springJoint.connectedBody.angularDrag = oldAngularDrag;
                  springJoint.connectedBody = null;
          }
  }
  
  static function ToggleLight( go : GameObject )
  {                
          var theLight : Light = go.GetComponentInChildren(Light);
          if( !theLight )
                  return;
                  
          theLight.enabled = !theLight.enabled;
          var illumOn = theLight.enabled;
          var renderers = go.GetComponentsInChildren(MeshRenderer);
          for( var r : MeshRenderer in renderers )
          {
                  if( r.gameObject.layer == 1 )
                  {
                          r.material.shader = Shader.Find(illumOn ? "Self-Illumin/Diffuse" : "Diffuse");
                  }
          }
  }
  
  function FindCamera ()
  {
          if (camera)
                  return camera;
          else
                  return Camera.main;
  }
  
  function OnPostRender()
  {
          if( highlightObject == null )
                  return;
                  
          var go = highlightObject;
          highlightMaterial.SetPass( 0 );
          var meshes = go.GetComponentsInChildren(MeshFilter);
          for( var m : MeshFilter in meshes )
          {
                  Graphics.DrawMeshNow( m.sharedMesh, m.transform.position, m.transform.rotation );
          }
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.