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

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

Большинство игр, как правило, имеют в себе функции передвижения, которые присутствуют у игровых персонажей, ботов, или других игровых объектов. В данной статье мы рассмотрим несколько способов реализации передвижения персонажем.

Способ 1. Смена координат

Для начала нужно понять, что такое передвижение объекта? – Это плавное изменение координат X и Y (если говорить о 2D играх.) у нашего объекта. Следовательно, для передвижения любого объекта необходимо циклически менять его координаты, тем самым, создавая эффект передвижения. Координаты любого игрового объекта находятся в классе(компоненте) Transform. Изменим позицию объекта по оси X на единицу вправо, через метод FixedUpdate():

void FixedUpdate()
{
    transfrom.position = new Vector2(transform.position.x + 1, transform.position.y);
}

В представленном выше коде, сначала мы получаем текущую позицию объекта по оси X с помощью transform.position.x. После чего передвигаем наш объект на одну единицу вправо с помощью оператора +1.

На самом деле, данный код можно упростить используя метод Translate(), который сразу меняет позицию объекта на определённое значение.

void FixedUpdate()
{
    transform.Translate(1f, -3f, 0);
}

Представленный код меняет позицию объекта на 1 в правую сторону по оси Х, и на 3 единицы вниз по оси Y.

Передвигать игровой объект мы научились. Но что делать, если нам передвигать объект необходимо только в тот момент, когда была нажата определённая кнопка. Для этого воспользуемся Input.GetAxisRaw("Horizontal") и Input.GetAxisRaw("Vertical").

Input.GetAxisRaw("Horizontal") отвечает за горизонтальное передвижение. Оно получает значение -1, если игрок двигается НАЗАД(нажал стрелочку влево). При движении ВПЕРЁД(нажата стрелочка вправо), мы получаем значение 1.

Input.GetAxisRaw("Vertical") отвечает за вертикальное передвижение. Оно поучает значение -1, если игрок двигается НАЗАД(нажал стрелочку вниз). При движении ВПЕРЁД(нажата стрелочка вверх), мы получаем значение 1.

Так же стрелочки «влево», «вправо», «вверх» и «вниз», соответствуют нажатым клавишам A, D, W и S. Но их так же можно изменить в настройках Unity. Данные настройки находятся в меню Edit - Project Settings - Input Manager.

Давайте немного переделаем наш код:

void FixedUpdate()
{
    transform.Translate(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"), 0);
}

Последнее, на чём хотелось бы заострить внимание, это на скорости передвижения объекта. Чтобы указать скорость, с которой мы будем передвигать нашего персонажа, нам необходимо объявить переменную, например runSpeed, и умножить её на наши параметры метода GetAxisRaw. Итоговый код передвижения будет выглядеть следующим образом:

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

public class PlayerMovement : MonoBehaviour
{
    public float runSpeed = 0.3f;
    void FixedUpdate()
    {
        transform.Translate(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed, 0);
    }
}

Способ 2. Толкание

Очень часто при реализации передвижения, разработчики хотят, чтобы передвигаемый персонаж не проходил сквозь стены и другие твёрдые объекты. Поэтому для реализации такого передвижения используют компонент Rigidbody2D, и его метод velocity(). Смысл данного передвижения в том, что мы не перемещаем наш объект по координатам(как в предыдущем способе), а мы как бы толкаем его. И если наш объект встретит препятствие на своём пути, он будет замедлен, либо полностью остановлен. Данный способ передвижения самый распространённый.

Поскольку мы будем работать с компонентом Rigidbody2D, то объявим для неё поле rigidbody, а так же объявим скорость передвижения объекта в поле runSpeed:

private Rigidbody2D rigidbody;
public float runSpeed = 5.0f;

Теперь нам необходимо получить ссылку на экземпляр класса(компонента) Rigidbody2D, ведь именно через этот компонент мы и будем перемещать нашего персонажа.

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

Теперь мы можем с помощью rigidbody, обратиться к методу velocity – который как говорилось выше, будет толкать наш объект в определённую сторону. Чтобы эти значения изменить как нам необходимо, воспользуемся new Vector2(1, 0). Например, нам необходимо переместить объект вправо по оси Х, на единицу:

void FixedUpdate()
{
    rigidbody.velocity = new Vector2(1, 0);
}

Давайте разберём несколько важных моментов. В компоненте Rigidbody2D , свойство velocity может иметь всего 2 параметра, X и Y. Чем выше X и Y, чем сильнее наш объект будет толкаться по соответствующим координатам. Например, если мы хотим направить персонажа двигаться вправо(по вектору X), то нам нужно первым параметром передать значение больше нуля, например, velocity(6, 0). Если нужно двигаться влево, то velocity(-6,0). Аналогичная ситуация и с осью Y.

Используя Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical") и runSpeed из предыдущего урока, изменим наш код:

void FixedUpdate()
{
    rigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed);
}

Итоговый код передвижения будет выглядеть следующим образом:

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

public class PlayerMovement : MonoBehaviour
{
    private Rigidbody2D rigidbody;
    public float runSpeed = 5.0f;

    void Start()
    {
        rigidbody = GetComponent<Rigidbody2D>();
    }
    
    private void FixedUpdate()
    {
        rigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed);
    }
}
Вы можете отблагодарить автора донатом. ₽ Спасибо

Комментарии

1
Naushnik2024 10 месяцев назад

Есть ли способ не шаманить с позицией игрока у которого есть Square внутри, с учетом того что даже есть скрипт стартовой позиции но игрок как будто не до конца стоит на земле

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