Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

Kształty kolizji

Obiekt kolizji może zawierać kilka osadzonych kształtów. W fizyce 3D mogą to być otoczki wypukłe i siatki trójkątów z plików glTF lub GLB. Możesz też używać zasobu mapy kafelków lub kształtu wypukłego przez właściwość Collision Shape obiektu kolizji.

Kształty podstawowe

Kształty podstawowe to box, sphere i capsule. Aby dodać kształt podstawowy, kliknij prawym przyciskiem myszy obiekt kolizji i wybierz Add Shape:

Dodawanie kształtu podstawowego

Kształt prostopadłościanu

Kształt prostopadłościanu ma pozycję, obrót i wymiary: szerokość, wysokość oraz głębokość:

Kształt prostopadłościanu

Kształt sfery

Kształt sfery ma pozycję, obrót i średnicę:

Kształt sfery

Kształt kapsuły

Kształt kapsuły ma pozycję, obrót, średnicę i wysokość:

Kształt kapsuły

Kształty kapsuły są obsługiwane tylko w fizyce 3D, skonfigurowanej w sekcji Physics pliku game.project.

Kształty złożone

Kształty złożone mogą korzystać z geometrii mapy kafelków lub danych otoczki wypukłej. Od wersji Defold 1.13.2 obiekty kolizji 3D mogą też tworzyć otoczki wypukłe i kształty siatek trójkątów z siatek w scenach glTF lub GLB.

Kształty Hull i Mesh w 3D

Użyj kształtu Hull, aby uzyskać wypukłe przybliżenie siatki, lub kształtu Mesh, gdy kolizje mają odpowiadać jej trójkątom, w tym obszarom wklęsłym, takim jak otwory w geometrii poziomu.

  1. Ustaw Physics → Type na 3D w pliku game.project.
  2. Kliknij prawym przyciskiem myszy obiekt kolizji w Outline i wybierz Add Shape ▸ Hull lub Add Shape ▸ Mesh.
  3. Wybierz nowy kształt i ustaw jego właściwość Scene na plik .gltf lub .glb.
  4. Wybierz siatkę o określonej nazwie z pola Mesh. Jeśli nie ma jej na liście, nadaj siatce nazwę w narzędziu do modelowania i ponownie wyeksportuj scenę.
  5. Ustaw pozycję i obrót kształtu tak, aby dopasować go do widocznej geometrii obiektu gry. W razie potrzeby powtórz te kroki, aby dodać kolejne kształty.

Wybrana siatka dostarcza geometrię lokalną; transformacje węzłów glTF nie są stosowane. Kształty kolizji Mesh są obsługiwane przez backend Bullet 3D, zarówno dla statycznych, jak i niestatycznych obiektów kolizji. Backend fizyki 2D ich nie obsługuje.

Geometria siatki trójkątów jest dostępna tylko do odczytu przez API kształtów w czasie działania. Aby zmienić trójkąty, edytuj siatkę źródłową i ponownie zbuduj projekt. Informacje o skali obiektu gry znajdziesz w sekcji skalowanie kształtów kolizji.

Kształt kolizji mapy kafelków

Defold zawiera funkcję, która pozwala łatwo generować kształty fizyki dla źródła kafelków używanego przez mapę kafelków. W instrukcji Tile source wyjaśniono, jak dodawać grupy kolizji do źródła kafelków i przypisywać kafelki do grup kolizji (przykład).

Aby dodać kolizję do mapy kafelków:

  1. Dodaj mapę kafelków do obiektu gry, klikając prawym przyciskiem myszy obiekt gry i wybierając Add Component File. Następnie wybierz plik mapy kafelków.
  2. Dodaj komponent obiektu kolizji do obiektu gry, klikając prawym przyciskiem myszy obiekt gry i wybierając Add Component ▸ Collision Object.
  3. Zamiast dodawać kształty do komponentu, ustaw właściwość Collision Shape na plik tilemap.
  4. Skonfiguruj Properties komponentu obiektu kolizji jak zwykle.

Kolizja mapy kafelków

Zwróć uwagę, że właściwość Group nie jest tutaj używana, ponieważ grupy kolizji są definiowane w źródle kafelków mapy.

Kształt wypukły (convex hull)

W fizyce 3D możesz utworzyć otoczkę wypukłą bezpośrednio z siatki, korzystając z opisanego wyżej sposobu pracy w edytorze. Starszy zasób .convexshape jest nadal obsługiwany i można go utworzyć z punktów w zewnętrznym edytorze:

  1. Utwórz plik kształtu convex hull o rozszerzeniu .convexshape przy użyciu zewnętrznego edytora.
  2. Edytuj plik ręcznie w edytorze tekstu albo przy użyciu zewnętrznego narzędzia, opisanego poniżej.
  3. Zamiast dodawać kształty do komponentu obiektu kolizji, ustaw właściwość Collision Shape na plik convex shape.

Format pliku

Format pliku convex hull używa tego samego formatu danych co pozostałe pliki Defold, czyli tekstowego formatu protobuf. Kształt convex hull definiuje punkty bryły. W fizyce 2D punkty powinny być podane w kolejności przeciwnej do ruchu wskazówek zegara. W trybie fizyki 3D używana jest abstrakcyjna chmura punktów. Przykład dla 2D:

shape_type: TYPE_HULL
data: 200.000
data: 100.000
data: 0.0
data: 400.000
data: 100.000
data: 0.0
data: 400.000
data: 300.000
data: 0.0
data: 200.000
data: 300.000
data: 0.0

Powyższy przykład definiuje cztery narożniki prostokąta:

 200x300   400x300
    4---------3
    |         |
    |         |
    |         |
    |         |
    1---------2
 200x100   400x100

Narzędzia zewnętrzne

Istnieje kilka narzędzi zewnętrznych, których można użyć do tworzenia kształtów kolizji:

  • Physics Editor od CodeAndWeb pozwala tworzyć obiekty gry ze sprite’ami i pasującymi do nich kształtami kolizji.
  • Defold Polygon Editor można użyć do tworzenia kształtów convex hull.
  • Physics Body Editor również można użyć do tworzenia kształtów convex hull.

Skalowanie kształtów kolizji

Obiekt kolizji i jego kształty dziedziczą skalę obiektu gry. Aby wyłączyć to zachowanie, odznacz pole Allow Dynamic Transforms w sekcji Physics pliku game.project. Zwróć uwagę, że obsługiwane jest tylko skalowanie jednolite, a jeśli skala nie jest jednolita, użyta zostanie najmniejsza wartość skali.

Zmienianie rozmiaru kształtów kolizji

Rozmiar kształtów podstawowych można zmieniać w czasie działania za pomocą physics.set_shape(). Ta funkcja nie zastępuje wierzchołków otoczki wypukłej ani geometrii siatki trójkątów. Przykład:

-- ustaw dane kształtu kapsuły
local capsule_data = {
  type = physics.SHAPE_TYPE_CAPSULE,
  diameter = 10,
  height = 20,
}
physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)

-- ustaw dane kształtu sfery
local sphere_data = {
  type = physics.SHAPE_TYPE_SPHERE,
  diameter = 10,
}
physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)

-- ustaw dane kształtu prostopadłościanu
local box_data = {
  type = physics.SHAPE_TYPE_BOX,
  dimensions = vmath.vector3(10, 10, 5),
}
physics.set_shape("#collisionobject", "my_box_shape", box_data)

Na obiekcie kolizji musi już istnieć kształt właściwego typu o podanym id.

Obracanie kształtów kolizji

Obracanie kształtów kolizji w fizyce 3D

Kształty kolizji w fizyce 3D można obracać wokół wszystkich osi.

Obracanie kształtów kolizji w fizyce 2D

Kształty kolizji w fizyce 2D można obracać tylko wokół osi Z. Obracanie wokół osi X albo Y daje nieprawidłowe wyniki i należy go unikać, nawet przy obrocie o 180 stopni, który pozornie miałby tylko odwrócić kształt wzdłuż osi X albo Y. Do odwracania kształtu fizyki zaleca się używać physics.set_hlip(url, flip) oraz physics.set_vlip(url, flip).

Debugowanie

Możesz włączyć debugowanie fizyki, aby zobaczyć kształty kolizji w czasie działania.