UI button przytrzymaj - C# (unity)


#1

macie może gotowy skrypt na taką okazje?
mam jakąś wartość i buttony: + plus i - minus; klikam raz w któryś to jest zmiana wartości +1 lub -1; ale klikam i trzymam wciśnięty button to mam zmianę o 1 ale coraz szybciej. W sensie że im dłużej trzymam wciśnięty przycisk tym szybciej następuje zmiana wartości i puszczenie go na chwile to reset i szybkość naliczania się restartuje.


#2

TwojaKlasa : Monobehaviour -> dodaj ,IPointerDownHandler , IPointerUpHandler

Pozniej zaimplementuj funckje np :

public void OnPointerDown(PointerEventData eventData) 
{
if(!isCounting)
   isCounting = true;
}

public void OnPointerUp(PointerEventData eventData)
{
    isCounting = false;
    //tutaj tez reset
}

a w update dajesz zliczanie w zaleznosci czy jest counting czy nie.

Mozesz sie pobawic i rozszezyc Button i dorobic onPointerDown i Up. Wtedy beda widoczne w inspektorze tak jak OnClick.
Niestety Unity ma tylko OnClick domyslnie.


#3

w sensie chodzi ci o to ze czym dluzej trzymiesz to wartość rośnie szybciej niż liniowo to ja bym pobieral bool z inputu w Update() i przekazywal go do funkcji w fixedUpdate na poczatek gdzie tamta funkcja spr czy wcisniety klawisz? jesli tak cout+= wartosc;
wartosc po kazdej klatce nie wiem mozna wartosc pomnozyc przez 1,01 gdzie po 4 sek trzymania powinno dodawac po 5 6 zamiast 1 no i jesli przycisk jest puszczony ustawiasz wartosc na domyslna czy dla tego przycisku 1 tamten -1


#5

Albo poprstu dodac easing F(t) = jakas funkcja “easingujaca” od “t” (czy jak to tam nazwac)…
Dajesz jako parametr jak to ma rosnac.
W ten sposob nie bedzie to liniowe + bedziesz mogl sobie okreslac jak to ma sie zwiekszac. sinOut sinIn etc etc…


#6

Dzięki panowie!

RoboCat, IPointerDownHandler , IPointerUpHandler nie znałem i własnie tego szukałem. Połączyłem to z drugim boolem, który zmienia się na true gdy wykona się coroutyna zawierająca opoznienie; wtedy incrementacja, bool na false i znow start coroutyny z większym opoznieniem.

Działa spoko. :smiley:


#7

ja bym ominal coroutine, dal calosc w Update z jednym boolem + zmienna i time.DeltaTime, no i oczywiscie OnPointerUp/Down. + udziwnienia jezeli potrzebne.
W coroutinie pewnie dajesz yield return wait for seconds?
Jak tak to dam ci rade -> zawsze jak uzywasz wait for seconds to zainicjuj to najpierw jako zmienna.
np na poczatku skryptu WaitForSeconds opoznienie; a pozniej gdzies opoznienie = new waitforseconds(czas) zamiast yield return new WaitForSeconds(czas);
bardzo poprawia to wydajnosc w unity.
No i coroutines produkuja duzo smieci -> ostatnio inicjowalem troche obiektow w coroutine wlasnie i mialem 7.5mb GC…


#8

cenna uwaga, nie wiedziałem o tym. Dzięki!