Unity3D регулируемый joint
Хочу написать скрипт для дополнения Hinge joint. Что-то нечто среднее между Hinge и Fixed Joint.
Мне необходимо такое поведение, в обычном режиме соединение будет имитировать Fixed Joint, т. е. когда будет вращаться 1-ый объект, то будет вращаться и 2-ой с такой же угловой скоростью. В другом режиме будет отдельно передаваться крутящий момент на 2-ой объект и он будет свободно вращаться относительно 1-го, но при этом если 1-ый тоже вращается, то 2-му, кроме своего крутящего момента, еще должен прибавиться крутящий момент 1-го. Это похоже на вращение башни танка. Надеюсь я смог объяснить что мне нужно и вы меня поняли.
Частично я смог решить эту проблему
private Rigidbody body;
public HingeJoint joint; // ссылка указывается через другой компонент
private void Awake()
{
body = GetComponent<Rigidbody>();
rotaryClamp = new JointSpring() { damper = 0, spring = 5000, targetPosition = 0 };
SetRotaryClamp(false);
}
// Вызывается в управляющем скрипте
public void Rotate(float direction)
{
if (direction != 0)
{
if (body != null)
{
direction = Mathf.Sign(direction);
body.AddRelativeTorque(5000, ForceMode.Acceleration);
SetRotaryClamp(false);
}
}
else
{
SetRotaryClamp(true);
}
}
private void SetRotaryClamp(bool state)
{
if (joint != null)
{
if (state)
{
joint.useSpring = state;
return;
}
joint.useSpring = state;
// угол на который пружина должна повернуть объект, он меняется меняется когда
// пружина отключена
rotaryClamp.targetPosition = joint.angle;
joint.spring = rotaryClamp;
}
}
Тут почти все работает, кроме как передача дополнительного крутящего момента от 1-го объекта, при собственном вращении 2-го.