Получение имени текущего стейта в Mecanim

Общие вопросы о Unity3D

Получение имени текущего стейта в Mecanim

Сообщение Strannik 27 фев 2013, 01:58

Кто-нибудь нашел способ, как можно получить имя текущего состояния?
Как-то печалит вручную прописывать кучу названий в AnimatorStateInfo.IsName("") и AnimatorStateInfo.nameHash.

Может у кого есть варианты, немного упрощающие задачу?
Например, editor скрипт для генерация словаря Dictionary<int,string> из данных AnimatorController, где в качестве ключа используется nameHash.
Приемы при проектировании архитектуры игр
Mecanim: чтение дополнительной информации из стейтов
Mecanim: копирование blendTree
Strannik
UNIт
 
Сообщения: 93
Зарегистрирован: 26 апр 2012, 22:30
Откуда: Омск

Re: Получение имени текущего стейта в Mecanim

Сообщение Woolf 27 фев 2013, 02:11

Имя? Там вроде тег можно как-то получить, про имя не знаю.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Получение имени текущего стейта в Mecanim

Сообщение Strannik 27 фев 2013, 02:33

С тегами там та же ситуация - тока хэш доступен.
Приемы при проектировании архитектуры игр
Mecanim: чтение дополнительной информации из стейтов
Mecanim: копирование blendTree
Strannik
UNIт
 
Сообщения: 93
Зарегистрирован: 26 апр 2012, 22:30
Откуда: Омск

Re: Получение имени текущего стейта в Mecanim

Сообщение Woolf 27 фев 2013, 02:40

хм...
На офе вот что предлагают:

Синтаксис:
Используется csharp
static int atakState = Animator.StringToHash("Base.Atak1");
 
void Start (){
    anim = GetComponent<Animator>();              
}
 
void FixedUpdate ()
{
    currentBaseState = anim.GetCurrentAnimatorStateInfo(0);
 
    if (currentBaseState.nameHash == atakState){
         Debug.Log("Do Stuff Here");
    }
}


Забавно.. Но тогда интересно, зачем же там возможность вешать разные теги на анимации? Если можно вешать, значит подразумевается, что их можно как-то читать? Мне самому интересно, у меня тоже вот стоит задача программного изменения скорости конкретной анимации. Но я её пока не решал, отложил на будущее.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Получение имени текущего стейта в Mecanim

Сообщение Strannik 27 фев 2013, 03:12

видел этот пример)

Насчет тегов еще частично можно понять. Если их небольшое количество использовать (например, для стейтов сидячих анимаций один тег, для стоячих другой), то тогда еще приемлемо через IsTag("") сравнивать.
Конечно, когда тегов нужно много, то та же ситуация(
Приемы при проектировании архитектуры игр
Mecanim: чтение дополнительной информации из стейтов
Mecanim: копирование blendTree
Strannik
UNIт
 
Сообщения: 93
Зарегистрирован: 26 апр 2012, 22:30
Откуда: Омск

Re: Получение имени текущего стейта в Mecanim

Сообщение Strannik 03 мар 2013, 21:56

Реализовал возможность получения информации по стейтам - имя, слой, тег и т.п.
сами скрипты:
https://dl.dropbox.com/s/wdrxcx1vdaj87p ... cripts.zip

сцена с примером использования:
https://dl.dropbox.com/s/g72yvq3q8gtva9 ... xample.zip
управление:
пробел - переключение анимационного слоя
стрелка вперед - бежать
enter - выполнить последовательность анимаций в группе
ЛКМ - атака


Как использовать скрипты:

1. В префаб добавить скрипт MecanimControllersInfo.

2. Выбрать префаб, затем и в инспекторе установить нужное количество AnimatorController-ов и перенести AnimatorController-ы в появившиеся поля

3. Нажать Update states data. Все сгенерированные данные отобразятся в полях Controllers Data.
Вручную изменять что-либо в Controllers Data нельзя!!! Эти поля отображаются просто для просмотра значений.

4. Как-нибудь получить в своих скриптах с аниматором ссылку на данный префаб.
Например, создать в вашем скрипте поле с типом MecanimControllersInfo и перенести туда префаб.

5. В скрипте будет доступ к массиву контроллеров, через которые можно получить нужный стейт.
Если вы сделали какие-нибудь изменения в AnimatorController, касающиеся сгенерированных данных, то надо повторить пункт 3.

6. PROFIT!
Приемы при проектировании архитектуры игр
Mecanim: чтение дополнительной информации из стейтов
Mecanim: копирование blendTree
Strannik
UNIт
 
Сообщения: 93
Зарегистрирован: 26 апр 2012, 22:30
Откуда: Омск


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 11