Куча переменных в аниматоре и проблемы с SetTrigger [РЕШЕНО]
| |
alexsilent | Дата: Вторник, 16 Мая 2017, 18:21 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Приветствую друзья. Пытаюсь разобраться с Аниматором, и возникает куча вопросов:
1) На каждое действие мне приходится вводить новую переменную Trigger (то есть чтобы можно было вызвать вообще в любой момент анимацию) И я еще планирую ввести около 20 анимаций, неужели придется для всего этого безобразия добавлять больше переменных триггеров? Т__Т
2) Триггер конфликтует с другими триггерами, если запускаются одновременно, в пределах нескольких кадров (то есть триггеру еще нужно время, чтоб переключиться в режим OFF) (Почему в Юнити вместо этого безобразия не добавили переменную String?)
То есть конфликта бы не было, потому-что String имеет единственное значение, а Триггеры могут пересекаться, и в конечном итоге проигрывается не та анимация, которая нужна. Обычно конфликт происходит, если резко начинать переходить из одного состояния в другое, например мгновенно приземляться и подпрыгивать назад, или например замахиваться на удар, а потом вдруг получить удар от врага и тогда может так получиться, что триггер ранения вообще не проигрывается.
3) Кто как вообще делает в анимации? Когда в вашем персонаже много анимации, а не как на примерах юнити, где все ясно и понятно, потому-что там всего 4-5 анимации, где легко обойтись и без большого количества триггеров.
4) Можно ли как-то костылями все-таки прикрутить переменные типа String к Аниматору и чтобы работало также, как с другими переменными? Я бы тогда выкинул все триггеры, и добавил только один триггер "Play" и одну переменную String "CurrentAnimation".
Можно вместо String использовать Integer, но его минус, что я запутаюсь, в номерах, придется запоминать, что для прыжка нужен номер 1, для сидения номер 9, а для распития спиртных напитков номер 23, в общем это было бы неудобно, хотя решит проблему, жаль не идеальным образом.
Сообщение отредактировал alexsilent - Вторник, 16 Мая 2017, 19:23 |
|
| |
EchoIT | Дата: Вторник, 16 Мая 2017, 18:35 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Цитата 4) Можно ли как-то костылями все-таки прикрутить переменные типа String к Аниматору и чтобы работало также, как с другими переменными? Я бы тогда выкинул все триггеры, и добавил только один триггер "Play" и одну переменную String "CurrentAnimation". Прикинь, есть Legacy Animation для подобного.
Я сам толком не понял, как по красоте делать в этом аниматоре (правда я им пользуюсь только косвенно), но для нескольких анимаций он довольно удобен, плюс плавные переходы и изменение скорости анимации делают его довольно удобным. Так что присоединяюсь к вопросу.
Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Вторник, 16 Мая 2017, 18:36 |
|
| |
alexsilent | Дата: Вторник, 16 Мая 2017, 18:39 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| Цитата EchoIT ( ) Прикинь, есть Legacy Animation для подобного
Я раньше этим и пользовался всегда) Но нужно пару фишек нового аниматора (например поднятие руки на другом слое), потому я на него пытаюсь перебраться, жаль что пока туго идет с этим.
|
|
| |
Vostrugin | Дата: Вторник, 16 Мая 2017, 19:06 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| Аниматор можно заставить воспроизводить любую его анимацию по имени, GetComponent<Animator>().Play("state name", layer). Этот вариант не подходит? Добавлено (16 мая 2017, 19:06) --------------------------------------------- И CrossFade для плавного перехода между анимациями
|
|
| |
alexsilent | Дата: Вторник, 16 Мая 2017, 19:18 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| Цитата EchoIT ( ) Так что присоединяюсь к вопросу. Оказывается было все просто, как в устаревшей версии аниматора юнити. Зря вопрос создавал, но может кому пригодиться еще.
Можно сделать по красоте, если вместо:
Код anim.SetTrigger(AnimationName);
писать, как в Legacy Animation:
Код anim.CrossFade(AnimationName,.2);
(я надеюсь это работает плавно со слоями, вроде бы функциональность не потерялась, даже в ячейке "Idle", Blend нормально работает , т.е. плавное смещение Из режима ожидания в режим движения и потом бега)
В общем, я убрал все стрелочки, все триггеры и поменял названия у ячеек, так, чтобы они были с тем названием, которое хочу вызвать (упростил их, и сделал с тем же именем, которым раньше вызывалось этим триггером, теперь ячейка сама себе триггер, очень удобно) Наконец-то я избавился от этих триггеров
Добавлено (16 мая 2017, 19:18) ---------------------------------------------
Цитата Vostrugin ( ) И CrossFade для плавного перехода между анимациями как раз только что обнаружил, Спасибо)
А это, кажется работает не совсем плавно GetComponent<Animator>().Play("state name", layer), хотя я не тестировал, надо проверить, но зачем, если CrossFade зашел на ура :3
Сообщение отредактировал alexsilent - Вторник, 16 Мая 2017, 19:20 |
|
| |
EchoIT | Дата: Вторник, 16 Мая 2017, 19:23 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| alexsilent, понял, буду юзать, но иногда не знаешь названия стэйта у разных аниматоров, а триггеры одни и те же.
Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Вторник, 16 Мая 2017, 19:25 |
|
| |
alexsilent | Дата: Вторник, 16 Мая 2017, 19:41 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| Цитата EchoIT ( ) но иногда не знаешь названия стэйта у разных аниматоров, а триггеры одни и те же. Я так понял. Вручную название стейта поменять независимо от того какая у стейта анимация, и будет все работать, если скрипт один будет для всех анимаций. Я только что поменял название у ячеек и работает, если одну букву изменить у стейта, то анимация не будет проигрываться.
То есть по сути переназвав Стейты, мы получаем, те самые конкретные триггеры, я только что у Стейта поменял название с "Jump" на "jump" и стейт, также как и триггер перестал распознаваться, несмотря на то что внутри у стейта анимация с названием "Jump", так что независимо, какая анимация привязана к стейту, главное название самого стейта, которое можно менять.
Добавлено (16 мая 2017, 19:41) ---------------------------------------------
Цитата EchoIT ( ) но иногда не знаешь названия стэйта у разных аниматоров, а триггеры одни и те же.
И даже больше. Стейты в таком виде лучше триггеров, к примеру, если мы создадим новый аниматор, то триггеры придется вручную создавать заново, их нельзя перенести со старого аниматора, а стейты в таком виде можно перенести в новый аниматор, просто скопировав. Короче это намного лучше триггеров)
Только что проверил, это круто) И если надо, то потом у ячеек поменять анимации, все равно быстрее, чем создавать заново триггеры и называть их.
Сообщение отредактировал alexsilent - Вторник, 16 Мая 2017, 19:43 |
|
| |
Wite | Дата: Вторник, 16 Мая 2017, 21:58 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| Если вам нужно просто переключать анимации используйте старую систему анимаций. Она кстати проц меньше жрет, особенно на мобилах это полезно. Меканим содан(куплен) для удобного смешивания анимаций. К примеру бег полу присидя плавный переход в бег в шаг гуськом вам нужно только две анимации (правельные анимации) и одна переменная скорости. Если вы хотите сделать кучу разных анимаций, сделайте линейный бленд трее с одной переменной и меняйте ее.Добавлено (16 мая 2017, 21:58) --------------------------------------------- Вообще тут главное все сразу расплонировать.
|
|
| |
beril | Дата: Среда, 17 Мая 2017, 02:05 | Сообщение # 9 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата И даже больше. Стейты в таком виде лучше триггеров, к примеру, если мы создадим новый аниматор, то триггеры придется вручную создавать заново, их нельзя перенести со старого аниматора, а стейты в таком виде можно перенести в новый аниматор, просто скопировав. Короче это намного лучше триггеров)
А зачем новый создавать нельзя просто старый скопировать ?
Нужна одна переменная создай один параметр float и меняй его , типа float = 1 значит бег, float = 2 значит смерть и т.д, только это еще муторней)
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
|