Implementowanie wykrywania trafień za pomocą map kafelków

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacji

Windows
  • Okna 11
Edytor Unity
  • 2021.3.3f1
Pakiet systemu wejściowego
  • 1.3.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.

Jakie są wymagania wstępne dotyczące tej porady?

Informacje o wypożyczaniu materiałów map

Przetwarzamy pożyczone z następujących stron.

Implementacja chodzących postaci

Najpierw zaimplementuj mapę i postać, która wykrywa trafienia. Ten znak można przesuwać za pomocą kursora na klawiaturze. Jeśli jednak wdrożysz odpowiedni spacer, będzie on długi i daleki od istoty wskazówek książkowych, więc tym razem przeniosę tylko prosty pojedynczy obraz.

Jeśli chcesz zaimplementować animacje chodzenia, zapoznaj się z następującymi wskazówkami:

Po utworzeniu projektu dodaj obraz kształtu obiektu, który chcesz przenieść do projektu.

Wybierz obraz i ustaw Liczbę pikseli na jednostkę na 32 z Inspektora. Dzieje się tak dlatego, że rozmiar jednego kwadratu mapchipa wynosi 32 piksele, więc pasuje do tego. Po skonfigurowaniu kliknij przycisk "Zastosuj" poniżej.

Umieść duszka w widoku.

Utwórz skrypt, aby przenieść duszka. Jest to podobne do następujących wskazówek:

Pozostaw nazwę Player skryptu jako .

Kod w następujący sposób:

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

Dołącz do duszka, którego chcesz przenieść.

Uruchom grę i sprawdź, czy chcesz ją przenieść za pomocą klawiatury.

Przygotowywanie porad MapTips

Przede wszystkim przygotujemy mapchip i stworzymy mapę. Ta procedura jest podobna do następujących wskazówek: MapTips z dodatkami 2D Tilemap są również zdolne do wykrywania kolizji, ale nie zostaną użyte w tym artykule, ponieważ procedura będzie długa.

Przygotuj oryginalny obraz poradki MapTip i dodaj ją do projektu. Aby operacja była łatwiejsza do zrozumienia, przygotuj "miejsce do chodzenia" i "miejsce nienadające się do chodzenia" dla materiału chipa mapy.

Skonfiguruj go dla MapChips w Inspektorze i kliknij przycisk Zastosuj. Po skonfigurowaniu otwórz Sprite Editor.

To maptip o rozdzielczości 32 pikseli, więc podzielę go na 32.

Wybierz kartę Paleta kafelków. Jeśli nie, wyświetl go z menu za pomocą opcji "Okno > 2D -> Tile Palette". Utwórz nową paletę. Nazwa jest arbitralna, ale na razie nazwiemy ją "MapChipPalette".

Utwórz folder MapChipPalette w obszarze Sceny i określ go.

Dodaj etykietkę maptip, przeciągając ją na paletę. Zapisz go w utworzonym wcześniej folderze MapChipPalette.

Tworzenie mapy

Tym razem ocena trafienia na mapę zostanie przeprowadzona w jednostkach "Tilemap". Dlatego utworzymy dwie mapy kafelków: "Tilemap bez wykrywania trafień" i "Tilemap z wykrywaniem trafień".

Najpierw utwórz dwie mapy kafelków w hierarchii. W siatce można utworzyć dwa. Dla jasności nazwy to "TilemapObeject" i "TilemapGround".

Najpierw utwórz "TilemapGround". Ponieważ jest to ruchoma gama, możesz po prostu położyć ziemię. Jeśli jest na ziemi, możesz zmienić wzór.

Nawiasem mówiąc, jeśli znak jest ukryty, wybierz obiekt znaku i ustaw kolejność warstw inspektora Sprite Renderer na 2. Domyślnie warstwa ma kolejność 0, a mapa kafli wynosi 0, więc jeśli zostanie ona zwiększona powyżej tej wartości, zostanie ona wyświetlona na pierwszym planie.

Następnie wybierz TilemapObject i umieść etykietkę maptip, którą chcesz unieruchomić. Najpierw ustaw kolejność warstw na 1. Ma to sprawić, że pojawi się przed ziemią.

Tak to wygląda, jeśli ukryjesz ziemię.

Oczywiście w tym momencie nie ma żadnych ustawień związanych z wykrywaniem kolizji, więc można normalnie jeździć po wysokim terenie. Następnie ustawimy wykrywanie kolizji.

Ustawienia wykrywania kolizji

Najpierw ustawmy postać. To ustawienie jest prawie takie samo jak poniższe wskazówki, więc pominę szczegóły i krótko wyjaśnię procedurę.

Wybierz obiekt znakowy z hierarchii i wybierz Physics 2D -> Circle Collider 2D z Dodaj komponent. Jeśli kształt obiektu jest prostokątny, "Box Collider 2D" jest w porządku.

Podobnie dodaj "Physics 2D -> Rigidbody 2D".

Ustaw skalę grawitacyjną na 0, aby zapobiec Rigidbody 2D automatycznemu upadkowi.

Sprawdź Z w obszarze Ograniczenia, aby zapobiec obracaniu się duszka podczas kolizji.

Następnie wybierz "TilemapObject", który chcesz uderzyć, i wybierz "Tilemap -> Tilemap Collider 2D" z "Dodaj komponent".

To wszystko. Nie potrzebujesz nawet żadnego programowania. Uruchom grę i spróbuj uderzyć w obiekt, który staje się ścianą. Myślę, że możesz upewnić się, że zatrzyma się prawidłowo.

Jednakże, kiedy faktycznie go uderzysz, myślę, że w zachowaniu pojawią się punkty budzące obawy. Oto kilka rozwiązań:

Niewygodne zachowanie wykrywania trafień za pomocą mapy i rozwiązań

Kiedy uderzysz w ścianę, możesz znaleźć kilka rzeczy, które cię niepokoją.

Jeśli poruszysz się pod ścianą, zostaniesz złapany w środku

Box Collider 2D Myślę, że tak się stanie, jeśli używasz przedmiotu.

Na przykład ze sceny poniżej, gdy naciskasz w lewym dolnym rogu, chcesz, aby przesunął się w lewo wzdłuż ściany. Jednak po pewnym postępie myślę, że utknie w czymś i przestanie.

Rozpoznawaj wgniecenia w ścianach według pozycji

Circle Collider 2D Myślę, że łatwo to zrozumieć, jeśli dołączysz . Ściana powinna być płaska, ale jeśli przesuniesz ją przy ścianie, zobaczysz, że ściana porusza się tak, jakby była nierówna.

Przyczyny i rozwiązania zaczepów i uderzeń

Powodem, dla którego tak się dzieje, wydaje się być to, że "określenie trafienia odbywa się na podstawie mapchipa". W rzeczywistości po wybraniu TilemapObject w miejscu, w którym znajduje się wykrywanie trafień, pojawi się zielona linia i widać, że jest to linia narysowana w jednostkach MapTip.

Tak więc, jeśli poruszający się obiekt znajduje się na linii odpowiadającej dokładnie jednemu układowi mapy, zostanie oceniony jako trafienie jednym chipem mapy. Jeśli zderzycie się na granicy żetonów mapy, dwa żetony mapy zostaną trafione i ocenione, więc siła odbicia wzrośnie.

Myślę, że najlepszym sposobem na rozwiązanie tego problemu jest połączenie wykrywania trafień z dołączonymi mapchipami. Oto jak to zrobić:

WybierzTilemap Collider 2D "TilemapObject" z wykrywaniem trafień przez inspektora i zaznacz "Użyj w kompozytie" z .

Jak stwierdzono w ostrzeżeniu, samo to nie ma żadnego wpływu, więc wybierz "Physics 2D -> Composite Collider 2D" z "Dodaj komponent".

Rigidbody 2D jest dodawany wraz z Composite Collider 2D.

To trochę mylące, ale myślę, że możesz potwierdzić, że zielona linia na granicy między mapchipami z wykrywaniem trafień zniknęła.

Nie chcę, aby mapa kafelków się przesuwała, więc pozostawię typ ciała komponentu Rigidbody 2D jako "statyczny".

Teraz uruchom grę i spróbuj ją uruchomić. Myślę, że nawet jeśli poruszasz się po przekątnej wzdłuż ściany, nie zostanie złapana i możesz poruszać się płynnie bez wyboistego ruchu.

Wyeliminuj odpychanie postaci od ścian

Widać, że jeśli poruszysz postacią, aby popchnąć ścianę, a następnie przestaniesz się poruszać, będzie ona zachowywać się trochę jak odbicie od ściany.

Aby rozwiązać ten problem,Rigidbody 2D wybierz obiekt postaci i zmień "Wykrywanie kolizji" na "Ciągłe" z komponentu.

Różnica między "nieciągłym" a "ciągłym" jest następująca.

Nieciągły

Wykrywanie kolizji to mechanizm, który myśli po ruchu. Jest to forma, która wykonuje wykrywanie kolizji ze stanu, w którym jest przesuwana i osadzona w ścianie. Łatwo to zrozumieć, jeśli kojarzysz go z trampolinami i gumą, ale im bardziej jest osadzony, tym bardziej odpychająca siła wzrośnie, a odbicie będzie silniejsze. Zamiast tego obliczenia są wykonywane po przeniesieniu, więc koszt przetwarzania jest niski.

Ciągły

Jest przetwarzany podczas określania, co jest w drodze. Określ, czy między pozycją przed i po ruchu znajduje się ściana, Jeśli jest ściana, oceni tam kolizję i zatrzyma się, więc praktycznie nie ma odpychania. Zamiast tego koszt przetwarzania nieco wzrasta, ponieważ obliczenia są uwzględniane w środku ruchu.

Przechwycony w rogu obiektu mapy

W zależności od programu i lokalizacji, niektóre są złapane, a niektóre nie, a przyczyna niewiele się zmieniła. Nawiasem mówiąc, dzieje się tak z kątowymi narożnikami, takimi jak Box Collider 2D, a nie z zaokrąglonymi okręgami.

Nawet jeśli wystąpi takie tajemnicze zjawisko, dobrze jest mieć zaokrąglone rogi zderzacza, aby uniknąć zaczepów. Jest on ograniczony do Box Collider 2D, ale aby był okrągły, komponent Box Collider 2D obiektu znakowego ma "promień krawędzi" i umieszczasz tam wartość. Jeśli wprowadzisz 1 jako jednostkę liczbową, nastąpi zaokrąglenie rozmiaru obiektu. To zależy od wielkości, ale dobrze jest umieścić około 0,1.

Nawiasem mówiąc, ocena trafienia zwiększa się tylko o rozmiar zaokrąglenia, więc proszę go dostosować, jeśli jest duży. Box Collider 2D ma przycisk Collider Edit, który umożliwia zmianę rozmiaru bezpośrednio w widoku, klikając przycisk. Ponieważ zewnętrzna zielona linia jest faktycznym wykrywaniem trafienia, ustaw rozmiar tak, aby nie był nienaturalny.

Następnie uruchom grę, aby upewnić się, że nie zostanie porysowana i wprowadź poprawki.