Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Основы создания 2D персонажа в Unity 3D 4.3. Часть 2: бегущий персонаж

Anna | 17.06.2014 | нет комментариев
Часть 1: заготовка персонажа и анимация покоя
Часть 2: бегущий персонаж

Каждому здравствуй. Продолжаем дело, начатое в первой части. Теперь у нас есть платформа и стоящий на ней персонаж с анимацией покоя. Настало время обучить нашего персонажа бегать вправо-налево по платформе.

Загрузим сцену из первой части. Напомню, что в прошлый раз мы импортировали несколько спрайтов в папкуAssets — Sprites. На каждый случай, внизу поста еще раз приведу ссылку на спрайты. Среди них должен быть спрайт под наименованием Run. Мы будем применять его для создания анимации бега. Для этого нам нужно проделать те же действия по перевоплощению одиночного спрайта в коллекцию, как и при создании анимации покоя. Лаконично напомню: выделяем спрайт, в окне Inspector устанавливаем качество Sprite Mode какMultiple, нажимаем ниже Sprite Editor, нарезаем изображение в режиме Grid либо Automatic.

Сейчас в окне Hierarchy выбираем Character и переходим в окно Animation. Нажимаем на поле с анимацией Idleи выбираем Create New Clip, Дабы сделать анимацию бега. Сбережем файл анимации в папке Assets Animations под именем Run.

Новая сделанная анимация Run стала нынешней в окне Animation. Разворачиваем спрайт Run в окне Project, выделяем все фалы Run_0… Run_9 и перетаскиваем в окно Animation. Установим пока значение Sample равное 24.

Все это мы теснее делали в первой части, а сейчас будет что-то новое. Перейдем в окно Animator. Теперь там отображены три анимации: Any StateIdle и Run. Нам предстоит задать данные перехода из анимации Idle в анимацию Run, то есть из состояния покоя в состояние бега. В нижнем левом углу есть поле Parameters. Нажимаем на плюсик, выбираем Float и называем новейший параметр как Speed. Тем самым мы сотворили параметр типа число с плавающей запятой, обозначающий скорость перемещения персонажа. Именно в зависимости от значения этого параметра будет протекать переключение из анимации покоя в анимацию бега. Сейчас нажимаем правой кнопкой мыши на анимацию Idle, выбираем Make Transition и нажимаем левой кнопкой мыши на анимацию Run. Между анимациями появится линия со стрелкой. Передвиньте мышкой прямоугольники анимации, если нехорошо видно. Кликнем по линии со стрелкой. В окне Inspector отобразятся свойства перехода между анимациями. Обратим внимание на низ окна, в раздел Conditions. Кликнем на параметр Exit Time и поменяем его на Speed. Второе поле Greater оставим без изменений, а в третьем введем значение 0.01. Мы сделали условие перехода из анимации покоя в анимацию бега — оно происходит, когда значение параметра скорости становится немногим огромнее нуля.

Сейчас необходимо сделать обратный переход — из Run в Idle. Делаем все с точностью напротив: Make Transition от Run к Idle, выделяем переход, в Conditions устанавливаем Speed — Less — 0.01.

Сейчас у нас есть две анимации и данные перехода между ними. Но пока ничего трудиться не будет, потому что все что мы сделали необходимо «оживить» при помощи скрипта. Давайте перейдем в окно Project и сотворим в папке Assets подпапку Scripts. Добавим в нее новейший C# Script, назовем егоCharacterControllerScript и откроем на редактирование.

Я приведу полный листинг скрипта с подробными комментариями, а ниже еще поясню, что в нем происходит.

using UnityEngine;
using System.Collections;

public class CharacterControllerScript : MonoBehaviour
{
    //переменная для установки макс. скорости персонажа
    public float maxSpeed = 10f; 
    //переменная для определения направления персонажа вправо/влево
    private bool isFacingRight = true;
    //ссылка на компонент анимаций
    private Animator anim;

    /// <summary>
    /// Исходная инициализация
    /// </summary>
	private void Start()
    {
        anim = GetComponent<Animator>();
    }

    /// <summary>
    /// Исполняем действия в способе FixedUpdate, т. к. в компоненте Animator персонажа
    /// выставлено значение Animate Physics = true и анимация синхронизируется с расчетами физики
    /// </summary>
	private void FixedUpdate()
    {
        //используем Input.GetAxis для оси Х. способ возвращает значение оси в пределах от -1 до 1.
        //при стандартных настройках плана 
        //-1 возвращается при нажатии на клавиатуре стрелки налево (либо клавиши А),
        //1 возвращается при нажатии на клавиатуре стрелки вправо (либо клавиши D)
        float move = Input.GetAxis("Horizontal");

        //в компоненте анимаций изменяем значение параметра Speed на значение оси Х.
        //приэтом нам необходим модуль значения
        anim.SetFloat("Speed", Mathf.Abs(move));

        //обращаемся к компоненту персонажа RigidBody2D. задаем ему скорость по оси Х, 
        //равную значению оси Х умноженное на значение макс. скорости
        rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y);

        //если нажали клавишу для перемещения вправо, а персонаж направлен налево
        if(move > 0 && !isFacingRight)
            //отражаем персонажа вправо
            Flip();
        //обратная обстановка. отражаем персонажа налево
        else if (move < 0 && isFacingRight)
            Flip();
    }

    /// <summary>
    /// Способ для смены направления движения персонажа и его зеркального отражения
    /// </summary>
    private void Flip()
    {
        //меняем направление движения персонажа
        isFacingRight = !isFacingRight;
        //получаем размеры персонажа
        Vector3 theScale = transform.localScale;
        //зеркально отражаем персонажа по оси Х
        theScale.x *= -1;
        //задаем новейший размер персонажа, равный ветхому, но зеркально отраженный
        transform.localScale = theScale;
    }
}

Выходит, мы завели несколько переменных: для задания максимальной скорости перемещения, для определения направления (вправо/влево) и для работы с компонентом Animator. Примерно все действия происходят в способе FixedUpdate. В нем мы получаем значение оси Х, которое меняется при нажатии на клавиатуре клавиш налево-вправо либо A-D (если не меняли соответствующие настройки плана!). После этого устанавливаем это значение параметру Speed компонента Animator. Обратите внимание, что мы берем модуль этого значения при помощи способа Mathf.Abs, так как при создании условий перехода между анимациями покоя и бега мы сопоставляем значение параметра с позитивным числом 0.01. Нам тут не значимо, в какую сторону бежит персонаж. Значимо лишь величина значения. Дальше задаем скорость перемещения по оси Х в соответствии со значением максимальной скорости. И, наконец, проверяем, в какую сторону бежит персонаж, и в какую сторону он в данный момент повернут. Если он бежит вправо, а повернут налево — разворачиваем его вправо путем инвертирования его размера по оси Х. И напротив. Этим нехитрым методом мы избавились от необходимости делать две анимации взамен одной: для бега вправо и для бега налево.

Сберегаем скрипт. В Unity перетаскиваем его на нашего Character в окне Hierarchy. Запускаем игру, нажимаем налево-вправо либо A-D.

Капитан Коготь сейчас может бегать! Скорость анимации получилась быстроватой. Ее дозволено снизить путем уменьшения значения Sample в окне Animation для анимации Run (значение 12 будет типично). Если единовременно с игрой у вас видно окно Animator, то вы ув

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB