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-го.


Ответы (0 шт):