Сделал небольшой пример, чтобы показать проблему: скачать
Проблема: анимация в 2D срабатывает не сразу после нажатия клавиши
Скрипт:
Код
using UnityEngine; using System.Collections;
public class Player : MonoBehaviour { private enum PlayerState { IdleUp, IdleDown, IdleRight, IdleLeft, MoveUp, MoveDown, MoveRight, MoveLeft }
private enum Direction { Up, Down, Right, Left }
private Direction currentDirection;
private Animator anim;
// Use this for initialization void Start() { anim = GetComponent<Animator>();
currentDirection = Direction.Up; }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.W)) { anim.SetInteger("state", (int)PlayerState.MoveUp); currentDirection = Direction.Up; } else if (Input.GetKey(KeyCode.S)) { anim.SetInteger("state", (int)PlayerState.MoveDown); currentDirection = Direction.Down; } else { if (currentDirection == Direction.Up) { anim.SetInteger("state", (int)PlayerState.IdleUp); } else if (currentDirection == Direction.Down) { anim.SetInteger("state", (int)PlayerState.IdleDown); } } } }
Добавлено (12 июля 2015, 23:51) --------------------------------------------- Получается, что если двигаться вверх и вниз (W и S), то перемещение срабатывает быстрее, поэтому танк, к примеру, начинает ехать задом.
Добавил перемещение:
Код
using UnityEngine; using System.Collections;
public class Player : MonoBehaviour { private enum PlayerState { IdleUp, IdleDown, IdleRight, IdleLeft, MoveUp, MoveDown, MoveRight, MoveLeft }
private enum Direction { Up, Down, Right, Left }
private Direction currentDirection;
private float currentSpeed = 0.5f;
private Animator anim;
// Use this for initialization void Start() { anim = GetComponent<Animator>();
currentDirection = Direction.Up; }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.W)) { anim.SetInteger("state", (int)PlayerState.MoveUp); currentDirection = Direction.Up; transform.Translate(Vector3.up * currentSpeed * Time.deltaTime); } else if (Input.GetKey(KeyCode.S)) { anim.SetInteger("state", (int)PlayerState.MoveDown); currentDirection = Direction.Down; transform.Translate(Vector3.down * currentSpeed * Time.deltaTime); } else { if (currentDirection == Direction.Up) { anim.SetInteger("state", (int)PlayerState.IdleUp); } else if (currentDirection == Direction.Down) { anim.SetInteger("state", (int)PlayerState.IdleDown); } } } }
Сообщение отредактировал 8Observer8 - Воскресенье, 12 Июля 2015, 23:52
Во первых у Idle как я понял как таковой анимации вообще нет, а сначала переходит именно на нее. Во вторых анимации с "Idle" намного дольше чем без него, а у транзишн стоит галка HasExitTime. Следовательно пока не закончится Idle - Move не запустится. А у Idle нет анимации. Поэтому кажется что анимация не запустилась. Видимо из-за этого беда. Убери галку.
Вообще непонятно - зачем Idle "анимации"?
PS^ цвет танчика проще менять программно... PPS: Вас не раздражает эта ошибка?
Сообщение отредактировал seaman - Понедельник, 13 Июля 2015, 01:35
seaman, огромное спасибо, что откликнулись! Давайте по порядку.
Цитатаseaman ()
Во первых у Idle как я понял как таковой анимации вообще нет, а сначала переходит именно на нее.
У меня есть две анимации Idle: - PlayerIdleUp - PlayerIdleDown
В аниматоре PlayerIdleUp установлена поумолчанию. У меня подозрение, что здесь, что-то не так и возможно вы правы, потому что когда я запускаю игру и одновременно вытаскиваю Animator, то не вижу проигрывание (жёлтой полоски) под анимацией PlayerIdleUp в аниматоре.
И того у меня сейчас четыре анимации: - PlayerIdleUp (стоим и смотрим вверх) - PlayerIdleDown (смотрим вниз) - PlayerUp (движение вверх) - PlayerDown (движение вниз)
В аниматоре я их соединил стрелками. Создал целую переменную state. Её значения: 0: PlayerIdleUp 1: PlayerIdleDown 4: PlayerUp 5: PlayerDown
На остальные вопросы я потом отвечу. Помогите мне сначала понять, что не так делаю сейчас.
Вы говорите:
Цитатаseaman ()
Следовательно пока не закончится Idle - Move не запустится. А у Idle нет анимации.
А почему же тогда после запуска игры, нажатия кнопки W - анимация PlayerIdleUp переходит в анимацию PlayerUp? Если нажать вниз, то будет переход на анимацию движения PlayerDown, но с задержкой. Как же нет Idle если есть PlayerIdleUp?
Сообщение отредактировал 8Observer8 - Понедельник, 13 Июля 2015, 09:53
Вообще я не ждал ответов. Что у Вас заанимации, что в аниматоре я и сам вижу. Что такое анимация?- изменение состояния. Какое изменение в анимациях - PlayerIdleUp, PlayerIdleDown? Никакого! Там один кадр и ничего не меняется. Что это за анимация? Потому и говорю - в этих "анимациях" нет никаких анимаций. А вот длится этот кадр - секунду. И пока не пройдет эта секунда в другое состояние танк не перейдет. Уберите галки HasExitTime у всех транзишн. "Анимации" PlayerIdleUp, PlayerIdleDown и аналогичные имхо просто совершенно не нужны.
А лучше - смотрите мои уроки. Там как раз танчики делаем.
Что такое анимация?- изменение состояния. Какое изменение в анимациях - PlayerIdleUp, PlayerIdleDown?
Idle - это анимация покоя. Я не понимаю, что в этом плохого.
Цитатаseaman ()
А вот длится этот кадр - секунду. И пока не пройдет эта секунда в другое состояние танк не перейдет. Уберите галки HasExitTime у всех транзишн.
Теперь я понимаю, почему переход из анимации покоя в анимацию движения срабатывает не сразу. Это в теории, но на практике я убрал все HasExitTime, но ничего не изменилось.
Добавлено (13 июля 2015, 11:10) ---------------------------------------------
Цитатаseaman ()
А лучше - смотрите мои уроки. Там как раз танчики делаем.
Спасибо большое! Посмотрю. Я как раз хотел сделать клон этой игры для тренировки.
Добавлено (13 июля 2015, 11:11) ---------------------------------------------
Когда создавали анимации случайно нажали кнопку добавления события. Я в проекте не смог найти где это событие. Если найдете - просто удалите. Но проще - заново пересоздать все анимации.
Цитата
Я не понимаю, что в этом плохого.
Ну на самом деле ничего плохого. Только зачем такая длительность? Один кадр - он и есть один кадр...
Ну на самом деле ничего плохого. Только зачем такая длительность? Один кадр - он и есть один кадр...
Почему же тогда после того, как я убрал HasExitTime у меня танк попрежнему начинается двигаться до того, как срабатывает анимация?
Добавлено (13 июля 2015, 11:50) ---------------------------------------------
Цитатаseaman ()
Когда создавали анимации случайно нажали кнопку добавления события. Я в проекте не смог найти где это событие. Если найдете - просто удалите. Но проще - заново пересоздать все анимации.
Спасибо! Не проще заново создать анимации. События обозначаются палочками. Нужно выделить палочку и нажать Delete:
Сообщение отредактировал 8Observer8 - Понедельник, 13 Июля 2015, 11:55
Не может быть. Куда бы они делись? У меня одно событие в анимации PlayerUp. Да, случайно добавил. Посмотрите внимательно. Нужно в "Hierarchy" чтобы было выделен спрайт Player. В меню нужно выбрать "Window" -> "Animation". В списке анимаций выбрать "PlyaerUp". Напишите, пожалуйста, есть ли там палочка. Для меня это важно, чтобы знать на будущее, что может быть такой глюк.
Добавлено (13 июля 2015, 12:23) --------------------------------------------- seaman, я посмотрел ваш урок (часть с анимацией танка). У вас нет состояний покая для танка. Как вы их собираетесь добавлять? Если есть, то покажите, пожалуйста, где.
Скорее всего сделаю - просто обнулю speed, а когда едет speed = 1;
Со скоростью понятно. Но этого мало, так как танк будет буксовать на месте.
Добавлено (13 июля 2015, 14:32) --------------------------------------------- Ура! Я нашёл ошибку! Нужно было в настройках установить для "Transition Duration" значение 0 (для каждого Transition). Причём, галочка HasExitTime должна быть действительно убрана для всех Transition.
Добавлено (13 июля 2015, 16:53) --------------------------------------------- Наиболее правильно привлечь "Any State":
Для каждого Transition в Settings: - галочка "Has Exit Time" должна быть убрана - значение "Transition Duration (s)" нужно выставить в ноль - убрать галочку "Can Transition To Self"
Добавил постоянный звук двигателя и звук газа, при нажатии кнопок WASD (или стрелок) Tanks_v1.1.0 (проект)
P.S. Если кому-то пригодилась информация, то, пожалуйста, плюсуйте
Сообщение отредактировал 8Observer8 - Понедельник, 13 Июля 2015, 16:59