Как стать автором
Обновить

Комментарии 14

Очень не хватает видео результата
Добавил
Спасибо! Вспомнился ламповый принц персии
Зачем видео если проект Unity можно собрать для WEB? Все смогут попробовать вживую.
К.О.: Не всем хочется ставить Unity только ради того, чтоб посмотреть на результат или лишние плагины для браузера :)
1) Кому не хочется пусть не ставит (никто не заставляет), а смотрит видео или скрины.
2) Странно когда у посетителя хаба, посвященного Unity, не установлен Unity-плеер.
Согласен — это очень странно, как и отсутствие установленного Delphi у читателей статей про продукцию Borland ;)
Спасибо) Наконец-то допер как Animator работает)
По моему мнению, в такого плана играх лучше использовать
Input.GetAxisRaw("Horizontal");
вместо
Input.GetAxis("Horizontal");

Поясню свою позицию и заодно разницу: GetAxis плавно повышает скорость с 0 до 1 (отсюда у персонажа появляется «разгон») при нажатии кнопки и тормозит с 1 до 0 (отсюда «инерция» — вы отпускаете кнопку, а персонаж всё ещё двигается).
GetAxisRaw же резко изменяет скорость с 0 до 1, без промежуточных стадий типа 0.1254, 0.41231 (как в случае с GetAxis) и т.д. и с 1 до 0 соответственно.

Повторюсь — это чисто моё мнение, но мне кажется, что в таких простых платформерах не нужен ни разгон, ни инерция. Исключений, конечно, куча — тот же Super Meat Boy очень сильно на этом играет :)
Спасибо огромное, все ясно и понятно)

Но есть один вопрос. Как сделать что бы анимация менялась сразу же после того, как тело начало движение, и наоборот?
У меня после остановки, на спокойствие переходит только после завершения анимации бега.
В конце поста есть видео — разве на нем не так работают анимации?
using UnityEngine;
using System.Collections;

public class CharacterControllerScript: MonoBehaviour
{
public float maxSpeed = 10f;
private bool isFacingRight = true;
private Animator anim;
/// ///
private void Start()
{
anim = GetComponent();
}
/// /// FixedUpdate
/// Animate Physics = true
///
private void FixedUpdate()
{
float move = Input.GetAxis(«Horizontal»);
anim.SetFloat(«Speed», Mathf.Abs(move));
rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y);
if (move > 0 && !isFacingRight)
Flip();
else if (move < 0 && isFacingRight)
Flip();
}
/// ///
private void Flip()
{
isFacingRight = !isFacingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
Всё сделал. Но не работает. Работаю в Unity3D 5 и не знаю что делать.
В современных версиях Unity не работают поля типа rigidbody2D (поле rigidbody2D есть, но имеет тип Component, а не Rigidbody2D). Их нужно присваивать в методе Start в отдельную переменную:
public class CharacterControllerScript : MonoBehaviour
{
    //переменная для установки макс. скорости персонажа
    public float maxSpeed = 10f; 

    //переменная для определения направления персонажа вправо/влево
    private bool isFacingRight = true;

    //ссылка на компонент анимаций
    private Animator anim;

    private Rigidbody2D rb;

    /// <summary>
    /// Начальная инициализация
    /// </summary>
    private void Start()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }

И дальше в коде использовать поле rb вместо rigidbody2D.

В принципе, можно переопределить новое поле со старым именем rigidbody2D:
private new Rigidbody2D rigidbody2D;
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории