@PrizmMARgh

Как задавать анимации хода в unity?

Столкнулась при создании около-настольной игры со следующей проблемой: т.к. я хочу сделать анимации ходов разных фигур разными. Как я выяснила, это можно сделать через coroutine (т.к. помимо обычной анимации необходимы какие-то эффекты и само перемещение на другую клетку). Если бы различных алгоритмов анимации было всего парочку, то вопрос бы не возникал - можно было бы просто поместить методы в скрипт-контроллер. Но если анимаций куча, то удобнее будет их выделить в отдельные файлы. Сначала думала, что можно реализовать их, как отдельные классы с методом step(Vector3 delta, float speed, Transform tr) под общим интерфейсом (чтобы потом можно было группировать анимации воедино). Но потом я поняла, что это какой-то неправильный путь. Может, есть более адекватный способ решения моей проблемы?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
DanceM
@DanceM Куратор тега Unity
Кто хочет -ищет способ, кто не хочет -ищет причину
Я бы для данной задачи воспользовался анимациями (Animations), их можно легко сделать, без кода и математики, сколько нужно, и после лишь назначать и проигрывать.

PS: ну и отвечу на комментарий к другому ответу

Захламлять основной скрипт фигуры этими методами не хочется
"Захламлять"? Это всего лишь код, и что его будет 100 строк, что 1000, приложению не столь важно, будет работать одинаково (так, как код написан).
Можете создать отдельный класс для подобных анимаций и там хранить все.

Наверное, лучше вообще не хранить метод step(), а использовать только IEnumerator?
Метод step() я бы оставил там же, чтобы не вызывать корутину каждый раз через StartCoroutine, удобней методом всё же.

Имена методов можно поместить в Dictionary или простой массив (или без оных), и вызывать общий метод с передачей имени нужной анимации, а он будет уже выбирать какой метод дальше запустить. Например:
myMoves.MoveFigureTo(transform, newPosition, "fly");
...
public void MoveFigureTo(Transform transf, Vector3 newPosition, string animName)
{
	switch(animName)
	{
		case "fly":
			FlyTo(transf, newPosition);;
			break;
		case "go":
			GoTo(transf, newPosition);;
			break;
	}
}


PS2: на случай анимации через Animation Controller
как задать анимацию, в результате которой объект будет перемещаться на некоторый вектор?


Есть фигура, на ней Animation Controller и все возможные анимации перемещения. Каждая анимация вызывается например через Animator.SetTrigger. Причем, если у фигуры есть отдельная анимация, скажем спрайтов, для показа движения, в этот контроллер её запихивать незачем, он отвечает лишь за движение фигуры в целом и тогда может быть применен к любой фигуре, у которой в свою очередь будет еще персональная анимация.

Каждая анимация содержит перемещение фигуры лишь по оси Y (по высоте), ну и если надо, боковые движения, но НЕ движение к желамой точке. Т.е., это анимация движения фигуры на месте.

Смещение фигуры в нужную точку надо применять не к самой фигуре, что уже анимируется, а к её родителю (созданному на этот случай). И это можно сделать корутиной в скрипте или ассетом DOTween (очень удобный). Так же, родитель поворачивается (если игра 3д), и двигается в любом направлении, никак при этом не конфликтуя с анимацией движения.

Для наглядности:
5e91a7425830a876842263.gif
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы