Повернуть 2D объект линейно - PullRequest
1 голос
/ 20 октября 2019

Мой 2D-объект смотрит вверх (transform.up = (0,1)).

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

Вот мой код:

void Update() {
    if (Input.GetMouseButtonDown(0)) {
        Vector2 wPos = cameraRef.ScreenToWorldPoint(Input.mousePosition);
        StartCoroutine(LookAt(mouseScreenPosition));
    }   
}

public IEnumerator LookAt(Vector2 position) {
    Vector2 direction = (position - (Vector2) transform.position).normalized;
    float angle = Vector2.SignedAngle(direction, transform.up);
    float startAngle = transform.eulerAngles.z;

    for(float t = 0; t <= 1; t += Time.deltaTime * (180 / Mathf.Max(1, Mathf.Abs(angle)))) {
        transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(startAngle, startAngle - angle, t));
        yield return null;
    }
}

Коэффициент, который я умножаю Time.deltaTime, равен 180 / Mathf.Max(1, Mathf.Abs(angle)), что говорит о том, что чем больше угол, тем больше время, необходимое для поворота, но я не знаю, правильно ли я это делаю (работает) или если этоэто лучший способ сделать это.

1 Ответ

1 голос
/ 21 октября 2019

Определите какое-либо поле rotationSpeed:

public float rotationSpeed = 90f;

Используйте Quaternion.LookRotation, чтобы получить Quaternion, на который вы хотите повернуть. Вы хотите, чтобы местный форвард указывал в глобальном направлении вперед, а локальный вверх - в направлении к целевой позиции, поэтому используйте Quaternion.LookRotation(Vector3.forward,targetDirection):

public IEnumerator LookAt(Vector2 position) {
    // casting to Vector2 and normalizing is redundant
    Vector3 targetDirection = position - transform.position; 
    Quaternion targetRotation = Quaternion.LookRotation(Vector3.forward, targetDirection);

Затем используйте Quaternion.RotateTowards сМаксимальное количество градусов, которое вы хотите повернуть в этом кадре, пока не закончите вращение в направлении вращения цели:

while (Quaternion.Angle(targetRotation, transform.rotation) > 0.01) 
{
    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation,
            time.deltaTime * rotationSpeed);
}

Всего:

public float rotationSpeed = 90f;

public IEnumerator LookAt(Vector2 position) {
    // casting to Vector2 and normalizing is redundant
    Vector3 targetDirection = position - transform.position; 
    Quaternion targetRotation = Quaternion.LookRotation(Vector3.forward, targetDirection);

    while (Quaternion.Angle(targetRotation, transform.rotation) > 0.01) 
    {
        transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation,
                time.deltaTime * rotationSpeed);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...