我在Unity3D第4版中工作。
---坚果壳---
期望的结果:对象保持在新的位置,并且配置的关节再次被锁定,因此两个对象不会相互移动(停留在用户放置的位置)。
实际结果:对象快速恢复到关节制作时的原始相对位置。
---详情--- 我有两个由可配置关节连接的对象。当对象不与用户交互时,我希望关节将相对的约束限制在彼此之间。我通过将ConfigurableJoint的motionX / Y / Z和angularMotionX / Y / Z设置为“Locked”来实现此目的。
但是,我还希望用户能够将RELATIVE周围的对象相互拖动。
我尝试通过在拖动其中一个对象时将ConfigurableJoint的角度运动设置为“Free”,然后在用户停止拖动对象时将其设置为Locked来实现此目的。
但是当我释放物体并重新锁定角度运动时 - 物体会快速回到原来的位置。
private ConfigurableJoint MakeConfigurableJoint(Collider other, int end)
{
Vector3 myAnchor;
ConfigurableJoint tempJoint = this.gameObject.AddComponent("ConfigurableJoint") as ConfigurableJoint; // Neg
tempJoint.autoConfigureConnectedAnchor = false; // Prevent joint from finding it's own position
myAnchor = new Vector3(1f, 0, 0);
connectedBody1 = other.gameObject;
connectedBody1Script = connectedBody1.GetComponent<AtomScript>() as AtomScript;
tempJoint.anchor = myAnchor;
tempJoint.connectedBody = other.transform.rigidbody;
tempJoint.connectedAnchor = new Vector3(0, 0, 0);
// PARAMETERS //
// Motion
tempJoint.xMotion = ConfigurableJointMotion.Locked;
tempJoint.yMotion = ConfigurableJointMotion.Locked;
tempJoint.zMotion = ConfigurableJointMotion.Locked;
tempJoint.angularXMotion = ConfigurableJointMotion.Locked;
tempJoint.angularYMotion = ConfigurableJointMotion.Locked;
tempJoint.angularZMotion = ConfigurableJointMotion.Locked;
tempJoint.axis = new Vector3(0, 0, 0);
tempJoint.secondaryAxis = new Vector3(0,0,0);
return tempJoint;
}//MakeConfigurableJoint
// This DOES successfully allow me to move the object around the other
public void loosenBonds()
{
tempJoint.angularXMotion = ConfigurableJointMotion.Free;
tempJoint.angularYMotion = ConfigurableJointMotion.Free;
tempJoint.angularZMotion = ConfigurableJointMotion.Free;
}// loosenBonds
// This DOES lock the movement again, but first it snaps the object back to the original location (doesn't leave it where I dragged it)
public void tightenBonds()
{
tempJoint.angularXMotion = ConfigurableJointMotion.Locked;
tempJoint.angularYMotion = ConfigurableJointMotion.Locked;
tempJoint.angularZMotion = ConfigurableJointMotion.Locked;
}// tightenBonds
void OnMouseDown(){ loosenBonds() };
void OnMouseUp() { tightenBonds(); }