Как сделать так, чтобы объект вращался наполовину быстрее, чем другой? - 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

Вам необходимо вычислить угол между текущей ориентацией и направлением перетаскивания, умножить его на свое соотношение (т. Е. 0,5), а затем преобразовать его в вектор.

float ratio = 0.5f;

float ang = ratio * Mathf.Deg2Rad * Vector2.Angle(transform.right, direction);

thingToRotate.transform.up += new Vector2(Mathf.Cos(ang), Mathf.Sin(ang));

Это сделает ваш код похожим на:

public float ratio = 0.5f;

[SerializeField] private Rigidbody2D thingToRotate;
void OnMouseDrag()
{
    ...

    float ang = ratio * Mathf.Deg2Rad * Vector2.Angle(transform.right, direction);

    thingToRotate.transform.up += new Vector2(Mathf.Cos(ang), Mathf.Sin(ang));

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