Синтаксис:
- var spring = 50.0;
- var damper = 0;
- var drag = 1;
- var angularDrag = 0.5;
- var distance = 0.5;
- var attachToCenterOfMass = false;
- var player:GameObject;
- private var springJoint : SpringJoint;
- function Update ()
- {
- // Make sure the user pressed the mouse down
- if (!Input.GetMouseButtonDown (0))
- return;
- var mainCamera = FindCamera();
- // We need to actually hit an object
- var hit : RaycastHit;
- if (!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), hit, 10))
- 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");
- var body : Rigidbody = go.AddComponent ("Rigidbody") as 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;
- StartCoroutine ("DragObject", hit.distance);
- }
- function DragObject (distance : float)
- {
- 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.ScreenPointToRay (Input.mousePosition);
- springJoint.transform.position = ray.GetPoint(distance);
- yield;
- }
- if (springJoint.connectedBody)
- {
- springJoint.connectedBody.drag = oldDrag;
- springJoint.connectedBody.angularDrag = oldAngularDrag;
- springJoint.connectedBody = null;
- }
- }
- function FindCamera ()
- {
- if (camera)
- return camera;
- else
- return Camera.main;
- }
При высокой "упрогости" джоинта кубик передвигается со скоростью движения мыши, не отставая и не болтаясь, то есть то что надо, но есть такой момент, если пытаться вжимать куб в стену - он начинает дёргаться и глючить, в конце концов пролетая сквозь стену, что собственно и является проблемой.
В теории как решить проблему я знаю, если подумать логически то нужно подобное условие что при определённом растяжении джоинта, его просто дизейблить, грубо-говоря, ну или как вариант, при колизии со стеной обрывать джоинт, но это не дело, при любом лёгком касании кубик выпадает из рук.
Скажу прямо - я просто незнаю как написать условие растяжения джоинта, если такое вообще возможно, прошу помощи у вас ребят.
Спасибо заранее.