Работа с текущей анимацией в аниматоре

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Работа с текущей анимацией в аниматоре

Сообщение ogrefifas 20 мар 2015, 20:25

Ситуация в следующем.Главный перс бросает гранату по нажатию на Q,соответсвующая анимация проигрывается и заканчивается.Переход по триггеру и выход по времени.Я делаю так,когда идет бросок,чтобы мой перс не мог прыгать,бегать,стрелять,только с idle ее бросал.Я в скрипте создал чекПеременную.Но к примеру,анимация еще не доигралась,но кнопку я уже поднял(чек снялся),тогда можно прыгнуть и не красиво выходит.Я сейчас думаю,нужно в Input kup & kdown написать ,что то типо IsActiveAndEnabled.,но как мне проверить именно конкретную анимацию в аниматоре на играемость.Может тупой вопрос,но что-то туплю
ogrefifas
UNец
 
Сообщения: 6
Зарегистрирован: 17 мар 2015, 04:28

Re: Работа с текущей анимацией в аниматоре

Сообщение ogrefifas 21 мар 2015, 20:57

Блин,может вопрос фигово поставил, можно так:
Как проверить активность конкретной анимации в аниматоре?
ogrefifas
UNец
 
Сообщения: 6
Зарегистрирован: 17 мар 2015, 04:28

Re: Работа с текущей анимацией в аниматоре

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

Для простых ситуаций есть http://docs.unity3d.com/ScriptReference ... eInfo.html

Ранее я для этого систему написал, которая считывает теги и имена стейтов контроллера в префаб, и в игре можно
было получить любые нужные данные (имя текущего стейта, имя в который осуществляется переход и т.п.).

Для unity 5 мне пришла идея как можно попроще сделать.
Появился компонент для стейт-машины StateMachineBehaviour. Его можно вешать как на стейт-машину, так и на отдельные стейты.

Пишем класс для стейт-машины:
Синтаксис:
Используется csharp
public class MyMecanimSMController : StateMachineBehaviour
{
    public MecanimStateData CurrentState;

    public void OnMyStateEnterCompleted()
    {
        if (CurrentState!= null)
            Debug.Log(CurrentState.Name);
    }
}
 


Пишем класс для стейта:
Синтаксис:
Используется csharp
public class MecanimStateData : StateMachineBehaviour
{
    public string Tag;
    public string Name;

    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        var fsm = animator.GetBehaviour<MyMecanimSMController>();
        fsm.CurrentStateData = this;
    }

    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        var fms = animator.GetBehaviour<MyMecanimSMController>();
        fms.OnMyStateEnterCompleted();
    }
}
 

Вешаем на каждый стейт и указываем Tag и Name.

Теперь можно через аниматор получить в коде нужные данные.
Синтаксис:
Используется csharp
var fsm=GetComponent<Animator>().GetBehaviour<MyMecanimSMController >();
var stateName = fsm.CurrentState.name;
 

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

Re: Работа с текущей анимацией в аниматоре

Сообщение ogrefifas 23 мар 2015, 07:21

Strannik писал(а):Для простых ситуаций есть http://docs.unity3d.com/ScriptReference ... eInfo.html

Ранее я для этого систему написал, которая считывает теги и имена стейтов контроллера в префаб, и в игре можно
было получить любые нужные данные (имя текущего стейта, имя в который осуществляется переход и т.п.).

Для unity 5 мне пришла идея как можно попроще сделать.
Появился компонент для стейт-машины StateMachineBehaviour. Его можно вешать как на стейт-машину, так и на отдельные стейты.

Пишем класс для стейт-машины:
Синтаксис:
Используется csharp
public class MyMecanimSMController : StateMachineBehaviour
{
    public MecanimStateData CurrentState;

    public void OnMyStateEnterCompleted()
    {
        if (CurrentState!= null)
            Debug.Log(CurrentState.Name);
    }
}
 


Пишем класс для стейта:
Синтаксис:
Используется csharp
public class MecanimStateData : StateMachineBehaviour
{
    public string Tag;
    public string Name;

    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        var fsm = animator.GetBehaviour<MyMecanimSMController>();
        fsm.CurrentStateData = this;
    }

    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        var fms = animator.GetBehaviour<MyMecanimSMController>();
        fms.OnMyStateEnterCompleted();
    }
}
 

Вешаем на каждый стейт и указываем Tag и Name.

Теперь можно через аниматор получить в коде нужные данные.
Синтаксис:
Используется csharp
var fsm=GetComponent<Animator>().GetBehaviour<MyMecanimSMController >();
var stateName = fsm.CurrentState.name;
 

Также можно наоборот - в класс для стейт-машины передать ссылку на объект. Тогда можно будет с ним работать в StateMachineBehaviour компонентах.



Помогло,спасибо большое
ogrefifas
UNец
 
Сообщения: 6
Зарегистрирован: 17 мар 2015, 04:28


Вернуться в Почемучка

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24