Wpis z mikrobloga

Pytanie dotyczące new input system. Kompletnie nie kminie. W ogóle nie jest to logiczne.

Mamy te trzy stany started, performed i canceled. Pierwszy i trzeci, spoko, prostota. Ale performed, a szczególnie, żeby zrobić stan "hold" z interakcji to jakaś czarna magia.

Performed wykonuje się razem ze started. Jaki jest tego sens?
Ustawienie w "interactions" press point lub hold na więcej niż 1 powoduje, że wciśnięcie przycisku nic nie robi. Mimo, że jest napisane wprost, że to jest wartość w sekundach. Dodatkowo można tam przesunąć albo wpisać wartość na minusie. WTF?

Wyszukałem w końcu jak rzekomo sprawdzić stan hold, tj.

if (context.interaction is HoldInteraction)
{
Debug.Log(context.interaction);
}

I zwraca true w każdym stanie tj. started, performed i canceled. WTF?

To jest tak zbugowane czy ja czegoś nie rozumiem? Bo co chcę zrobić:

controls.Gameplay.Jump.started += OnJump;
controls.Gameplay.Jump.performed += OnJump;
controls.Gameplay.Jump.canceled += OnJump;

private void OnJump(InputAction.CallbackContext context)
{
int value = Convert.ToInt32(context.ReadValue());

if (context.interaction is HoldInteraction)
{
jumpInputEvent.Invoke(value, true);
}
else
jumpInputEvent.Invoke(value, false);

// wcześniej próbowane przez phase, no, ale performed robi tuż za startem:

if (context.phase == InputActionPhase.Performed)
{
jumpInputEvent.Invoke(value, true);
}
else
jumpInputEvent.Invoke(value, false);
}

I jak można się domyślać co bym nie robił to przekazuje wartość true. Wszystko związane z ruchem postaci mam zrobione za pomocą started i canceled, gdzie hold jest do momentu wejścia canceled. Ale w tym jednym przypadku potrzebuje hold przez określony czas nim tym holdem się stanie

#unity3d
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@DanteTooMayCry:
When listening for control input and when responding to control value changes, actions will go through several possible phases.

In general, when an action starts receiving input, it will go to Started and when it stops receiving input, it will go to Canceled. When Performed is used depends primarily on the type of action. Value will trigger Performed whenever the value of the control changes (including the first time; i.e.
  • Odpowiedz
@zibizz1: ActionType dla JumpButton mam ustawiony na "button", nie "value".

whereas Button will trigger Performed as soon as the button press threshold () has been crossed.


Chyba, że źle rozumiem ten fragment. To jest, wydaje mi się, że powinno aktywować, gdy w interactions przekroczony zostanie czas ustawiony w "hold time". Tymczasem zachowuje się tak jak z opisem "value'
  • Odpowiedz
@zibizz1: No akurat testuje na klawiaturze. Nie wiem czy odbiera poziom wciśnięcia, ale próbowałem bardzo lekko i nic to nie zmieniało.

No to bug unity. Ale to hold, a czemu performed przy button wykonuje się za started?
  • Odpowiedz