В этой статье мы разберёмся, как «передать» или, правильнее говоря, передвинуть объект в Unity. Мы рассмотрим четыре основных способа, объясним, когда и зачем их применять, а также предоставим проверенные контакты служб поддержки и сообществ, куда можно обратиться за помощью.
Содержание
- Зачем нужно «передавать» объект
- Четыре способа перемещения
- Готовые примеры кода
- Контакты для обращений
Зачем нужно «передавать» объект
Большинство механик в играх строится на перемещении персонажа, врага, снаряда или предмета. От того, как именно вы реализуете движение, зависит:
- реалистичность столкновений;
- производительность;
- удобство масштабирования проекта.
Четыре способа перемещения
transform.position — «телепорт»
Суть: вы мгновенно ставите объект в точку с новыми координатами.
// Пример: переместить куб на (10, 0, 5)
transform.position = new Vector3(10f, 0f, 5f); Когда использовать:
- для респавна/телепорта;
- когда физика не нужна.
Минусы: игнорирует столкновения и физику.
transform.Translate — «плавный сдвиг»
Суть: объект смещается на малую дистанцию каждый кадр, создавая иллюзию движения.
// Пример: двигать вперёд со скоростью 3 м/с
float speed = 3f;
transform.Translate(Vector3.forward * speed * Time.deltaTime); Когда использовать:
- 2D-рогалики, визуальные новеллы;
- когда столкновения не критичны.
Rigidbody.MovePosition — «физически корректное перемещение»
Суть: движение через компонент Rigidbody, учитывающий массу, трение, столкновения.
// Пример: двигать Rigidbody к цели
Rigidbody rb = GetComponent<Rigidbody>;
Vector3 target = new Vector3(10f, 0f, 0f);
rb.MovePosition(Vector3.MoveTowards(rb.position, target, speed * Time.deltaTime)); Когда использовать:
- 3D-шутеры, гонки, платформеры с физикой.
NavMeshAgent — «AI-навигация»
Суть: объект самостоятельно выбирает маршрут к цели, обходя препятствия.
// Пример: отправить NPC к точке
NavMeshAgent agent = GetComponent<NavMeshAgent>;
agent.SetDestination(targetPosition); Когда использовать:
- враги и NPC в RPG;
- стратегии и RTS.
Готовые мини-проекты
Мини-скрипт «Передать куб стрелками» (подходит для 2D и 3D)
using UnityEngine;
public class SimpleMove : MonoBehaviour
{
public float speed = 5f;
void Update
{
Vector3 dir = Vector3.zero;
if (Input.GetKey(KeyCode.UpArrow)) dir += Vector3.forward;
if (Input.GetKey(KeyCode.DownArrow)) dir += Vector3.back;
if (Input.GetKey(KeyCode.LeftArrow)) dir += Vector3.left;
if (Input.GetKey(KeyCode.RightArrow)) dir += Vector3.right;
transform.Translate(dir * speed * Time.deltaTime);
}
} Мини-скрипт «Передать Rigidbody»
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class PhysicsMove : MonoBehaviour
{
public float speed = 7f;
private Rigidbody rb;
void Awake => rb = GetComponent<Rigidbody>;
void FixedUpdate
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 force = new Vector3(h, 0, v) * speed;
rb.AddForce(force);
}
} Контакты для обращений
Если что-то пошло не так, или нужен совет от сообщества — не стесняйтесь обращаться:
- Официальный форум Unity (RU)
https://forum.unity.com/forums/russian.30/ - Discord-сервер «Unity Россия»
https://discord.gg/unityru - Telegram-канал «Чекпоинт» от Skillbox
https://t.me/skillbox_checkpoint - Техподдержка Unity Pro/Enterprise
E-mail: support@unity3d.com
Чат в личном кабинете: https://id.unity.com - Бесплатная консультация от Skillbox
Телефон: +7 -00 500-05-75
Чат на сайте: skillbox.ru/gamedev