Как заставить объект вращаться на основе другого объекта? - PullRequest
0 голосов
/ 12 мая 2019

У меня есть винтик, который пользователь может повернуть, чтобы повернуть подъемный мост. В настоящее время у меня шестерня и разводной мост, вращающиеся с одинаковой скоростью, например: https://gyazo.com/14426947599095c30ace94a046e9ca21

Вот мой текущий код:

[SerializeField] private Rigidbody2D thingToRotate;
    void OnMouseDrag()
    {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition = Camera.main.ScreenToWorldPoint(mousePosition);

        Vector2 direction = new Vector2(
            mousePosition.x - transform.position.x,
            mousePosition.y - transform.position.y
         );

        transform.right = direction;
        thingToRotate.transform.up = transform.right;

    }

Я хочу, чтобы, когда пользователь поворачивал шестерню, он лишь немного поворачивал объект, чтобы пользователь мог повернуть шестерню несколько раз, прежде чем разводные мосты закроются.

Я пытался добавить к разводному углу Эйлера. Я попытался установить вращение разводных мостов на вращение шестерни и разделить это вращение на 2.

1 Ответ

0 голосов
/ 13 мая 2019

Не устанавливайте фиксированные ориентации, а используйте вместо этого правильные методы.

  • Mathf.SignedAngle, чтобы определить угловую разницу между током transform.right и direction

  • При использовании RigidBody2D используйте Rigidbody2D.MoveRotatio n вместо настройки вращения через компонент Transform.

Тогда я бы сохранил totalAngle, который был повернут для того, чтобы, например, вызвать какое-то событие, когда было выполнено достаточное вращение.

thingToRotate Вы просто поворачиваетесь только на totalAngle / factor.

// Adjust in the Inspector how often the cog thing has to be turned
// in order to make the thingToRotate perform a full 360° rotation
public float factor = 5f;

private float totalAngle = 0f;

[SerializeField] private Rigidbody2D thingToRotate;
private void OnMouseDrag()
{
    var mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

    // this is shorter ;)
    Vector2 direction = (mousePosition - transform.position).normalized;

    // get the angle difference you will move
    var angle = Vector2.SignedAngle(transform.right, direction);

    // rotate yourselve correctly
    transform.Rotate(Vector3.forward * angle);

    // add the rotated amount to the totalangle
    totalAngle += angle;

    // for rigidBodies rather use MoveRotation instead of setting values through
    // the Transform component
    thingToRotate.MoveRotation(totalAngle / factor);
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...