Страница 1 из 2

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

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

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

СообщениеДобавлено: 25 июл 2019, 21:22
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/ - про векторные переменные но суть не меняется....

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

СообщениеДобавлено: 25 июл 2019, 23:09
waruiyume
Richi16, код в студию!
Jarico, это вы к чему вообще?

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

СообщениеДобавлено: 02 авг 2019, 18:48
Richi16
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.

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

СообщениеДобавлено: 02 авг 2019, 18:54
Richi16
Для полного понимания сейчас сделаю видео.

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

СообщениеДобавлено: 02 авг 2019, 19:00
waruiyume
Из того, что сразу бросается в глаза "x != 0 || y != 0" float так не сравнивают.

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

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

Вот как это выглядит. Жду скорой помощи!

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

СообщениеДобавлено: 02 авг 2019, 19:09
AngryCat
Блокируй движение влево, если нажато право и наоборот.

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

СообщениеДобавлено: 02 авг 2019, 19:16
Richi16
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/ - про векторные переменные но суть не меняется....

Спасибо за ссылки с объяснениями, но это немного не то что нужно... Но подойдет для другого использования!

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

СообщениеДобавлено: 02 авг 2019, 19:22
AngryCat
AngryCat писал(а):Блокируй движение влево, если нажато право и наоборот.

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

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

СообщениеДобавлено: 07 авг 2019, 11:37
Richi16
AngryCat писал(а):
AngryCat писал(а):Блокируй движение влево, если нажато право и наоборот.

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


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


Можно попробовать и такое. Спасибо за совет!

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

СообщениеДобавлено: 07 авг 2019, 12:28
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.

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

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

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

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

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

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

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

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

И чо? У миксера задача миксить, а не обрабатывать пользовательский ввод.

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

СообщениеДобавлено: 07 авг 2019, 12:57
Richi16
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 писал(а):Блокируй движение влево, если нажато право и наоборот.

Я подумал и не понял как это сделать если у меня движение работает на осях. Я даже не понимаю как можно сказать программе что если нажато влево не идти вправо. Есть идеи?