Нажатие влево и вправо с промежутком GetAxis

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

Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 25 июл 2019, 20:33

Здравствуйте! Столкнулся с проблемой:
"x = CrossPlatformInputManager.GetAxis("Horizontal")"
При нажатии влево и после вправо с промежутком в четверть секунды, то числа которые поднимаются по X от 0 до 1 застревает в промежутке, по итогам портится анимация и многое другое. Или же если нажать влево затем вправо то застрянет в промежутке X от 0 до -1. Как предотвратить данную проблему? К примеру что бы при нажатии влево после того как первой была нажата вправо, персонаж шел влево и числа не застревали...
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Jarico 25 июл 2019, 21:22

Синтаксис:
Используется csharp
Mathf.Lerp

https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html
https://poqxert.ru/blog/unity/tutorials/matematika/matematika-unity-urok-9-mathf-interpolyaczii
https://habr.com/ru/post/318046/ - про векторные переменные но суть не меняется....
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение waruiyume 25 июл 2019, 23:09

Richi16, код в студию!
Jarico, это вы к чему вообще?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 02 авг 2019, 18:48

waruiyume писал(а):Richi16, код в студию!

Код огромный... Вставлю только тот момент где именно это используется... Хотя я даже не понимаю что
Синтаксис:
Используется csharp
 private Vector2 GetInput()
        {
           
            Vector2 input = new Vector2
                {
                    x = CrossPlatformInputManager.GetAxis("Horizontal"),
                    y = CrossPlatformInputManager.GetAxis("Vertical")
                   
                };
                        movementSettings.UpdateDesiredTargetSpeed(input);
            return input;
        }
         
        public void UpdateAnimation(float x , float y)
        {
 //if not crouch or jump and not stay on one place
        if(Grounded_m == true && Crouch_m == false && x != 0 || y != 0)
        {
        otheranim.SetBool("Forward_m", true);
        }
}

 

Код слишком простой и не вижу ничего что может вам помочь в решении...
Система x = CrossPlatformInputManager.GetAxis("Horizontal"), y = CrossPlatformInputManager.GetAxis("Vertical") используется изначально стандартно в Unity для определения перемещения по ОСИ X и Y.
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 02 авг 2019, 18:54

Для полного понимания сейчас сделаю видео.
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение waruiyume 02 авг 2019, 19:00

Из того, что сразу бросается в глаза "x != 0 || y != 0" float так не сравнивают.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 02 авг 2019, 19:04


Вот как это выглядит. Жду скорой помощи!
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение AngryCat 02 авг 2019, 19:09

Блокируй движение влево, если нажато право и наоборот.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 02 авг 2019, 19:16

Jarico писал(а):
Синтаксис:
Используется csharp
Mathf.Lerp

https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html
https://poqxert.ru/blog/unity/tutorials/matematika/matematika-unity-urok-9-mathf-interpolyaczii
https://habr.com/ru/post/318046/ - про векторные переменные но суть не меняется....

Спасибо за ссылки с объяснениями, но это немного не то что нужно... Но подойдет для другого использования!
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение AngryCat 02 авг 2019, 19:22

AngryCat писал(а):Блокируй движение влево, если нажато право и наоборот.

Ах да, совсем забыл, для этого нужно перейти в Edit -> Project Settings -> Input -> Horizontal и там галку на Invert поставить (popcorn1) (popcorn1) :ymparty:
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 07 авг 2019, 11:37

AngryCat писал(а):
AngryCat писал(а):Блокируй движение влево, если нажато право и наоборот.

Ах да, совсем забыл, для этого нужно перейти в Edit -> Project Settings -> Input -> Horizontal и там галку на Invert поставить (popcorn1) (popcorn1) :ymparty:


Не понимаю зачем нужно это если иначе все будет двигаться наоборот?
AngryCat писал(а):Блокируй движение влево, если нажато право и наоборот.


Можно попробовать и такое. Спасибо за совет!
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение IDoNotExist 07 авг 2019, 12:28

Richi16 писал(а):Код огромный... Вставлю только тот момент где именно это используется... Хотя я даже не понимаю что
Синтаксис:
Используется csharp
 private Vector2 GetInput()
        {
           
            Vector2 input = new Vector2
                {
                    x = CrossPlatformInputManager.GetAxis("Horizontal"),
                    y = CrossPlatformInputManager.GetAxis("Vertical")
                   
                };
                        movementSettings.UpdateDesiredTargetSpeed(input);
            return input;
        }
         
        public void UpdateAnimation(float x , float y)
        {
 //if not crouch or jump and not stay on one place
        if(Grounded_m == true && Crouch_m == false && x != 0 || y != 0)
        {
        otheranim.SetBool("Forward_m", true);
        }
}

 

Код слишком простой и не вижу ничего что может вам помочь в решении...
Система x = CrossPlatformInputManager.GetAxis("Horizontal"), y = CrossPlatformInputManager.GetAxis("Vertical") используется изначально стандартно в Unity для определения перемещения по ОСИ X и Y.

Привязывать анимацию напрямую к инпуту - это так себе решение. Инпут должен скармливаться в скрипт - контроллер анимаций, который будет плавно менять состояние анимаций от текущего к целевому.

Судя по видео проблема вообще в рассинхронизации физического контроллера и контроллера анимаций, в этом случае анимации вообще нужно привязывать к скорости физ. контроллера, а физ контроллер в свою очередь должен принимать и обрабатывать инпут.
Последний раз редактировалось IDoNotExist 07 авг 2019, 12:39, всего редактировалось 2 раз(а).
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение TheMamont 07 авг 2019, 12:31

Привязывать анимацию напрямую к инпуту - это так себе решение. Инпут должен скармливаться в скрипт - контроллер анимаций, который будет плавно менять состояние анимаций от текущего к целевому.

В юнити же уже есть миксер анимаций, разве нет?
TheMamont
UNITрон
 
Сообщения: 198
Зарегистрирован: 21 мар 2019, 09:00

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение IDoNotExist 07 авг 2019, 12:50

TheMamont писал(а):
Привязывать анимацию напрямую к инпуту - это так себе решение. Инпут должен скармливаться в скрипт - контроллер анимаций, который будет плавно менять состояние анимаций от текущего к целевому.

В юнити же уже есть миксер анимаций, разве нет?

И чо? У миксера задача миксить, а не обрабатывать пользовательский ввод.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Нажатие влево и вправо с промежутком GetAxis

Сообщение Richi16 07 авг 2019, 12:57

IDoNotExist писал(а):
Richi16 писал(а):Код огромный... Вставлю только тот момент где именно это используется... Хотя я даже не понимаю что
Синтаксис:
Используется csharp
 private Vector2 GetInput()
        {
           
            Vector2 input = new Vector2
                {
                    x = CrossPlatformInputManager.GetAxis("Horizontal"),
                    y = CrossPlatformInputManager.GetAxis("Vertical")
                   
                };
                        movementSettings.UpdateDesiredTargetSpeed(input);
            return input;
        }
         
        public void UpdateAnimation(float x , float y)
        {
 //if not crouch or jump and not stay on one place
        if(Grounded_m == true && Crouch_m == false && x != 0 || y != 0)
        {
        otheranim.SetBool("Forward_m", true);
        }
}

 

Код слишком простой и не вижу ничего что может вам помочь в решении...
Система x = CrossPlatformInputManager.GetAxis("Horizontal"), y = CrossPlatformInputManager.GetAxis("Vertical") используется изначально стандартно в Unity для определения перемещения по ОСИ X и Y.

Привязывать анимацию напрямую к инпуту - это так себе решение. Инпут должен скармливаться в скрипт - контроллер анимаций, который будет плавно менять состояние анимаций от текущего к целевому.

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


Моя анимация работает на числах передвижения по оси X и Y. Это все происходит магическим образом в Blend tree. Вопрос был в том, как не дать системе GetAxis("Horizontal") не застревать если нажать влево и вправо одновременно.
AngryCat писал(а):Блокируй движение влево, если нажато право и наоборот.

Я подумал и не понял как это сделать если у меня движение работает на осях. Я даже не понимаю как можно сказать программе что если нажато влево не идти вправо. Есть идеи?
Richi16
UNец
 
Сообщения: 32
Зарегистрирован: 22 июн 2019, 23:53

След.

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

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

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