Przekazanie adresu funkcji? Samej funkcji?

Odpowiedz Nowy wątek
2016-06-13 00:15
0

Witam,

Temat być może nie sugeruje wszystkiego ale już tłumaczę o co mi chodzi. Otóż programuję sobie coś tam na unity w C# i już od dłuższego czasu męczy mnie jeden duży problem. Otóż przydałaby się mechanizm który uruchomi daną funkcję po upływie jakiegoś określonego czasu. Dzisiaj postanowiłem zabrać się za temat i stworzyć taki mechanizm. Ale czy w ogóle jest to możliwe? Myślałem o tym aby stworzyć funkcję w której będę podawał jako parametr czas jaki ma upłynąć, a drugim parametrem będzie - właśnie - co? Adres w pamięci do funkcji? Jakiś rodzaj referencji? Czy jakiś ogólny typ zmiennej, gdzie wystarczy, że podam nazwę funkcji? (Czy dobrze myślę o typie Action). No tutaj się już gubię. Jeśli to pierwsze rozwiązanie - to czy istnieje sposób na przekazanie adresu funkcji jako parametr, a potem jej wywołanie. Jeśli ten drugi to potem jaką tą funkcję wywołać? A jeśli trzeci to zastanawiam się jaki to typ zmiennej musiałby być. Moja niewiedza wynika być może z małego doświadczenia, albo czegoś gdzieś nie doczytałem. Nie chcę abyście posądzili mnie o lenistwo. Po prostu chcę się nauczyć czegoś nowego. Być może też jest już taki mechanizm czy to w samym C# czy unity C# - a ja wymyślam koło na nowo. Oczywiście nie proszę was o gotowe rozwiązania. Jeśli takie się pojawi - super, ale jeśli nie - a chociaż jakieś naprowadzenie czy uświadomienie mnie w jakiś kwestiach - też będę jak najbardziej zadowolony.

Aha - sam upływ czasu zazwyczaj robię w funkcji rodzaju IEnumerator, ale wywołuje StartCoroutine w "normalnej" funkcji void.
Podam przykład zwykłego odmierzania czasu - przy okazji czy robię to okej? W sumie mogę też użyć yield return new WaitForSeconds(Timer) - to chyba nawet będzie wydajniejsze:

void StartFunctionOnTheTime( float Timer )
{
    StartCoroutine( IE_StartFunctionOnTheTime( Timer ) );
}

IEnumerator IE_StartFunctionOnTheTime( float T )
{
   float tempTime = T;
   while( T >= 0 )
   {
       tempTime -= Time.deltaTime;
       yield return 0;
   }
}

lub z użyciem WaitForSeconds() - tak dla przykładu:

void StartFunctionOnTheTime( float Timer )
{
    StartCoroutine( IE_StartFunctionOnTheTime( Timer ) );
}

IEnumerator IE_StartFunctionOnTheTime( float T )
{
    yield return new WaitForSeconds(T).
}

A teraz wymarzony obraz jakby miała działać moja funkcja. "Adres" - to właśnie to, czego nie wiem - co tutaj być powinno czy wcześniej wyrażenie ref, czy może & albo też jakiś typ... pisałem o tym wyżej.

void StartFunctionOnTheTime( float Timer, Adres Func )
{
    StartCoroutine( IE_StartFunctionOnTheTime( Timer, Func ) );
}

IEnumerator IE_StartFunctionOnTheTime( float T, Adres F )
{
    yield return new WaitForSeconds(T).
    F.Run(); // tutaj oczywiście wymyślam - to taka "wizualizacja"
}

Mam nadzieję, że wiadomo o co mi chodzi. Czekam na ciekawe informacje, rozważania (albo też krótką odpowiedź bo pewnie można to łatwo zrobić xD).

Z góry dziękuje,
Pozdrawiam

Pozostało 580 znaków

2016-06-13 07:30
1

Nie naszukałeś się za bardzo.
Choćby i najprostsze c# pointer to function wpisane w Google pokazuje niemałą liczbę rezultatów.


Pozostało 580 znaków

2016-06-13 07:57
0

Chyba popełniłem prosty błąd w szukaniu informacji - zamiast w Google w angielskich wątkach, szukałem w tych polskich. Tam też troszkę ich wyskoczyło, ale widocznie nie zawierały tego co chciałem. Wczoraj troszkę nie do zycia i spanikowalem i utworzylem ten wątek na forum. Domyślam się, że resztę robię dobrze i jest sposób na przekazanie adresu funkcji jako parametr funkcji - pewnie bardzo prosty. Poczytam angielskie wątki i następnym razem za nim coś napiszę to jak najbardziej wcześniej dokonam konkretniejszego researchu. Wczoraj za nim też poszedłem spać to myślałem nad tym - także w głowie coś tam świta. Dzięki za reakcje na wątek i pozdro.

Pozostało 580 znaków

2016-06-13 12:12

A nie łatwiej użyć MonoBehaviour.Invoke ?

Pozostało 580 znaków

2016-06-13 13:46
0

@tajny_agent - mistrz! O to mi dokładnie chodziło. Czułem, że jest już taka funkcjonalność. Ha! Pewnie moja wina bo słabo szukałem, ale o to też mi chodziło - propozycja, naprowadzenie - a z resztą sobie sam poradzę. Jednak też dostałem gotowe rozwiazanie ale i tak o tym poczytam :). Raz jeszcze dzieki za reakcje i pomoc. Pozdrawiam

TEMAT DO ZAMKNIĘCIA

Tu się nie zamyka tematów. Jeśli uważasz, że ktoś Ci pomógł, to oznacz jego post jako zaakceptowany poprzez kliknięcie "fajki" przy jego poście (jest pod kciukiem). - somekind 2016-06-13 14:18

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0