Implementace detekce přístupů pomocí tilemap
Ověřovací prostředí
- Windows
-
- Systém Windows 11
- Editor jednoty
-
- 2021.3.3f1
- Vstupní systémový balíček
-
- 1.3.0
Předpoklady pro tento tip
Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.
Jaké jsou předpoklady pro tento tip?
- Vytvoření 2D mapy shora dolů pomocí standardních map dlaždic Unity
- Řešení kolizí pomocí standardní fyziky (2D)
O půjčování mapových podkladů
Zpracováváme výpůjčky z následujících stránek.
Implementace chodících znaků
Nejprve implementujte mapu a znak, který provádí detekci zásahů. Tento znak lze přesouvat kurzorovými klávesami na klávesnici. Pokud však provedete správnou procházku, bude to dlouhé a daleko od podstaty knižních tipů, takže tentokrát budu pohybovat pouze jednoduchým jedním obrázkem.
Pokud chcete implementovat animace chůze, podívejte se na následující tipy:
Po vytvoření projektu přidejte pohyblivý symbol objektu, který chcete přesunout do projektu.
Vyberte obraz a v inspektoru nastavte počet pixelů na jednotku na 32. Je to proto, že velikost jednoho čtverce mapového čipu je 32 pixelů, takže se to hodí. Po nakonfigurování klikněte na tlačítko "Použít" níže.
Umístěte pohyblivý symbol do pohledu.
Vytvořte skript pro přesunutí pohyblivého symbolu. To je podobné následujícím tipům:
Název skriptu Player
ponechte jako .
Kód je následující:
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);
}
}
}
Připevněte se k pohyblivému symbolu, který chcete přesunout.
Spusťte hru a zkontrolujte, zda ji chcete přesunout pomocí klávesnice.
Příprava tipů na mapy
Nejprve připravíme mapčip a vytvoříme mapu. Tento postup je podobný následujícím tipům: MapTips s 2D Tilemap Extra jsou také schopny detekovat kolize, ale nebudou použity v tomto článku, protože postup bude dlouhý.
Připravte původní obrázek tipu a přidejte jej do projektu. Aby byla operace srozumitelnější, připravte si pro materiál mapového čipu "pochozí místo" a "nepochozí místo".
Nastavte ji pro MapChips v Inspectoru a klikněte na tlačítko Apply. Po nakonfigurování otevřete Editor pohyblivých symbolů.
Je to maptip s 32 pixely, takže ho rozdělím na 32.
Vyberte kartu Paleta dlaždic. Pokud ne, zobrazte jej pomocí "Okno > 2D -> paleta dlaždic" z nabídky. Vytvořte novou paletu. Název je libovolný, ale prozatím jej budeme nazývat "MapChipPalette".
Vytvořte složku MapChipPalette v Scenes a určete ji.
Přidejte popisek mapy přetažením na paletu. Uložte jej do složky MapChipPalette, kterou jste vytvořili dříve.
Vytvoření mapy
Tentokrát bude posouzení zásahu mapy provedeno v jednotkách "Tilemap". Proto vytvoříme dvě Tilemapy, "Tilemap bez detekce zásahu" a "Tilemap s detekcí zásahu".
Nejprve vytvořte dvě mapy dlaždic v hierarchii. V mřížce můžete vytvořit dvě. Názvy jsou "TilemapObeject" a "TilemapGround" pro přehlednost.
Nejprve vytvořte "TilemapGround". Vzhledem k tomu, že se jedná o pohyblivý rozsah, můžete jednoduše položit zem. Pokud je na zemi, můžete změnit vzor.
Mimochodem, pokud je znak skrytý, vyberte znakový objekt a nastavte pořadí vrstev inspektoru Sprite Renderer
na 2.
Pořadí hladin je ve výchozím nastavení 0 a mapa dlaždic je 0, takže pokud ji zvýšíte nad tuto hodnotu, zobrazí se v popředí.
Pak vyberte TilemapObject a umístěte popisek mapy, který chcete nastavit jako nepohyblivý. Nejprve nastavte pořadí vrstev na hodnotu 1. To proto, aby se objevil před zemí.
Takto to vypadá, když skryjete zem.
Samozřejmě, v tomto okamžiku neexistují žádná nastavení týkající se detekce kolizí, takže můžete normálně jezdit na vyvýšeném povrchu. Poté nastavíme detekci kolizí.
Nastavení detekce kolizí
Nejprve postavu nastavíme. Toto nastavení je téměř stejné jako níže uvedené tipy, takže přeskočím podrobnosti a stručně vysvětlím postup.
Vyberte znakový objekt z hierarchie a vyberte Physics 2D -> Circle Collider 2D z Add Component (Přidat komponentu). Pokud je tvar objektu obdélníkový, je "Box Collider 2D" v pořádku.
Podobně přidejte "Physics 2D -> Rigidbody 2D".
Nastavte stupnici gravitace na 0, abyste zabránili Rigidbody 2D
automatickému pádu.
Zkontrolujte Z v části Omezení, abyste zabránili otáčení pohyblivého symbolu při kolizi.
Dále vyberte "TilemapObject", který chcete zasáhnout, a vyberte "Tilemap -> Tilemap Collider 2D" z "Přidat komponentu".
To je vše. Nepotřebujete ani žádné programování. Spusťte hru a pokuste se zasáhnout objekt, který se stane zdí. Myslím, že se můžete ujistit, že se zastaví správně.
Nicméně, když to skutečně trefíte, myslím, že v chování budou body znepokojení. Zde je několik řešení:
Nepohodlné chování detekce zásahů s mapou a řešeními
Když narazíte do zdi, můžete najít několik věcí, které vás trápí.
Pokud se pohnete proti zdi, zachytí se uprostřed
Box Collider 2D
Myslím, že se to stane, pokud používáte objekt.
Například ze scény níže, když stisknete klávesu vlevo dole, chcete, aby se pohybovala doleva podél zdi. Nicméně po určitém pokroku si myslím, že se to v něčem zasekne a zastaví se.
Rozpoznání důlků ve stěnách podle polohy
Circle Collider 2D
Myslím, že je snadné pochopit, pokud připojíte .
Stěna by měla být plochá, ale pokud ji posunete proti zdi, uvidíte, že se stěna pohybuje, jako by byla nerovná.
Příčiny a řešení zádrhelů a nárazů
Důvodem, proč k nim dochází, se zdá být to, že "určení shody se provádí na základě mapchipu". Ve skutečnosti, když vyberete TilemapObject, zobrazí se zelená čára na místě, kde se nachází detekce zásahu, a můžete vidět, že se jedná o čáru nakreslenou v jednotkách maptipu.
Pokud je tedy pohybující se objekt na čáře odpovídající přesně jednomu mapovému čipu, bude vyhodnocen jako zásah jedním mapovým čipem. Pokud narazíte na hranici mapových žetonů, budou zasaženy a posouzeny dva mapové žetony, takže síla odrazu se zvýší.
Myslím, že nejlepším způsobem, jak tento problém vyřešit, je kombinovat detekci zásahu s připojenými mapovými čipy. Postup je následující:
V inspektoru vyberteTilemap Collider 2D
"TilemapObject" s detekcí zásahu a zaškrtněte "Použít v kompozitu" z .
Jak je uvedeno ve varování, to samo o sobě nemá žádný vliv, takže vyberte "Physics 2D -> Composite Collider 2D" z "Přidat komponentu".
Tuhé těleso 2D je přidáno spolu s kompozitním urychlovačem 2D.
Je to trochu matoucí, ale myslím, že můžete potvrdit, že zelená čára na hranici mezi mapovými čipy s detekcí zásahu zmizela.
Nechci, aby se tilemap pohybovala, takže nechám Rigidbody 2D
typ těla komponenty jako "statický".
Nyní spusťte hru a pokuste se ji rozhýbat. Myslím, že i když se budete pohybovat diagonálně podél zdi, nezachytí se a můžete se pohybovat hladce bez hrbolatého pohybu.
Eliminujte charakter tlačený zpět od zdí
Vidíte, že pokud postavu pohnete tak, aby tlačila zeď a pak se přestala pohybovat, bude se chovat trochu jako odraz od zdi.
Chcete-li tento problém vyřešit,Rigidbody 2D
vyberte znakový objekt a změňte "Detekce kolizí" na "Průběžně" z komponenty.
Rozdíl mezi "nespojitým" a "spojitým" je následující.
Diskontinuální
Detekce kolizí je mechanismus, který myslí po pohybu. Jedná se o formulář, který provádí detekci kolizí ze stavu, kdy je přesunut a zapuštěn do zdi. Je snadné pochopit, pokud ji spojíte s trampolínami a gumou, ale čím více je vložena, tím odpudivější síla se zvýší a odraz bude silnější. Místo toho se výpočet provádí po přesunutí, takže náklady na zpracování jsou nízké.
Nepřetržitý
Zpracovává se při určování, co je na cestě. Zjistěte, zda je mezi polohou před a po pohybu stěna, Pokud je tam zeď, vyhodnotí srážku tam a zastaví se, takže prakticky neexistuje žádné odpuzování. Místo toho se náklady na zpracování trochu zvýší, protože výpočet je zahrnut uprostřed pohybu.
Zachyceno v rohu objektu mapy
V závislosti na programu a umístění jsou některé zachyceny a některé nejsou a příčina se příliš nezměnila. Mimochodem, stává se to s hranatými rohy, jako je Box Collider 2D, a ne se zaoblenými kruhy.
I když k takovému záhadnému jevu dojde, je dobré mít zaoblené rohy urychlovače, aby nedošlo k zádrhelům. Je omezen na Box Collider 2D, ale aby byl kulatý, komponenta Box Collider 2D objektu postavy má "poloměr hrany" a vložíte tam hodnotu. Pokud zadáte 1 jako číselnou jednotku, dojde k zaokrouhlení velikosti objektu. Záleží na velikosti, ale je dobré dát asi 0,1.
Mimochodem, úsudek o zásahu se zvyšuje pouze o velikost kulatosti, takže jej prosím upravte, pokud je velký. Box Collider 2D má tlačítko Collider Edit, které umožňuje změnit jeho velikost přímo v zobrazení kliknutím na tlačítko. Vzhledem k tomu, že vnější zelená čára je skutečná detekce zásahu, nastavte velikost tak, aby nebyla nepřirozená.
Poté spusťte hru, abyste se ujistili, že se nepoškrábe a proveďte úpravy.