Implementar detecção de ocorrências com tilemaps

Página atualizada :
Data de criação de página :

Ambiente de verificação

Windows
  • Janelas 11
Unity Editor
  • 2021.3.3f1
Pacote do sistema de entrada
  • 1.3.0

Pré-requisitos para esta dica

As configurações a seguir foram feitas com antecedência como premissa para a descrição desta dica.

Quais são os pré-requisitos para essa dica?

Sobre o empréstimo de materiais de mapa

Processamos emprestado dos seguintes sites.

Implementação de personagens ambulantes

Primeiro, implemente um mapa e um personagem que execute a detecção de acertos. Esse caractere pode ser movido com as teclas do cursor no teclado. No entanto, se você implementar uma caminhada adequada, ela será longa e longe da essência das dicas do livro, então desta vez vou mover apenas uma simples imagem.

Se você quiser implementar animações de caminhada, consulte as seguintes dicas:

Depois de criar o projeto, adicione uma imagem de sprite do objeto que você deseja mover para o projeto.

Selecione a imagem e defina os pixels por unidade como 32 no Inspetor. Isso ocorre porque o tamanho de um quadrado do mapchip é de 32 pixels, então ele se encaixa nisso. Uma vez configurado, clique no botão "Aplicar" abaixo.

Coloque o sprite na vista.

Crie um script para mover o sprite. Isso é semelhante às seguintes dicas:

Deixe o nome Player do script como .

Código da seguinte forma:

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);
    }
  }
}

Anexe ao sprite que você deseja mover.

Execute o jogo e verifique se você deseja movê-lo com o teclado.

Preparando MapTips

Primeiro de tudo, vamos preparar um mapchip e criar um mapa. Esse procedimento é semelhante às seguintes dicas: MapTips com 2D Tilemap Extras também são capazes de detecção de colisão, mas eles não serão usados neste artigo porque o procedimento será longo.

Prepare a imagem original do MapTip e adicione-a ao seu projeto. Para tornar a operação mais fácil de entender, prepare um "lugar caminhável" e um "lugar não caminhável" para o material do chip do mapa.

Configure-o para MapChips no Inspetor e clique no botão Aplicar. Depois de configurado, abra o Sprite Editor.

É uma dica de mapa de 32 pixels, então vou dividi-la em 32.

Selecione a guia Paleta de blocos. Caso contrário, exiba-o com "Window > 2D -> Tile Palette" no menu. Crie uma nova paleta. O nome é arbitrário, mas por enquanto vamos chamá-lo de "MapChipPalette".

Crie uma pasta MapChipPalette em Cenas e especifique-a.

Adicione uma dica de mapa arrastando-a para a paleta. Salve-o na pasta MapChipPalette que você criou anteriormente.

Criar um mapa

Desta vez, o julgamento do acerto do mapa será realizado em unidades de "Tilemap". Portanto, vamos criar dois Tilemaps, "Tilemap sem detecção de hits" e "Tilemap com detecção de hits".

Primeiro, crie dois Tilemaps na hierarquia. Você pode criar dois na Grade. Os nomes são "TilemapObeject" e "TilemapGround" para maior clareza.

Primeiro, crie um "TilemapGround". Como é uma faixa móvel, você pode simplesmente colocar o chão. Se estiver no chão, você pode mudar o padrão.

A propósito, se o caractere estiver oculto, selecione o objeto de caractere e defina a ordem de camadas do Sprite Renderer inspetor como 2. A ordem das camadas é 0 por padrão e o Tilemap é 0, portanto, se você aumentá-lo acima desse valor, ele será exibido em primeiro plano.

Em seguida, selecione TilemapObject e coloque a dica de mapa que você deseja tornar imóvel. Defina a ordem da camada como 1 primeiro. Isso é para fazê-lo aparecer na frente do chão.

É assim que parece se você esconder o chão.

É claro que, neste momento, não há configurações relacionadas à detecção de colisão, para que você possa andar em terreno alto normalmente. Depois disso, vamos definir a detecção de colisão.

Configurações de detecção de colisão

Primeiro, vamos configurar o personagem. Essa configuração é quase a mesma das dicas abaixo, então vou pular os detalhes e explicar brevemente o procedimento.

Selecione um objeto de caractere na hierarquia e selecione Física 2D -> Circle Collider 2D em Adicionar componente. Se a forma do objeto for retangular, "Box Collider 2D" é bom.

Da mesma forma, adicione "Physics 2D -> Rigidbody 2D".

Defina a escala de gravidade para 0 para evitar Rigidbody 2D a queda automática.

Verifique Z em Restrições para evitar que o sprite gire ao colidir.

Em seguida, selecione "TilemapObject" que você deseja bater e selecione "Tilemap -> Tilemap Collider 2D" de "Adicionar componente".

É só isso. Você nem precisa de programação. Execute o jogo e tente acertar o objeto que se torna a parede. Eu acho que você pode ter certeza de que ele pára corretamente.

No entanto, quando você realmente acertar, acho que haverá pontos de preocupação no comportamento. Aqui estão algumas soluções:

Comportamento inconveniente de detecção de acertos com o mapa e soluções

Quando você bate em uma parede, você pode encontrar algumas coisas que o incomodam.

Se você se mover contra a parede, você vai ficar preso no meio

Box Collider 2D Acho que isso acontecerá se você estiver usando um objeto.

Por exemplo, na cena abaixo, quando você pressiona a tecla no canto inferior esquerdo, você deseja que ela se mova para a esquerda ao longo da parede. No entanto, depois de algum progresso, acho que vai ficar preso em algo e parar.

Reconhecer amassados nas paredes por posição

Circle Collider 2D Acho que é fácil de entender se você anexar. A parede deve ser plana, mas se você movê-la contra a parede, verá que a parede se move como se estivesse irregular.

Causas e soluções para problemas e solavancos

A razão pela qual isso ocorre parece ser que "a determinação de acerto é realizada em uma base de mapchip". Na verdade, quando você seleciona TilemapObject, uma linha verde aparece no local onde a detecção de ocorrências está localizada, e você pode ver que essa é uma linha desenhada em unidades MapTip.

Assim, se o objeto em movimento estiver em uma linha equivalente a exatamente um chip de mapa, ele será julgado como um acerto com um chip de mapa. Se você colidir no limite das fichas do mapa, duas fichas de mapa serão atingidas e julgadas, então a força do salto aumentará.

Acho que a melhor maneira de resolver esse problema é combinar a detecção de acertos com os mapchips anexados. Veja como fazer isso:

SelecioneTilemap Collider 2D "TilemapObject" com detecção de visitas do inspetor e marque "Usar em composto" em .

Como dito no aviso, isso por si só não tem efeito, então selecione "Physics 2D -> Composite Collider 2D" em "Add Component".

Rigidbody 2D é adicionado junto com Composite Collider 2D.

É um pouco confuso, mas acho que você pode confirmar que a linha verde no limite entre mapchips com detecção de acerto desapareceu.

Não quero que o tilemap se mova, então vou Rigidbody 2D deixar o tipo de corpo do componente como "estático".

Agora execute o jogo e tente colocá-lo em movimento. Eu acho que mesmo se você se mover diagonalmente ao longo da parede, ele não vai ficar preso e você pode se mover suavemente sem movimento acidentado.

Elimine os empurrões de personagens das paredes

Você pode ver que se você mover o personagem para empurrar a parede e, em seguida, parar de se mover, ele se comportará um pouco como se recuperasse da parede.

Para resolver isso,Rigidbody 2D selecione o objeto de caractere e altere "Detecção de colisão" para "Contínuo" do componente.

A diferença entre "descontínuo" e "contínuo" é a seguinte.

Descontínuos

A detecção de colisão é um mecanismo que pensa depois de se mover. É uma forma que realiza a detecção de colisão a partir do estado em que é movida e embutida na parede. É fácil de entender se você associá-lo a trampolins e borracha, mas quanto mais ele estiver embutido, mais repulsiva a força aumentará, e o salto será mais forte. Em vez disso, o cálculo é realizado após a movimentação, portanto, o custo de processamento é baixo.

Contínuo

Ele é processado enquanto determina o que está a caminho. Determine se há uma parede entre a posição antes e depois do movimento, Se houver um muro, ele vai julgar a colisão lá e parar, então praticamente não há repulsa. Em vez disso, o custo de processamento aumenta um pouco porque o cálculo é incluído no meio do movimento.

Capturado no canto de um objeto de mapa

Dependendo do programa e local, alguns são pegos e outros não, e a causa não mudou muito. Aliás, isso acontece com cantos angulares como o Box Collider 2D, e não com círculos arredondados.

Mesmo que um fenômeno tão misterioso ocorra, é bom ter cantos arredondados do colisor para evitar problemas. Ele é limitado ao Box Collider 2D, mas para torná-lo redondo, o componente Box Collider 2D do objeto de personagem tem um "raio de borda" e você coloca um valor lá. Se você inserir 1 como uma unidade numérica, ocorrerá arredondamento para o tamanho do objeto. Depende do tamanho, mas é bom colocar cerca de 0,1.

A propósito, o julgamento de acerto aumenta apenas pelo tamanho da redondeza, então por favor, ajuste-o se for grande. Box Collider 2D tem um botão Collider Edit que permite redimensioná-lo diretamente na visualização clicando no botão. Como a linha verde externa é a detecção de acerto real, defina o tamanho para que não seja antinatural.

Depois disso, execute o jogo para garantir que ele não fique arranhado e faça ajustes.