W tej części skupię się nad pobocznym projekcikiem związanym z ruchem kuli po obliczonej trajektorii. Projekt ten został stworzony z myślą o przetestowaniu kolejnej metody ruchu kuli. Kod jest nie co zagmatwany i często się duplikuje, jako, że to poligon doświadczalny uznałem że taka praktyka w tym kontekście jest dopuszczalna.

Założenia

Głównym założeniem było tak jak wspominałem wyżej użycie metody pozwalającej poruszyć obiekt po obliczonej trajektorii. Za przykład posłużył tutorial  w którym autor renderował linie pomocnicze.

Ja przerobiłem kod, tak aby można było poruszać obiekt. W moim przypadku obiektem jest kula. Ostatecznym sprawdzianem poprawności kodu, miało być jego podłączenie do projektu z katapultą. Na tę chwilę nie jest to jeszcze możliwe gdyż nie są spełnione wszystkie warunki, zakładane na początku. Jednym z nich oprócz samego ruchu kuli i ustawiania parametrów prędkości i kąta, jest możliwość „strzelania na boki”. Czyli nie po jeden j osi. Co jak sądzę będzie związane z przerobieniem wzorów i z dodatkowymi obliczeniami trajektorii lotu.

Rozwiązanie

Poniżej znajduje się rozwiązanie podstawowego problemu czyli ruchu kuli po wyznaczonej trajektorii.

Linie zaczynające się od Debug są pomocniczymi  wyświetlaczami tekstu w konsoli unity.

Kod składa się z kilku metod:

  • CalculateArcOneVector – która zwraca Vector3, a za parametr przyjmuje czas typu float,
  • AngleToRadian – metoda klasy statycznej służąca to konwersji kąta podanego w stopniach na radiany,
  • MaxDistance – metoda oblicza maksymalny dystans parametrami są przyśpieszenie, kąt w radianach oraz przyśpieszenie ziemskie,
  • CalculateArcPoint – metoda oblicza trajektorie lotu oś y oraz z, zwraca Vector3. Parametry to czas, maksymalny dystans, jedna z części dystansu

Parametry takie jak prędkość i kąt są ustawiane w kodzie. Dopiera kolejna wersja tej metody będzie miała możliwość w prowadzenia z zewnątrz tych dwóch parametrów.

Linie pomocnicze

Poniższy kod został zaczerpnięty z tutoriala służy do wygenerowania linii pomocniczych.

Na jego podstawie został stworzony kod z poprzedniego rozwiązania. Ten kod czerpie dane z właściwości klasy co nie jest docelowym rozwiązaniem. Kod został przeze mnie przerobiony by czerpać dane z zewnątrz.

Parametry velocity i angle ustawiane są za pomocą strzałek :

  • LeftArrow i RightArrow – ustawia parametr angle w przedziale 1 do 89 (typ float)
  • UpArrow i DownArrow – ustawia parametr velocity w przedziale 1 do 100 (typ float)

Tu pojawia się pierwszy problem, linia nie renderuje się we właściwy sposób.  Problem ten oczekuje na rozwiązanie.

Parametry

Parametry takie jak Velocity i Angle ustawiane są (będą) za pomocą przycisków (strzałek). W założeniu miał to być  ruchomy cel ale zdałem sprawę, że to nie takie proste. Aktualnie ruchomy cel znajduje się pod „podłogą”. Za pomocą strzałek generuje wartości dla parametrów Velocity i Angle. Kod poniżej.

Strzałki lewa i prawa poruszają do przodu i do tyłu obiektem (celem w założeniach), przy okazji zmieniają wartość parametru Angle (kąt).

Strzałki góra , dół zmieniają  parametr Velocity.

Klasy statyczne

Klas statycznych unikałem jak ognia. Jednak klasy tego typu są czasami przydatne. Należy tylko odpowiednio je zastosować. W moim przypadku  słuaą do obliczeń, czyli nie zmieniają stanu obiektu a jedynie przekształcają wartość.

Wydaje mi się, że zastosowanie w tym miejscu klas statycznych jest jak najbardziej uzasadnione.

Interfejsy

Ostatnio się dowiedziałem, że jestem juniorem. Lubie interfejsy, używał bym ich wszędzie. Odkąd poznałem SOLID-a i piąta zasadę interfejsy stały się odpowiedzią na większość moich bolączek. W unity też musiałem je zastosować

Jak widać do obliczeń maksymalnego dystansu oraz czasu lotu. Kiedy warto zastosować interfejs? Oczywiście zawsze ;-), ja używam jak chcę wydzielić pewną logikę która nie pasuje mi do reszty ( uprościć kod). Po za tym dzięki temu interfejsowi mogę w późniejszym czasie podmienić wzory na obliczanie maksymalnego dystansu i czasu lotu, bez konieczności zmiany tego kodu. Dobre do testów.

Wskazówki

Nie widziałem jak się odwołać między klasami w unity, chociaż to „zwykły” C#.  W klasie ThrowBall_Line korzystam z właściwości klasy Target_script (angle i velocity) poprzez nowy obiekt klasy Target_script, który właściwością klasy ThowBall_line. Nie było by w tym nic dziwnego jakby nie ten zapis

Powyżej w metodzie Start przypisuje wartość obiektowi klasy Target_script. Na znalezienie tego rozwiązania chwile czasu straciłem.

Wnioski

Przede mną jeszcze sporo pracy. Chwilowo odpuściłem Unity na rzecz czegoś innego. Ten post ma za zadanie wzmocnić moją pamięć i być kolejnym dobrym startem w te środowisko.

Do zarobienia pozostała:

  • Zamiana metody CalculateArcOneVector w klasie Balistic_Calculation aby mogła przyjmować parametry  z zewnątrz.
  • Zmierzenie się z możliwością wyrzucania kuli nie tylko po linii osi Z ale również X. Czyli nie co więcej obliczeń.
  • Zmiana sposobu „strzelania” ( teraz jest nie co kłopotliwy).
  • Wyświetlanie danych odnośnie parametrów Angle i Velocity oraz parametrów wyrzucanego obiektu (ten punkt jest najłatwiejszy).

Także trochę pracy zostało.

Linki:

Kategorie: Unity