Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Все Гайды Мой Кабинет

Передвижение персонажа в Unity 2D и 3D

Приветствую! В данной статье мы разберём правильную реализацию движения персонажа. Поскольку движение 2D и 3D персонажей почти на 100% эдентичны, то мы поочереди их и разберём. Благодаря чему, начинающий разработчик не только разберётся в том, как реализовать функцию передвижения, но увидит разницу между движениями 2D и 3D.

Начнём свой пусть с 2D передвижения, поскольку он чуток легче в понимании.

Передвижение 2D персонажа

Первым делом создадим игровой объект нашего персонажа, и назовём его, например, Player.

Далее добавим к нашему персонажу компонент Rigidbody 2D. Если в Вашей игре отсутствуют законы гравитации, то в в поле Body Type необходимо указать значение "Kinematic".

P.S. Обычно гравитация отсутствует в 2д играх с видом сверху.

Теперь самое интересное, нам необходимо создать C# скрипт с названием, например movePlayer, и присвоить этот скрипт нашему объекту Player. А сам скрипт должен иметь следующее содержимое:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class movePlayer : MonoBehaviour
{
    private Rigidbody2D rb;
    public float speed = 0.5f;
    private Vector2 moveVector;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        moveVector.x = Input.GetAxis("Horizontal");
        moveVector.y = Input.GetAxis("Vertical");
        rb.MovePosition(rb.position + moveVector * speed * Time.deltaTime);
    }
}

Готово! Давайте разберём наш код. В строках 7,8,9 мы создали 3 переменные:

  • rb - которая будет хранить ссылку на компонент Rigidbody2D
  • speed - скорость передвижения вашего персонажа
  • moveVector - направление движения персонажа в виде вектора

Далее в 13 строке мы в переменную rb присваивает ссылку на наш компонент Rigidbody2D, чтобы в дальнейшем можно было бы работать с его свойствами и методами.

В строке 18 в переменную moveVector.x мы записываем значение движения по горизонтали. Если максимально простыми словами, то при нажатии на клавишу "D", в переменной записывается значение "1" - вперёд. При нажатии на клавишу "A" - в переменную записывается "-1" - назад.

Аналогичная ситуация происходит и в 19 строке. При нажатии на клавишу "W", в переменной записывается значение "1" - вверх. При нажатии на клавишу "S" - в переменную записывается "-1" - вниз.

Ну и в 20 строке, с помощью метода MovePosition, мы заставляем двигаться нашего персонажа, исходя из значений которые мы получили в moveVector.

Теперь Ваш персонаж может спокойно передвигаться в мировом пространстве. Как видите, всё очень просто и понятно. Теперь как и обещал, перейдём к 3D.

Передвижение 3D персонажа

Для начала, создадим игровой объект персонажа с названием, например, Player. А так же создадим объект Земли, по которой персонаж будет передвигаться. И назовём его, например, Ground.

Так же добавляем к персонажу компонент Rigidbody - чтобы на него действовала гравитация(если нужно).

Теперь так же необходимо создать C# скрипт с названием, например movePlayer, и присваиваем этот скрипт нашему объекту Player. А сам скрипт должен иметь следующее содержимое:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class movePlayer : MonoBehaviour
{
    private Rigidbody rb;
    public float speed = 0.5f;
    private Vector3 moveVector;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        moveVector.x = Input.GetAxis("Horizontal");
        moveVector.z = Input.GetAxis("Vertical");
        rb.MovePosition(rb.position + moveVector * speed * Time.deltaTime);
    }
}

Как видите, данный код почти на 100% аналогичен. Давайте посмотрим, что мы тут изменили.

  • В 7 и 13 строке мы измении тип компонента с Rigidbody2d на Rigidbody, ведь мы уже имеем дело не с 2д, а с 3д.
  • В 9 строке тип переменной moveVector изменён с Vector2 на Vector3, так как у игр 3D, три мировые оси а не две.
  • В 19 строке мы изменили moveVector.y на moveVector.z, поскольку в 3D играх, ось по Y отвечает за верх. А вверх идти нельзя. Вверх можно передвигаться только с помощью прыжка, который мы реализуем в следующей статье.

На этом всё. Надеюсь данная статья научила Вас реализации передвижения персонажа, а так же показала в чём принципиальная разница передвижений между 2D и 3D играми.

Если Вам данная статья помогла, буду рад Вашим лайкам. Спасибо :)

Вы можете отблагодарить автора донатом. ₽ Спасибо

Комментарии

11
Name_293 1 год назад

Спасибо большое тебе

Kain 1 год назад

Большое спасибо за эти текстовые мануалы! Очень удобно и полезно!

Name_537 1 год назад

Спасибо

TimiksOMG 11 месяц назад

я так делал, но использовать MovePosition не очень хорошо, потому что перс может пройти через стену

3553 8 месяцев назад

Ты придай объекту "стена" режим объект.

fedorlaz 9 месяцев назад

Я всё сделал именно так и всё равно мой персонаж не двигается

Rokboll 5 месяцев назад

а как сделать прыжок ?(мне нужно не в 2d а в 3d)

Name_1601 5 месяцев назад

Rokboll,

Можно через AddForce реализовать



private Rigidbody rb;
public float force; // Сила прыжка

private void Start()
{
rb = GetComponent<Rigidbody>();
}

private void FixedUpdate()
{
if (Input.GetButton("Jump"))
{
rb.AddForce(transform.up * force, ForceMode.Impulse);
}
}

Rokboll 5 месяцев назад

Name_1601, спасибо

pon 3 месяца назад

а как сделать прыжок в 2д

zzzZoriX 2 месяца назад

pon,
[SerializeField] private float _jumpForce;
private Rigidbody2D _rb;

private void Start();
{
_rb = GetComponent<Rigidbody2D>();
}

private void Update();
{
if (Input.GetKeyDown(KeyCode.Space))
{
_rb.AddForce(new Vector2(_rb.velosity.y * _jumpForce), ForceMode.Impulse);
}
}


не знаю правильно ли написал, сомневаюсь в части "new Vector2(_rb.velosity.y * _jumpForce)", но в остальном все правильно должно быть. если хочешь, чтобы персонаж прыгал не на пробел(Space) - просто поменяй в условии Space, к примеру на UpArrow(стрелочка вверх) и т.д. и т.п.

Гости не могут оставлять комментарии. Войдите на Сайт или Зарегистрируйтесь