Menu
CoddyTech

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

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

Vector3 — это структура, разновидность типа, с которой ты ещё не сталкивался. Структура — это значение, как 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

Задание

Легко

Исправь скрипт саней, чтобы он компилировался и сани оставались на полу между стенами.

  1. Замени две строки, задающие transform.position.y и .x, копией: Vector3 p = transform.position;.
  2. Задай p.y = Mathf.Max(p.y, 0.5f); и p.x = Mathf.Clamp(p.x, -4f, 4f);, затем transform.position = p;.

Нажми «Играть»: сани приземлятся на пол, а стены остановят их. Затем нажми «Проверить».

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

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);
    }
}

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

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