Menu
CoddyTech

Скорость по диагонали

Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 27 из 85.

Зажми одновременно стрелки вправо и вверх, и исходные оси дадут направление (1, 0, 1). Его длина, .magnitude, равна квадратному корню из 1 + 1, то есть примерно 1,41. Персонаж, перемещаемый с его помощью, за то же время проходит по диагонали 1,41 единицы, что и 1 единицу прямо вперед: на 41% быстрее.

.normalized возвращает копию вектора, направленную так же и имеющую длину ровно 1 единицу: (1, 0, 1) становится примерно (0,71, 0, 0,71), а (0, 0, 5) становится (0, 0, 1). При умножении на скорость он перемещается с этой скоростью независимо от направления. Эта пчела летит к цветку со скоростью 2 единицы в секунду, далеко он или близко; без .normalized она летела бы тем быстрее, чем дальше находился бы цветок:

public Vector3 flower = new Vector3(4, 1, 3);
public float speed = 2f;

void Update()
{
    Vector3 toFlower = flower - transform.position;
    transform.position += toFlower.normalized * speed * Time.deltaTime;
}

Vector3.zero.normalized остается равным (0, 0, 0), поскольку у нуля нет направления. v.normalized оставляет v без изменений; v.Normalize() изменяет сам v.

challenge icon

Задание

Легко

Сделай так, чтобы персонаж двигался по диагонали с той же скоростью.

  1. В Update() создай Vector3 direction = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));.
  2. Прибавь direction.normalized * speed * Time.deltaTime к transform.position.

Нажми «Играть» и удерживай две клавиши со стрелками: персонаж будет двигаться по диагонали не быстрее, чем по прямой. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Walker : MonoBehaviour
{
    public float speed = 4f;

    void Update()
    {
        // Стрелки или WASD: перемещение по осям x и z со скоростью speed, одинаковой и при движении по диагонали.
    }
}

Все уроки раздела Основы скриптинга в Unity

Потренируйтесь самостоятельно: Песочница Unity