Как запустить анимацию по клику в Unity?

522
29 июня 2018, 23:00

Есть 4 вида анимации для меню, созданы с помощью Anitamor в Unity

   anim1 (снизу в центр)
   anim2 (из центра вверх)
   anim3  верха в центр)
   anim4 (из центра вниз)

Первой пункт я уже сделал

1) анимация запускается, когда открываешь игру, главное меню выезжает снизу в центр

2) нужно сделать чтобы при клике, когда нажимаешь клавишу Options главное меню ехало вверх, а снизу в центр выезжало меню Options

3) Когда в Options нажимаешь Back опции должны ехать вниз, а сверху выезжает Главное меню

Как это реализовать в виде кода?

Answer 1

1.Если у вас через animation,то запускаем анимацию движения вверх по клику.

2.Если не через animation,то просто position меняем == двигаем вверх по оси по нажатию мыши за пределы видимости камеры и все.

официальная доументация

https://unity3d.com/ru/learn/tutorials/s/user-interface-ui

официальный ролик о кнопках

здесь вся нужная инфа

https://unity3d.com/ru/learn/tutorials/topics/user-interface-ui/ui-button?playlist=17111

UPD: часть 2.Код.

  • создаете новый скрипт

  • добавляете скрипт на canvas

    public GameObject optionButton; // перетащить сюда кнопку
    public Animator m_Animator;  // перетащить сюда аниматор кнопки
    void Start()
    {
        m_Animator = GetComponent<Animator>();  
        optionButton.onClick.AddListener(goAnim);  
    }

    void goAnim() { m_Animator.Play("Name_your_anim"); }

Answer 2

Давайте опишу структуру и общую логику :)

Для того, чтобы сделать вышеописанное у вас должны быть две панели-объекта. На каждой панели должен висеть собственный скрипт панели (например MenuPanel и OptionPanel) и Animator Contoller со своим аниматором.

Для каждой панели у вас должен быть создать свой аниматор со своими состояниями. В аниматоре из состояния enter переход в состояния Hide из Hide в Show из Show в Idle. Из Idle обратно в Hide. Из состояния Hide в Show переход по триггеру Show и Idle в Hide по триггеру Hide. В сами эти состояния должны быть назначены нужные вам анимации (снизу в центр, из центра вверх и т.д. смотря, что вам нужно на панели, а в Idle - просто включение объекта панели, чтобы состояние не было пустым).

Можно создать вообще один аниматор - PanelAnimator, а потом добавлять перегруженные (override) (в них нужно перетащить тот, который будете менять и перетащить анимации, которые нужно заменить - с ним не придётся ещё раз настраивать связи).

У панелей должны быть специальные методы дли управления их показом или можно вообще сделать свойством. Например, такой вариант:

    [SerializeField]
    Animator _animator;
    public bool Visible
    {
        set
        {
            string trigger = value ? "Show" : "Hide";
            _animator.SetTrigger(trigger);
        }
    }

Здесь в сеттере проверяется какое значение нам пришло, если false - выбирается левая строчка, если true, то, соответственно - правая. Затем эта строчка отправляется в аниматор, как триггер. А аниматор уже скрывает или показывает панель.

Соответственно, чтобы скрыть меню и показать настройки вам нужно будет сделать что-то вроде следующего:

    [SerializeField]
    MenuPanel _menuPanel;
    [SerializeField]
    OptionsPanel _opntions;
    void ClickReaction()
    {
        _menuPanel.Visible = false;
        _opntions.Visible = true;
    }

Ну, а как вы там получите доступ к экземплярам панели - это уже вопрос вашей архитектуры)

Это не лучший вариант организации UI, но реализует то, о чем вы спросили.

Соответственно, можете из панели Настроек подписаться на событие нажатия кнопки Option в панели Menu. И когда она будет нажата - вызвать метод, который выше я назвал ClickReaction.

Либо, вы можете в полях самой кнопки назначить, что она должна вызвать и у какой панели.

READ ALSO
Преобразование штрих-кода в строку c#

Преобразование штрих-кода в строку c#

В общем я программно обрабатываю документы *xlsx и из нужных полей вынимаю нужные мне данные

221
Spawn клиента при подключении к серверу C# Unity3d

Spawn клиента при подключении к серверу C# Unity3d

Необходимо было сделать spawn игроков в Canvas через UnityNetworkРеализовал это следующим образом:

188
Требуется имя метода C#

Требуется имя метода C#

Помогите, пожалуйста, исправить ошибку, ошибка в rnd

606