Menu
CoddyTech

Vector3 — это структура

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

Vector3 — это структура, разновидность типа, которую не рассматривали в курсе по C#. Структура — это значение, как и int: при присваивании копируется целиком. После Vector3 b = a; b.x = 9; значение a.x не изменится, потому что b — отдельная копия. (С классом всё иначе: две переменные могут ссылаться на один общий объект.)

transform.position — это свойство, и при чтении оно возвращает копию позиции. Поэтому transform.position.x = 0; изменило бы копию, которая тут же была бы отброшена, и C# отказывается компилировать этот код: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Решение — скопировать позицию, изменить копию и присвоить её обратно. Этот бегун возвращается на среднюю дорожку при нажатии Space:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // создать копию
    p.x = 0;                          // изменить копию
    transform.position = p;           // присвоить её обратно
}

Пропустите последнюю строку — код скомпилируется, но ничего не сдвинется: изменится только копия. transform.localScale и другие свойства Vector3 работают так же.

challenge icon

Задание

Легко

Сани падают со скоростью fall единиц в секунду, а стрелки перемещают их вдоль оси x. Две строки должны удерживать их на полу (y не ниже 0.5) и между стенами (x от -4 до 4), но скрипт не компилируется.

Нажми Play, чтобы увидеть ошибки. Исправь две строки, работая с копией позиции и сохранив их назначение, затем нажми Check.

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

using UnityEngine;

public class Sled : MonoBehaviour
{
    public float speed = 4f;
    public float fall = 3f;

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;

        // Удерживайте сани на полу и между стенами.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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