Portal informacji o bezpieczeństwie. Piszemy Arkanoid na Unity

Leki przeciwgorączkowe dla dzieci są przepisywane przez pediatrę. Ale zdarzają się sytuacje awaryjne dotyczące gorączki, kiedy dziecko musi natychmiast otrzymać lekarstwo. Wtedy rodzice biorą na siebie odpowiedzialność i stosują leki przeciwgorączkowe. Co wolno dawać niemowlętom? Jak obniżyć temperaturę u starszych dzieci? Jakie leki są najbezpieczniejsze?

Jedność- bardzo mocny, progresywny silnik o dużym potencjale. Posiada wiele wbudowanych funkcji (w tym silnik fizyki) Nvidia PhysX), których my, użytkownicy, nie musimy ręcznie rejestrować. :)
W tym krótkim artykule chciałbym omówić fizyczne możliwości silnika. Zacznijmy więc:

Sztywny korpus

Co to jest?

Za funkcją Sztywny korpus Ukrywanie całkowicie sztywnej bryły ( ATT). Jeśli wyjaśnisz to z grubsza i jasno, to ATT w fizyce i mechanice jest to idealne ciało sztywne, które pod wpływem siły nie może zmienić swoich właściwości, ale może (pod jej wpływem) poruszać się w 3 wymiarach (w dół, w górę, do przodu itp., czyli w naszych osiach X-Y-Z ), a także obracać się w 3 wymiarach (ponownie wzdłuż osi X-Y-Z).

W Jedność, podobnie jak w innych silnikach gier (znowu nazywam je z grubsza silnikami „gry”), Sztywny korpus służy do różnych przedmiotów, z którymi możemy wchodzić w interakcję poprzez popychanie, kopanie itp. Takie obiekty pod naszym wpływem będą nadal toczyć się, poruszać i zderzać z innymi obiektami pod wpływem grawitacji.

Jakie zastosowanie możemy znaleźć dla tej funkcji?

Na przykład, aby stworzyć samochód, oprócz Sztywny korpus potrzebujemy Zderzacz na 4 koła"i i kod (scenariusz) , który przykłada siłę do kół w zależności od naciskanych klawiszy.

Konfigurowalne funkcje

  • Masa- Masa naszego obiektu w kilogramach. Zaleca się nie ustawiać wartości mas 100 razy większych lub mniejszych niż masy innych ATT.
  • Ciągnąć- Na ile ciało podlega oporowi powietrza, gdy porusza się pod wpływem sił. Z wartością 0 nie ma oporu, a nieskończona wartość natychmiast zatrzyma nasz obiekt.
  • Przeciąg kątowy- Na ile ciało podlega oporowi powietrza, gdy obraca się pod wpływem sił. Z wartością 0 nie ma oporu, a nieskończona wartość natychmiast zatrzyma obrót naszego obiektu.
  • Powaga- Po włączeniu na obiekt działa grawitacja.
  • jest kinematyczny- Po włączeniu obiekt nie ma wpływu na silnik fizyki i może być modyfikowany tylko przez jego funkcję Przekształcać. Może to być przydatne na przykład przy tworzeniu ruchomych platform.
  • Interpolować- Ma zastosowanie tylko wtedy, gdy ruchy twojego ATT wydają ci się dziwne lub niezdarne, itp.:
    1. Nic: Nie zastosowano interpolacji
    2. interpolować: W porównaniu z przekształceniem poprzedniej klatki ( rama), następna zostanie wygładzona.
    3. ekstrapolować: Transformacja bieżącej klatki jest wygładzana w porównaniu z szacowaną (przybliżoną) transformacją następnej.
  • Zamrożenie rotacji- Wyłącza rotację, zarówno skryptową, jak i kolizyjną. Jednak rotację można wykonać za pomocą funkcji przekształć.Obróć()
  • Wykrywanie kolizji- Służy do zapobiegania przechodzeniu szybko poruszających się obiektów przez inne obiekty bez znajdowania kolizja"ov" (specjalna "siatka" na obiektach, które zderzają się ze sobą iz graczem).
    1. oddzielny: Domyślna wartość dla naszego obiektu, aby "zauważyć" wszystkie inne obiekty, z którymi może się kolidować.
    2. Ciągły: Posługiwać się Dyskretna kolizja z dynamicznymi obiektami kolizyjnymi (które mają ATT), a Ciągła kolizja dla statycznej MeshCollider„ow (bez ATT). Tryb Ciągła dynamika używa Ciągła kolizja dla jednego konkretnego ATT. Reszta ATT użyje trybu Oddzielny. (To znacznie wpłynie na obciążenie silnika fizyki, po prostu zostaw Oddzielny, jeśli nie ma problemów z kolizją szybkich obiektów)
    3. Ciągła dynamika: Używany do obiektów w trybie ciągły lub Ciągła dynamiczna kolizja. Ciągła kolizja będzie również używany do statycznego MeshCollider„ow (bez ATT). W przypadku wszystkich pozostałych używany jest tryb Oddzielny. Używany do szybko poruszających się obiektów.

Jak możemy wykorzystać tę funkcję?

Podstawowa wiedza.

Używać ATT, potrzebujemy już utworzonego obiektu gry ( Obiekt gry), klikając na nią, przechodzimy do menu następującą ścieżką: Komponenty - Fizyka - Rigidbody . Wszystko, ATT dodany! :)
Teraz obiekt podlega grawitacji, możesz zastosować do niego siły za pomocą skryptów, ale aby obiekt zachowywał się dokładnie tak, jak potrzebujesz, należy dodać zderzak lub wspólny.

Kod rządzi światem.

W skrypcie będziemy teraz manipulować naszym obiektem za pomocą funkcji Dodaj Siłę() oraz DodajMoment() .
Odkąd jestem w Jedność stosować JavaScript, moje przykłady będą z nim, linki do innych przykładów skryptów (at C# lub Gwizd) znajdziesz poniżej, w akapicie Dodatkowe informacje na temat ATT.

» Rigidbody.AddForce

// Rigidbody.AddForce wykorzystuje 2 rodzaje formuł, podobnie jak wiele innych funkcji związanych z ruchami w przestrzeni. // 1 typ: function AddForce (siła: Vector3, tryb: ForceMode = ForceMode.Force) : void // Siła, która wypycha obiekt w górę, względem globalnego układu współrzędnych. function FixedUpdate () ( fixedbody.AddForce (Vector3.up * 10); ) // Używając Vector3, wbudowanej funkcji Unity, która jest zasadniczo taka sama jak standardowy układ współrzędnych. // Drugi typ: function AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // To samo, ale używane tutaj System X-Y-Z współrzędne. funkcja FixedUpdate() ( fixedbody.AddForce(0, 10, 0); )

» Rigidbody.AddTorque

// Funkcja obraca obiekt wokół podanej osi. // 1 typ: function AddTorque (moment obrotowy: Vector3, tryb: ForceMode = ForceMode.Force) : void // Obraca klawisz ATT wokół globalnej osi Y. function FixedUpdate () ( fixedbody.AddTorque (Vector3.up * 10); ) // typ 2: funkcja AddTorque (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Robi to samo, ale znowu w innym systemie pomiarowym. funkcja FixedUpdate() ( fixedbody.AddTorque(0, 10, 0); )

ATT wchodzi w interakcję z obiektami.

Dla prawidłowego działania naszego ATT muszą być dostarczone zderzak„ami (lub kolizja"ami, jak proszę ^.^).
Przeczytaj więcej o zderzaczach poniżej.

Rozmiar ma znaczenie!

Obserwuj wymiary swojego obiektu, ponieważ są one znacznie bardziej znaczące nawet masa ATT. Jeśli twój obiekt porusza się nieprawidłowo, unosi się w powietrzu lub nie koliduje, spróbuj dostosować jego wielkość (nie ATT, ale sam obiekt). Podczas importowania modelu z edytora 3D jego wymiary są zachowywane, dlatego należy zachować ostrożność na etapie modelowania i przestrzegać wymiarów wszystkich modeli.

Dodatkowe informacje na temat ATT

Na ten temat opisz ATT lub Sztywny korpus Pewnie skończę. Jest jednak kilka wskazówek, szczególnie dla tych, którzy przeczytali do tej pory :)

  1. standardowy rozmiar kostki Jedność równa się 1 metr, dlatego bardzo wygodnie jest sprawdzić rozmiar swoich modeli za jego pomocą. Aby utworzyć kostkę, wybierz z menu GameObject - Utwórz inny - Cube
  2. Wskaźnik względny Masa określa, w jaki sposób dwa obiekty będą ze sobą współdziałać.
  3. Masa nie wpływa na prędkość spadania z wysokości, do tych celów należy używać Ciągnąć.
  4. Im wyższe wartości Ciągnąć tym więcej waży obiekt. standardowe wartości są różne od 0,001(solidny kawałek metalu) do 10(pióro).
  5. Jeśli potrzebujesz zmodyfikować obiekt zarówno za pomocą skryptów, jak i fizyki, dodaj do niego ATT z parametrem Kinematyczny.

Zderzacze

Co to jest?

W poprzedniej sekcji omówiliśmy, jak Sztywny korpus i wspomniał o tzw zderzacze. zderzak dla nas - obiekt pomocniczy w postaci siatki prostego prymitywu lub odwrotnie złożonego kształtu, który znajduje się wokół naszego modelu lub części modelu i współdziała z innymi obiektami, jeśli są również otoczone zderzaczami.
Aby jasno wyjaśnić ekspertom edytora świata *Warcraft 3*, wyobraźmy sobie model, który zaimportowaliśmy, do którego nie przypisaliśmy tekstur ścieżek w edytorze dudad - to będzie nasz obiekt; a rolę zderzaczy będą tu odgrywać blokery ścieżki wokół modelu. Oczywiście jest to dość zgrubne porównanie, ponieważ w Jedność są znacznie bardziej funkcjonalne. Cóż, przyjrzyjmy się bliżej.

Rodzaje zderzaczy.

Zderzacze są dodawane za pomocą menu Komponent - Fizyka . Istnieje kilka rodzajów:

  • Zderzacz pudełek- w formie sześcianu.
  • Zderzacz Sfer- w formie kuli.
  • Zderzacz kapsułek- w formie kapsułki.
  • Zderzacz siatki- automatycznie tworzy zderzacz zgodnie z kształtem siatki obiektu, nie może zderzać się z innymi zderzaczami tego samego typu. Używany głównie do obiektów statycznych, takich jak otoczenie toru wyścigowego.
  • Zderzacz kołowy- używany do kół, bardzo przydatna rzecz.
  • Zderzacz Mieszanek- kombinacje prymitywów, które razem działają jak jeden. Aby stworzyć tak złożony collider, musisz dodać obiekty podrzędne do naszego podstawowego collider'a i już z nimi powiązać za pomocą prymitywu. Na przykład proste zderzacze do samochodów są bardzo wygodnie wykonane.

Konfigurowalne funkcje

W zasadzie wszystkie zderzacze są do siebie podobne, służą tylko do obiektów o różnych kształtach, jednak mają kilka różnych parametrów.

  • Sześcian
    • materiał- Pokazuje, w jaki sposób zderzacz oddziałuje z innymi obiektami, przypisując fizyczny materiał, taki jak metal, lód itp.
    • Czy wyzwalacz- Jeżeli parametr jest włączony, to na obiekt ma wpływ skrypt, a nie fizyka.
    • rozmiar- Wielkość zderzacza wzdłuż osi X-Y-Z.
    • Środek- Pozycja zderzacza względem lokalnych współrzędnych obiektu.
  • Kula
    • Promień- Promień kuli zastępuje parametr rozmiar.
    • Pozostałe parametry pozostają niezmienione.
  • Kapsuła(parametry zastępują rozmiar)
    • Promień- Grubość kapsułki.
    • Wzrost- Wysokość cylindrycznej części zderzacza (bez zaokrąglonych podstaw).
    • kierunek- Kierunek zderzacza w stosunku do lokalnych współrzędnych obiektu.
  • Zderzacz siatki(parametry zastępują rozmiar)
    • siatka- Wybór żądanej siatki, aby stworzyć zderzacz.
    • Gładkie zderzenia sferyczne - Włączenie tej funkcji wygładza powierzchnię zderzacza. Powinien być stosowany na gładkich powierzchniach, np. pochyłym terenie bez zbytniej kanciastości, po którym kulki powinny się toczyć.
    • Wypukły- Po włączeniu pozwala naszemu zderzaczowi zderzać się z innymi zderzaczami. Zderzacz wypukłych siatek"ogranicza się do 255 trójkątów.
  • Zderzacz kołowy(parametry zastępują rozmiar)
  • Promień- Promień koła.
  • Odległość zawieszenia- Maksymalna odległość, aby zwiększyć zawieszenie koła. Zawieszenie zawsze zwiększa się wzdłuż lokalnej osi Tak.
  • Sprężyna zawieszenia- Zawieszenie próbuje dotrzeć do określonego punktu przy użyciu różnych sił.
  1. Spring:// Próbuje dotrzeć do określonego punktu (pozycji). Im wyższe ustawienie, tym szybciej jest osiągane.
  2. Damper:// Zmiękcza, spowalnia prędkość zawieszenia. Im wyższa wartość, tym wolniejszy ruch amortyzatora.
  3. Pozycja docelowa:// Pełna „ścieżka”, którą może „przebyć” zawieszenie. 0 oznacza w pełni rozciągnięty amortyzator, oraz 1 - całkowicie skompresowany. Domyślna wartość to 0, co odpowiada normalnemu zawieszeniu samochodu.
  • Masa- Masa koła.
  • Tarcie do przodu/boczne - Parametry tarcia dla prostego toczenia koła i toczenia się na boki (zdarza się to w poślizgach lub driftingu).


lubię +15 - 0

*Unity* to bardzo potężny, progresywny silnik o dużym potencjale. Posiada wiele wbudowanych funkcji (w tym silnik fizyki *NvidiaPhysX*), których my, użytkownicy, nie musimy ręcznie przepisywać. :)
W tym krótkim artykule chciałbym omówić fizyczne możliwości silnika. Zacznijmy więc:

Sztywny korpus
=
= Co to jest? =
Za funkcją *Rigidbody* kryje się Absolutely Rigid Body (*ATT*). Wyjaśniając z grubsza i jasno, *ATT* w fizyce i mechanice jest idealnym sztywnym ciałem, które pod wpływem siły nie może zmienić swoich właściwości, ale może (pod jej wpływem) poruszać się w 3 wymiarach (w dół, w górę, do przodu, itp.) itp., czyli w naszych osiach X-Y-Z), a także obracać się w 3 wymiarach (ponownie wzdłuż osi X-Y-Z).

W *Unity*, jak również w innych silnikach gier (ponownie nazywam je z grubsza silnikami "gry"), *Rigidbody* jest używany do różnych obiektów, z którymi możemy wchodzić w interakcje poprzez pchanie, kopanie itp. Takie obiekty pod naszym wpływem będą nadal toczyć się, poruszać i zderzać z innymi obiektami pod wpływem grawitacji.

Jakie zastosowanie możemy znaleźć dla tej funkcji? =
Na przykład, aby stworzyć samochód, oprócz *Rigidbody* potrzebujemy Zderzacz na 4 koła"a i *kod* (*skrypt*), który przykłada siłę do kół, w zależności od naciskanych klawiszy.

  • *Masa* - Masa naszego obiektu w kilogramach. Zaleca się, aby nie ustawiać wartości mas 100 razy większych lub mniejszych niż masy innych *ATT*.
  • *Drag* - Jak bardzo ciało podlega oporowi powietrza, gdy porusza się pod wpływem sił. Przy wartości *0* nie ma oporu, a wartość nieskończona natychmiast zatrzyma nasz obiekt.
  • Przeciąg kątowy- Na ile ciało podlega oporowi powietrza, gdy obraca się pod wpływem sił. Przy wartości *0* nie ma oporu, a wartość nieskończona natychmiast zatrzyma obrót naszego obiektu.
  • Powaga- Po włączeniu na obiekt działa grawitacja.
  • jest kinematyczny- Gdy ta opcja jest włączona, silnik fizyczny nie ma wpływu na obiekt i może być modyfikowany tylko przez jego funkcję *Transform*. Może to być przydatne na przykład przy tworzeniu ruchomych platform.
  • *Interpolacja* - Ma zastosowanie tylko wtedy, gdy twoje ruchy ATT wydają ci się dziwne lub niezdarne, itp.:
  1. Nic: Nie zastosowano interpolacji
  2. interpolować: W porównaniu z przekształceniem poprzedniej klatki (*klatka*), następna zostanie wygładzona.
  3. ekstrapolować: Transformacja bieżącej klatki jest wygładzana w porównaniu z szacowaną (przybliżoną) transformacją następnej.
  • Zamrożenie rotacji- Wyłącza rotację, zarówno skryptową, jak i kolizyjną. Obrót można jednak wykonać za pomocą funkcji // przekształć.Obróć()
  • Wykrywanie kolizji- Służy do zapobiegania przechodzeniu szybko poruszających się obiektów przez inne obiekty bez znajdowania kolizja"ov" (specjalna "siatka" na obiektach, które zderzają się ze sobą iz graczem).
  1. oddzielny: Domyślna wartość dla naszego obiektu, aby "zauważyć" wszystkie inne obiekty, z którymi może się kolidować.
  2. Ciągły: Posługiwać się Dyskretna kolizja z dynamicznymi obiektami kolizyjnymi (które mają *ATT*) i Ciągła kolizja dla statycznej MeshCollider"s (bez * ATT *). Tryb Ciągła dynamika używa Ciągła kolizja dla jednego konkretnego *ATT*. Reszta *ATT* użyje trybu _Discrete_. (To znacznie wpłynie na obciążenie silnika fizyki, po prostu zostaw _Discrete_ jeśli nie ma problemów z kolizjami szybkich obiektów)
  3. Ciągła dynamika: Używane dla obiektów w trybie _Ciągły_ lub Ciągła dynamiczna kolizja. Ciągła kolizja będzie również używany do statycznego MeshCollider"s (bez * ATT *). W przypadku wszystkich innych używany jest tryb _Discrete_. Używany do szybko poruszających się obiektów.

Jak możemy wykorzystać tę funkcję? =
= Podstawowa wiedza.
Aby użyć *ATT*, potrzebujemy już utworzonego obiektu gry (*GameObject*), klikając go, przechodzimy do menu zgodnie z następującą ścieżką: Komponenty - Fizyka - Rigidbody . To wszystko, dodał *ATT*! :)
Teraz obiekt podlega grawitacji, możesz zastosować do niego siły za pomocą skryptów, ale aby obiekt zachowywał się dokładnie tak, jak potrzebujesz, powinieneś dodać *Collider* lub *Joint*.

Kod rządzi światem.
W skrypcie będziemy teraz manipulować naszym obiektem za pomocą funkcji Dodaj Siłę() oraz DodajMoment() .
Ponieważ używam *JavaScript* w *Unity*, moje przykłady będą z nim, linki do innych przykładów skryptów (na C# lub *Boo*) znajdziesz poniżej, w akapicie Dodatkowe informacje na temat ATT.

Rigidbody.AddForce

// Rigidbody.AddForce wykorzystuje 2 rodzaje formuł, podobnie jak wiele innych funkcji związanych z ruchami w przestrzeni. // 1 typ: function AddForce (siła: Vector3, tryb: ForceMode = ForceMode.Force) : void // Siła, która wypycha obiekt w górę, względem globalnego układu współrzędnych. function FixedUpdate () ( fixedbody.AddForce (Vector3.up * 10); ) // Używając Vector3, wbudowanej funkcji Unity, która jest zasadniczo taka sama jak standardowy układ współrzędnych. // Drugi typ: function AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // To samo, ale używa układu współrzędnych X-Y-Z. funkcja FixedUpdate() ( fixedbody.AddForce(0, 10, 0); )

Rigidbody.AddTorque

// Funkcja obraca obiekt wokół podanej osi. // 1 typ: function AddTorque (moment obrotowy: Vector3, tryb: ForceMode = ForceMode.Force) : void // Obraca klawisz ATT wokół globalnej osi Y. function FixedUpdate () ( fixedbody.AddTorque (Vector3.up * 10); ) // typ 2: funkcja AddTorque (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Robi to samo, ale znowu w innym systemie pomiarowym. funkcja FixedUpdate() ( fixedbody.AddTorque(0, 10, 0); )

ATT wchodzi w interakcję z obiektami.
Aby nasze * ATT * działały prawidłowo, należy je zaopatrzyć w zderzak„ami (lub kolizja"ami, jak proszę ^.^).
Przeczytaj więcej o zderzaczach poniżej.


Rozmiar ma znaczenie!
Obserwuj wymiary swojego obiektu, ponieważ są one znacznie ważniejsze niż nawet masy *ATT*. Jeśli twój obiekt porusza się nieprawidłowo, unosi się w powietrzu lub nie koliduje, spróbuj dostosować jego wielkość (nie *ATT*, ale sam obiekt). Podczas importowania modelu z edytora 3D jego wymiary są zachowywane, dlatego należy zachować ostrożność na etapie modelowania i przestrzegać wymiarów wszystkich modeli.

Dodatkowe informacje o ATT =
Na tym, opisując *ATT* lub *Rigidbody*, być może dokończę. Jest jednak kilka wskazówek, szczególnie dla tych, którzy przeczytali do tej pory :)

  1. Standardowy rozmiar kostki w *Jedności* to 1 metr, dlatego bardzo wygodnie jest sprawdzić rozmiar swoich modeli za jego pomocą. Aby utworzyć kostkę, wybierz z menu GameObject - Utwórz inny - Cube
  2. Względny wykładnik *masy* określa, w jaki sposób dwa obiekty będą ze sobą oddziaływać.
  3. *Masa* nie wpływa na prędkość spadania z wysokości, użyj do tego celu *Drag*.
  4. Im wyższe wartości *Drag*, tym więcej waży przedmiot. standardowe wartości są różne od 0,001(solidny kawałek metalu) do 10(pióro).
  5. Jeśli chcesz zmienić obiekt zarówno za pomocą skryptów, jak i fizyki, dodaj do niego *ATT* z parametrem *Kinematic*.

Możesz zobaczyć oskryptowane przykłady wpływu sił zewnętrznych na obiekt za pomocą funkcji *ATT* pod następującymi linkami:
*Dodaj siłę*
*Dodaj moment obrotowy*

Aby zmienić przykładowy skrypt, kliknij tekst z nazwą języka programowania!

Zderzacze
=
= Co to jest? =
W poprzedniej sekcji przyjrzeliśmy się, jak działa *Rigidbody* i wspomnieliśmy o tak zwanych *zderzaczach*. * Zderzacz * dla nas jest obiektem pomocniczym w postaci siatki prostego prymitywu lub odwrotnie złożonego kształtu, który znajduje się wokół naszego modelu lub części modelu i współdziała z innymi obiektami, jeśli są również otoczone przez zderzacze .
Aby jasno wyjaśnić ekspertom edytora świata *Warcraft 3*, wyobraźmy sobie model, który zaimportowaliśmy, do którego nie przypisaliśmy tekstur ścieżek w edytorze dudad - to będzie nasz obiekt; a rolę zderzaczy będą tu odgrywać blokery ścieżki wokół modelu. Oczywiście jest to dość zgrubne porównanie, ponieważ w *Unity* są one znacznie bardziej funkcjonalne. Cóż, przyjrzyjmy się bliżej.

Rodzaje zderzaczy. =
Zderzacze są dodawane za pomocą menu Komponent - Fizyka . Istnieje kilka rodzajów:

  • Zderzacz pudełek- w formie sześcianu.
  • Zderzacz Sfer- w formie kuli.
  • Zderzacz kapsułek- w formie kapsułki.
  • Zderzacz siatki- automatycznie tworzy zderzacz zgodnie z kształtem siatki obiektu, nie może zderzać się z innymi zderzaczami tego samego typu. Używany głównie do obiektów statycznych, takich jak otoczenie toru wyścigowego.
  • Zderzacz kołowy- używany do kół, bardzo przydatna rzecz.
  • Zderzacz Mieszanek- kombinacje prymitywów, które razem działają jak jeden. Aby stworzyć tak złożony collider, musisz dodać obiekty podrzędne do naszego podstawowego collider'a i już z nimi powiązać za pomocą prymitywu. Na przykład proste zderzacze do samochodów są bardzo wygodnie wykonane.


Specyfikacje niestandardowe =
W zasadzie wszystkie zderzacze są do siebie podobne, służą tylko do obiektów o różnych kształtach, jednak mają kilka różnych parametrów.

  • *Sześcian*

* *Materiał* — pokazuje, w jaki sposób zderzacz oddziałuje z innymi obiektami podczas przypisywania materiału fizycznego, takiego jak metal, lód itp.
* Czy wyzwalacz- Jeżeli parametr jest włączony, to na obiekt ma wpływ skrypt, a nie fizyka.
* *Rozmiar* - Rozmiar zderzacza wzdłuż osi X-Y-Z.
* *Centrum* - Pozycja zderzacza względem lokalnych współrzędnych obiektu.

  • *Kula*

* *Promień* - Promień sfery, zastępuje parametr *Rozmiar*.
* Pozostałe parametry bez zmian.

  • *kapsułka* (parametry zastępują rozmiar)

* *Promień* - Grubość kapsułki.
* *Wysokość* - Wysokość cylindrycznej części zderzacza (bez zaokrąglonych podstaw).
* *Kierunek* — Kierunek zderzacza względem lokalnych współrzędnych obiektu.


  • Zderzacz siatki(parametry zastępują rozmiar)

* *Mesh* - Wybierz żądaną siatkę, aby utworzyć zderzacz.
* Gładkie zderzenia sferyczne - Włączenie tej funkcji wygładza powierzchnię zderzacza. Powinien być stosowany na gładkich powierzchniach, np. pochyłym terenie bez zbytniej kanciastości, po którym kulki powinny się toczyć.
* *Wypukły* - Po włączeniu pozwala naszemu zderzaczowi zderzać się z innymi zderzaczami. Zderzacz wypukłych siatek"ogranicza się do 255 trójkątów.

  • Zderzacz kołowy(parametry zastępują rozmiar)

* *Promień* - Promień koła.
* Odległość zawieszenia- Maksymalna odległość, aby zwiększyć zawieszenie koła. Zawieszenie zawsze zwiększa się wzdłuż lokalnej osi *Y*.
* Sprężyna zawieszenia- Zawieszenie próbuje dotrzeć do określonego punktu przy użyciu różnych sił.

  1. Wiosna: Próby osiągnięcia określonego punktu (pozycji). Im wyższe ustawienie, tym szybciej jest osiągane.
  2. Amortyzator: zmiękcza, spowalnia prędkość zawieszenia. Im wyższa wartość, tym wolniejszy ruch amortyzatora.
  3. Pozycja docelowa: Całkowita „droga”, którą zawieszenie może „przebyć”. *0* oznacza w pełni rozciągnięty, a *1* w pełni skompresowany. Domyślna wartość to 0, co odpowiada normalnemu zawieszeniu samochodu.

* *Masa* - Masa koła.
* Tarcie do przodu/boczne - Parametry tarcia dla prostego toczenia koła i toczenia się na boki (zdarza się to w poślizgach lub driftingu).

Obejrzano: 734


Moja dziwna ścieżka twórcza zaprowadziła mnie do tworzenia gier. Dzięki doskonałemu programowi studenckiemu z firmy informatycznej, której nazwa składa się z jednej małej greckiej litery, współpracującej z naszą uczelnią, udało nam się zebrać zespół, stworzyć dokumentację i ustawić tworzenie gier Agile pod okiem wysokiej klasy Inżynier QA (witaj Anno!)

Bez większego namysłu Unity został wybrany jako silnik. To wspaniały silnik, na którym naprawdę szybko i łatwo zrobisz bardzo zła gra których przy zdrowych zmysłach nikt nigdy nie zagra. Tworzyć dobra gra, nadal musisz przeszukiwać dokumentację, zagłębiać się w niektóre funkcje i zdobywać doświadczenie programistyczne.

Nasza gra wykorzystywała silnik fizyczny w sposób, którego nie oczekiwała, co powodowało wiele problemów z wydajnością na platformach mobilnych. Ten artykuł, na przykładzie naszej gry, opisuje moje zmagania z silnikiem fizyki i wszystkie cechy jego działania, które zostały zauważone na drodze do opłacalnej wersji beta.

Gra

Kilka słów o tym, jak to się robi.
Stworzony w Blenderze i kilku skryptach Pythona. W momencie kręcenia w rogu ekranu znajdowało się 16 kwadratów, których kolor zakodował 32 bity liczby zmiennoprzecinkowej - obrót telefonu w danym momencie. R, G - dane, B - parzystość. 0 - 0, 255 - 1. Wideo nagrane na komputerze zostało podzielone na klatki za pomocą ffmpeg, każdej ramce renderowania przypisano zdekodowany kąt. Ten format umożliwił przetrwanie dowolnej kompresji podczas procesu kręcenia i przezwyciężył fakt, że wszystkie programy mają nieco inne wyobrażenie o upływającym czasie. W rzeczywistości gra działa tak samo, jak na renderze.


Samolot przelatuje przez niekończącą się i nieprzewidywalną jaskinię, w której znajdują się bonusy, różnego rodzaju monety i wrogowie, których można strzelać pociskami samonaprowadzającymi. Uderzył w ścianę - natychmiast zgubiony.
Charakterystyczną cechą gry jest to, że poziom jest przybity do horyzontu, a sterowanie w nim jest żyroskopowe, co więcej, absolutne. Przechyl telefon o 45 stopni - samolot leciał pod kątem 45 stopni. Musisz zrobić martwą pętlę - musisz przekręcić tablet. Nie ma wrażliwości, tylko hardcore.
Wyróżnijmy dwa główne i oczywiste problemy dla programisty:
Problem 1: Nieskończoność
Unity przechowuje i przetwarza współrzędne obiektów jako normalne 32-bitowe pływaki z dokładnością do 6 miejsc po przecinku. Problem polega na tym, że mamy niekończącą się grę i jeśli będziemy latać wystarczająco długo, zaczną się wszelkiego rodzaju szalone robale, aż po teleportację przez ściany. Istnieje kilka podejść do rozwiązania tego problemu:
  • Ignorowanie. Na przykład w Minecrafcie błędy zaokrąglania sprawiły, że gra stała się ciekawsza dzięki spawnowaniu.

  • Teleportacja do (0;0;0), gdy samolot jest zbyt daleko od początku.

  • Zmiana punktu odniesienia. To nie samolot się porusza, ale poziom wokół niego.
  • W naszym przypadku jedyną akceptowalną opcją jest trzecia, która została zaimplementowana. O wdrożeniu - trochę później.
    Pierwszy – ignorowanie – jest absolutnie nie do przyjęcia. Stworzenie robota, który może grać w naszą grę bez końca, to ciekawe (i dość proste) zadanie, które ktoś rozwiąże. A zwykłych koreańskich graczy nie należy lekceważyć – samolot jest szybki, poziom generowany jest nieprzewidywalnie. A jeśli będziesz latać i latać przed przejściem przez ściany, to po 5 minutach lotu znacznie dokładniejsze strzelanie oczywiście zacznie się zacinać.
    Drugi – teleportacja gracza i całego świata – rzuca urządzenia mobilne na kolana, w niektórych przypadkach – na około pół sekundy. Jest to bardzo zauważalne, a zatem - niedopuszczalne. Ale jest to całkowicie akceptowalna opcja dla prostych, niekończących się gier na PC.

    Problem 2: Generowanie poziomów

    Istnieje kilka podstawowych podejść do budowania niekończących się biegaczy:
  • Korzystanie z gotowych segmentów poziomów, które pasują losowo. Odbywa się to na przykład w Subway Surfers. Jest łatwy do wdrożenia, ale gracz szybko się do tego przyzwyczaja i wie, na co się przygotować, co jest nudne.

  • Poziom to tylko prosta linia, na której losowo umieszczane są przeszkody. Tak to się robi w Joypack Joyride i Temple Run. W naszym przypadku znacznie ograniczyłoby to liczbę manewrów.

  • Wszystko jest generowane losowo. Najtrudniejsza, nieprzewidywalna i interesująca opcja dla gracza.
  • Oczywiście wybraliśmy najtrudniejszą opcję. W jego sercu znajduje się bardzo złożona maszyna stanów, która wykonuje na nich losowe przejścia. Ale w ramach tego artykułu interesującym nie jest mechanizm, ale proces generowania poziomu i jego organizacji z uwzględnieniem wybranego punktu wyjścia.

    Struktura poziomu

    Lecimy w jaskini, ma podłogę i sufit - kilka bloków, elementarne jednostki budowlane. Bloki są łączone w segmenty, które płynnie łączą się ze sobą. Segmenty jako całość obracają się wokół samolotu i poruszają się wzdłuż jego wektora prędkości, tworząc iluzję lotu. Jeśli segment opuści pole widzenia kamery, jest usuwany z bloków, dokowany do ostatniego segmentu poziomu i wypełniany nowymi blokami, zgodnie z instrukcjami generatora. Całość takich segmentów to poziom.
    Doświadczeni programiści Unity mogliby się słusznie skrzywić, po oszacowaniu ilości pracy i wszystkich możliwych pułapek. Ale słowem wszystko jest proste, ale nie miałem doświadczenia programistycznego ...

    Podstawowe prawa fizyki w jedności

    W ciągu miesiąca opracowywania, eksperymentowania i czytania dokumentacji zidentyfikowałem trzy podstawowe prawa fizyki w Unity. Mogą zostać naruszone, ale ceną za naruszenie jest wydajność. Silnik w żaden sposób nie ostrzeże Cię o błędzie, a bez profilera możesz nigdy się o nich nie dowiedzieć. Nieprzestrzeganie tych przepisów może spowolnić grę w dziesiątkach raz. Jak rozumiem, złamanie jakiegokolwiek prawa prowadzi do tego, że silnik fizyki oznacza błędny zderzacz jako niepoprawny i odtwarza go na obiekcie, po czym następuje ponowne obliczenie fizyki:
    1. Zderzacze nie powinny się ruszać, obracać, włączać/wyłączać i zmieniać rozmiaru.
    Po dodaniu zderzacza do obiektu zapomnij o jego wpływie na niego lub o zawartych w nim obiektach. Zwykły zderzacz jest wyłącznie obiektem statycznym. Na przykład drzewo może być z jednym zderzaczem. Jeśli drzewo może spaść na gracza - drzewo upadnie wraz z występem. Jeśli to drzewo wyrośnie z magicznej chmury składników odżywczych, która nie ma zderzacza, ale może się poruszać, towarzyszyć temu będzie spadek wydajności.
    2. Jeśli obiekt się porusza lub obraca - musi to być ciało stałe, tj. mają składnik Rigidbody.
    O tym jest napisane w dokumentacji, tak. Którego nie trzeba uważnie czytać, aby rozpocząć tworzenie gry, ponieważ Unity jest bardzo prosty i intuicyjny.
    Rigidbody zmienia relację silnika fizyki z obiektem. Zaczynają na nią działać siły zewnętrzne, może mieć prędkości liniowe i kątowe, a co najważniejsze, ciało sztywne może poruszać się i obracać za pomocą silnika fizycznego bez powodowania całkowitego przeliczenia fizyki.
    Istnieją dwa rodzaje brył - konwencjonalne i kinematyczne. Zwykłe ciała oddziałują ze sobą i ze zwykłymi zderzaczami - jedno ciało nie może przejść przez drugie. Ciała kinematyczne podlegają uproszczonym regułom symulacji — nie mają na nie wpływu żadne siły zewnętrzne, w tym grawitacja. Mogą przejść przez wszystko.
    Jeśli nie szkoda oddawać przedmioty pod kontrolę silnika fizycznego – używaj zwykłych ciał sztywnych. Na przykład, jeśli chcesz pięknie toczyć kamienie z klifu. Jeśli twoje skrypty lub animatorzy bezpośrednio kontrolują obiekt - użyj ciał kinematycznych, abyś nie musiał stale zajmować się silnikiem i przypadkowymi kolizjami obiektów. Na przykład, jeśli masz animowaną postać lub kierowany pocisk, który eksploduje w kontakcie z czymś.
    3. Jeśli obiekt jest ciałem sztywnym, musi poruszać się i obracać za pomocą metod brył sztywnych.
    Zapomnij o bezpośrednim wywoływaniu Transform "na obiekcie zaraz po dodaniu do niego collidera. Od teraz i na zawsze Transform jest twoim wrogiem i zabójcą wydajności. Zanim napiszesz transform.position = ... lub transform.eulerAngles = ..., powiedz zdanie „teraz całkowicie rozumiem, co robię, jestem zadowolony z hamulców, które wywoła ta linia”. Nie zapominaj o relacjach hierarchicznych: jeśli nagle przesuniesz obiekt zawierający sztywne ciała, fizyka zostaną przeliczone.
    Istnieją trzy poziomy sterowania ciałem sztywnym:
    - Najwyższym, a więc naturalnym poziomem jest siła. Są to metody AddForce i AddTorque. Silnik fizyczny uwzględni masę ciała i poprawnie obliczy wynikową prędkość. Wszystkie interakcje ciał zachodzą na tym poziomie.
    - Poziom średni - zmiana prędkości. Są to właściwości prędkości i prędkości kątowej. Na ich podstawie obliczane są siły działające na ciała podczas ich interakcji, a także oczywiście ich położenie w następnym momencie. Jeśli sztywny korpus ma bardzo małą prędkość, „zasypia”, aby oszczędzać zasoby.
    - Najniższy poziom - bezpośrednio współrzędne obiektu i jego orientacja w przestrzeni. Są to metody MovePosition i MoveRotation. Przy kolejnej iteracji obliczeń fizycznych (jest to ważne, ponieważ każde kolejne wywołanie metody w ramach jednej klatki zastępuje wywołanie poprzedniego), teleportują obiekt do nowej pozycji, po czym żyje on jak poprzednio. W naszej grze ten poziom jest używany i tylko on, ponieważ zapewnia pełną kontrolę nad obiektem.

    Co pozostaje? Włącz/wyłącz obiekt i powiększ. Nie wiem, czy istnieje sposób na zmianę rozmiaru obiektu bez mylenia silnika. Jest całkiem możliwe, że nie. Wyłączenie obiektu jest bezbolesne, a jego włączenie… tak, powoduje przeliczenie fizyki w sąsiedztwie włączonego obiektu. Dlatego staraj się nie włączać zbyt wielu obiektów jednocześnie, rozciągnij ten proces w czasie, aby użytkownik tego nie zauważył.

    Istnieje prawo, które nie wpływa na wydajność, ale wpływa na wydajność: ciało sztywne nie może być częścią ciała sztywnego. Obiekt rodzica będzie dominował, więc dziecko albo będzie stać nieruchomo względem rodzica, albo zachowywać się nieprzewidywalnie i niepoprawnie.

    Jest jeszcze jedna niefizyczna cecha Unity, o której warto wspomnieć: dynamiczne tworzenie i usuwanie obiektów za pomocą metod Instantiate/Destroy jest SZALONE powolne. Boję się nawet wyobrazić sobie, co dzieje się pod maską podczas tworzenia obiektu. Jeśli potrzebujesz tworzyć i usuwać coś dynamicznie - korzystaj z fabryk i wypełniaj je niezbędnymi obiektami podczas ładowania gry. Instantiate powinno się nazywać w ostateczności - jeśli w fabryce nagle zabraknie darmowych obiektów, a na zawsze zapomnisz o Destroy - wszystko, co powstało, powinno zostać ponownie użyte.

    Stosowanie prawa w praktyce

    (ta sekcja zawiera tok rozumowania przy tworzeniu gry i jej cechy)

    Poziom oczywiście musi się obracać i przesuwać.
    Ułatwmy sobie na zawsze nasze życie, umieszczając oś obrotu poziomu - samolotu - w punkcie początkowym współrzędnych. Teraz możemy obliczyć odległość od punktu do niego, obliczając długość wektora współrzędnych punktu. Drobiazg, ale fajnie.
    Wspólny ruch obiektów można łatwo zaimplementować poprzez hierarchię obiektów w Unity, ponieważ dzieci są częścią rodzica. Na przykład opisana struktura poziomów jest logicznie zaimplementowana w następujący sposób:
    - Oś obrotu
    - - Poziom
    - - - Segment 1
    - - - - Blok 1 (Zderzacz)
    - - - - ...
    - - - - Blok N
    - - - Segment 2 ...
    - - - Segment 3 ...
    - - - Segment 4 ...
    (Możesz nawet obejść się bez obiektu poziomu)

    Skrypt na osi odbiera dane z żyroskopu i ustawia dla niego odpowiedni kąt… I od razu łamie wiele zasad, bo rotacja będzie przekazywana przez hierarchię do zderzaczy, co doprowadzi silnik fizyki do szału. Będziesz musiał uczynić oś sztywną bryłą i obrócić ją odpowiednią metodą. Ale co z ruchem na poziomie? Oczywiście oś obrotu i poziom obiektu nie będą się poruszać, każdy segment trzeba przesunąć indywidualnie, inaczej mamy do czynienia z problemem nieskończoności. Oznacza to, że segmenty muszą być bryłami sztywnymi. Ale już wyżej w hierarchii mamy ciało sztywne, a ciało sztywne nie może być częścią ciała sztywnego. Logiczna i elegancka hierarchia nie pasuje, wszystko trzeba będzie zrobić ręcznie – zarówno obrót, jak i translację, bez użycia obiektu jako osi obrotu. Przygotuj się na to, jeśli masz unikalne cechy rozgrywki.

    Jeśli i tak musiałbyś przesunąć segmenty bezpośrednio, będziesz musiał je obrócić. Główną trudnością jest to, że w silniku fizyki Unity nie ma metody „obróć obiekt wokół dowolnego punktu” (Transform ma to, ale nie daj się skusić). Jest tylko „obrót wokół jego środka”. Jest to logiczne, ponieważ obrót wokół dowolnej osi jest jednocześnie obrotem i ruchem, a są to dwie różne operacje. Ale można go naśladować. Najpierw obracamy segment wokół własnej osi, następnie obracamy współrzędne „własnej osi” wokół samolotu. Z racji tego, że samolot mamy na początku, nie trzeba nawet pamiętać szkolnej geometrii i wchodzić na Wikipedię, Unity ma już wszystko. Wystarczy przeliczyć kąt obrotu na kwaternion i pomnożyć go przez współrzędne punktu. Nawiasem mówiąc, dowiedziałem się o tym już w momencie pisania artykułu, zanim zastosowano macierz rotacji.

    Mamy wrogów, którzy wbijają samolot w ścianę, mając nadzieję na zabicie. Jest tarcza, która odpycha samolot od ścian, pomagając przetrwać. Jest to zaimplementowane w banalny sposób - istnieje wektor przesunięcia, który jest dodawany do współrzędnych każdego segmentu w każdej klatce, a następnie resetowany. Każdy, kto chce kopnąć samolot specjalną metodą, może zostawić wektor swojego kopnięcia, który zostanie dodany do tego wektora przemieszczenia.

    Ostatecznie, rzeczywiste współrzędne segmentu, każdej klatki, są obliczane przez centrum sterowania ruchem poziomu mniej więcej tak:
    Pozycja wektora3 = segment.CachedRigidbody.pozycja; Vector3 deltaPos = Czas.deltaTime * Vector3.left * ustawienia.Prędkość; segment.truePosition = Quaternion.Euler(0, 0, deltaAngle) * (pozycja + deltaPos + przesunięcie ruchu);
    Po wszystkich obliczeniach i kulach potrzebnych do pracy z dokładnym dokowaniem segmentów podczas regeneracji, segment.truePosition jest wysyłany do metody MovePosition sztywnego korpusu segmentu.

    wnioski

    Jak szybko to wszystko działa? Na starych flagowcach - Nexusie 5 i LG G2 - gra leci z prędkością 60 FPS, z ledwo zauważalnym spadkiem, gdy podczas generowania segmentów włączane są nowe zderzacze (jest to nieuniknione i nie można go w żaden sposób uniknąć) i wypychania robaków z ziemia (możesz ułożyć jakieś piekło, aby go ominąć, ale teraz dochodzi do celowego naruszenia trzeciego prawa). 40 stabilnych FPS daje każde urządzenie z żyroskopem, z którym się spotkaliśmy. Nie znając i nie biorąc pod uwagę wszystkich przepisów, wydajność była delikatnie mówiąc niezadowalająca, a telefony przegrzewały się. Tak bardzo, że pomyślałem o napisaniu własnego, prostego, wyspecjalizowanego silnika dla fizyki 2D. Na szczęście fizyka w Unity okazała się na tyle elastyczna, że ​​wszystkie problemy można było ominąć i stworzyć wyjątkowa gra, wystarczyło zaledwie kilka tygodni eksperymentów.

    Teraz, znając wszystkie główne pułapki silnika fizyki Unity, możesz szybko sklonować naszą grę, niszcząc marzenia, życie i wiarę trzech biednych uczniów w ludzkość. Mam nadzieję, że ten artykuł zaoszczędzi Ci wiele czasu w przyszłości i pomoże znaleźć nieoczywiste naruszenia praw fizyki produktywnej w Twoich projektach.

    Przeczytaj dokumentację i poeksperymentuj, nawet jeśli używasz prostych i intuicyjnych narzędzi.



    Wesprzyj projekt - udostępnij link, dzięki!
    Przeczytaj także
    zasady gry walki kogutów zasady gry walki kogutów Mod dla Minecraft 1.7 10 receptur zegarków.  Przepisy na tworzenie przedmiotów w Minecrafcie.  Broń w Minecraft Mod dla Minecraft 1.7 10 receptur zegarków. Przepisy na tworzenie przedmiotów w Minecrafcie. Broń w Minecraft Szyling i funt szterling - pochodzenie słów Szyling i funt szterling - pochodzenie słów