You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.0 KiB
96 lines
3.0 KiB
using System; |
|
using System.Collections; |
|
using UnityEngine; |
|
|
|
namespace UnityStandardAssets.Utility |
|
{ |
|
public class DragRigidbody : MonoBehaviour |
|
{ |
|
const float k_Spring = 50.0f; |
|
const float k_Damper = 5.0f; |
|
const float k_Drag = 10.0f; |
|
const float k_AngularDrag = 5.0f; |
|
const float k_Distance = 0.2f; |
|
const bool k_AttachToCenterOfMass = false; |
|
|
|
private SpringJoint m_SpringJoint; |
|
|
|
|
|
private void Update() |
|
{ |
|
// Make sure the user pressed the mouse down |
|
if (!Input.GetMouseButtonDown(0)) |
|
{ |
|
return; |
|
} |
|
|
|
var mainCamera = FindCamera(); |
|
|
|
// We need to actually hit an object |
|
RaycastHit hit = new RaycastHit(); |
|
if ( |
|
!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition).origin, |
|
mainCamera.ScreenPointToRay(Input.mousePosition).direction, out hit, 100, |
|
Physics.DefaultRaycastLayers)) |
|
{ |
|
return; |
|
} |
|
// We need to hit a rigidbody that is not kinematic |
|
if (!hit.rigidbody || hit.rigidbody.isKinematic) |
|
{ |
|
return; |
|
} |
|
|
|
if (!m_SpringJoint) |
|
{ |
|
var go = new GameObject("Rigidbody dragger"); |
|
Rigidbody body = go.AddComponent<Rigidbody>(); |
|
m_SpringJoint = go.AddComponent<SpringJoint>(); |
|
body.isKinematic = true; |
|
} |
|
|
|
m_SpringJoint.transform.position = hit.point; |
|
m_SpringJoint.anchor = Vector3.zero; |
|
|
|
m_SpringJoint.spring = k_Spring; |
|
m_SpringJoint.damper = k_Damper; |
|
m_SpringJoint.maxDistance = k_Distance; |
|
m_SpringJoint.connectedBody = hit.rigidbody; |
|
|
|
StartCoroutine("DragObject", hit.distance); |
|
} |
|
|
|
|
|
private IEnumerator DragObject(float distance) |
|
{ |
|
var oldDrag = m_SpringJoint.connectedBody.drag; |
|
var oldAngularDrag = m_SpringJoint.connectedBody.angularDrag; |
|
m_SpringJoint.connectedBody.drag = k_Drag; |
|
m_SpringJoint.connectedBody.angularDrag = k_AngularDrag; |
|
var mainCamera = FindCamera(); |
|
while (Input.GetMouseButton(0)) |
|
{ |
|
var ray = mainCamera.ScreenPointToRay(Input.mousePosition); |
|
m_SpringJoint.transform.position = ray.GetPoint(distance); |
|
yield return null; |
|
} |
|
if (m_SpringJoint.connectedBody) |
|
{ |
|
m_SpringJoint.connectedBody.drag = oldDrag; |
|
m_SpringJoint.connectedBody.angularDrag = oldAngularDrag; |
|
m_SpringJoint.connectedBody = null; |
|
} |
|
} |
|
|
|
|
|
private Camera FindCamera() |
|
{ |
|
if (GetComponent<Camera>()) |
|
{ |
|
return GetComponent<Camera>(); |
|
} |
|
|
|
return Camera.main; |
|
} |
|
} |
|
}
|
|
|