Implémenter la détection des succès avec les tilemaps

Page mise à jour :
Date de création de la page :

Environnement de vérification

Windows
  • Fenêtres 11
Éditeur Unity
  • 2021.3.3f1
Package système d’entrée
  • 1.3.0

Conditions préalables à cette astuce

Les paramètres suivants ont été définis à l’avance comme prémisse pour la description de cette astuce.

Quelles sont les conditions préalables à cette astuce ?

À propos de l’emprunt de matériel cartographique

Nous traitons les emprunts sur les sites suivants.

Mise en œuvre de personnages ambulants

Tout d’abord, implémentez une carte et un personnage qui effectue la détection des hits. Ce caractère peut être déplacé avec les touches du curseur du clavier. Cependant, si vous mettez en œuvre une marche appropriée, elle sera longue et loin de l’essence des conseils du livre, donc cette fois, je ne déplacerai qu’une simple image.

Si vous souhaitez implémenter des animations de marche, consultez les conseils suivants :

Après avoir créé le projet, ajoutez une image de sprite de l’objet que vous souhaitez déplacer vers le projet.

Sélectionnez l’image et définissez le nombre de pixels par unité sur 32 à partir de l’inspecteur. C’est parce que la taille d’un carré de la puce est de 32 pixels, donc cela correspond. Une fois configuré, cliquez sur le bouton « Appliquer » ci-dessous.

Placez le sprite dans la vue.

Créez un script pour déplacer le sprite. Ceci est similaire aux conseils suivants :

Conservez le nom Player du script sous la forme .

Code comme suit :

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

Attachez-le au sprite que vous souhaitez déplacer.

Exécutez le jeu et vérifiez si vous voulez le déplacer avec le clavier.

Préparation de MapTips

Tout d’abord, nous allons préparer une puce et créer une carte. Cette procédure est similaire aux conseils suivants : Les MapTips avec 2D Tilemap Extras sont également capables de détecter les collisions, mais ils ne seront pas utilisés dans cet article car la procédure sera longue.

Préparez l’image originale du MapTip et ajoutez-la à votre projet. Pour rendre l’opération plus facile à comprendre, veuillez préparer un « endroit piétonnier » et un « endroit non accessible à pied » pour le matériau de la puce de carte.

Configurez-le pour MapChips dans l’inspecteur et cliquez sur le bouton Appliquer. Une fois configuré, ouvrez l’éditeur de sprites.

C’est une info-carte de 32 pixels, donc je vais la diviser à 32.

Sélectionnez l’onglet Palette de vignettes. Sinon, affichez-le avec « Fenêtre > palette de tuiles 2D -> » dans le menu. Créez une nouvelle palette. Le nom est arbitraire, mais pour l’instant nous l’appellerons « MapChipPalette ».

Créez un dossier MapChipPalette dans Scenes et spécifiez-le.

Ajoutez un info-bulle en la faisant glisser vers la palette. Enregistrez-le dans le dossier MapChipPalette que vous avez créé précédemment.

Créer une carte

Cette fois, le jugement de frappe de la carte sera effectué en unités de « Tilemap ». Par conséquent, nous allons créer deux Tilemaps, « Tilemap sans détection de hit » et « Tilemap avec détection de hit ».

Tout d’abord, créez deux Tilemaps dans la hiérarchie. Vous pouvez en créer deux dans la grille. Les noms sont « TilemapObeject » et « TilemapGround » pour plus de clarté.

Tout d’abord, créez un « TilemapGround ». Comme il s’agit d’une plage mobile, vous pouvez simplement poser le sol. Si c’est sur le sol, vous pouvez changer le modèle.

Soit dit en passant, si le caractère est masqué, sélectionnez l’objet personnage et définissez l’ordre des calques de l’inspecteur Sprite Renderer sur 2. L’ordre des calques est 0 par défaut et le Tilemap est 0, donc si vous l’augmentez au-dessus de cette valeur, il sera affiché au premier plan.

Sélectionnez ensuite TilemapObject et placez l’info-bulle que vous souhaitez rendre immobile. Définissez d’abord l’ordre des calques sur 1. C’est pour le faire apparaître devant le sol.

Voici à quoi cela ressemble si vous cachez le sol.

Bien sûr, à ce stade, il n’y a pas de paramètres liés à la détection de collision, vous pouvez donc rouler sur un terrain élevé normalement. Après cela, nous définirons la détection de collision.

Paramètres de détection de collision

Tout d’abord, configurons le personnage. Ce paramètre est presque le même que les conseils ci-dessous, je vais donc sauter les détails et expliquer brièvement la procédure.

Sélectionnez un objet personnage dans la hiérarchie et sélectionnez Physique 2D -> Circle Collider 2D dans Ajouter un composant. Si la forme de l’objet est rectangulaire, « Box Collider 2D » est très bien.

De même, ajoutez « Physique 2D -> Rigidbody 2D ».

Réglez l’échelle de gravité sur 0 pour éviter les Rigidbody 2D chutes automatiques.

Cochez Z sous Contraintes pour empêcher le sprite de tourner en cas de collision.

Ensuite, sélectionnez « TilemapObject » que vous souhaitez frapper et sélectionnez « Tilemap -> Tilemap Collider 2D » dans « Ajouter un composant ».

C’est tout ce qu’il y a à faire. Vous n’avez même pas besoin de programmation. Lancez le jeu et essayez de frapper l’objet qui devient le mur. Je pense que vous pouvez vous assurer que cela s’arrête correctement.

Cependant, lorsque vous l’atteindrez, je pense qu’il y aura des points de préoccupation dans le comportement. Voici quelques solutions :

Comportement gênant de la détection des résultats avec la carte et les solutions

Lorsque vous frappez un mur, vous pouvez trouver quelques choses qui vous dérangent.

Si vous vous déplacez contre le mur, vous serez pris au milieu

Box Collider 2D Je pense que cela arrivera si vous utilisez un objet.

Par exemple, à partir de la scène ci-dessous, lorsque vous appuyez sur la touche en bas à gauche, vous voulez qu’elle se déplace vers la gauche le long du mur. Cependant, après quelques progrès, je pense qu’il restera coincé dans quelque chose et s’arrêtera.

Reconnaître les bosses dans les murs par position

Circle Collider 2D Je pense qu’il est facile à comprendre si vous joignez . Le mur doit être plat, mais si vous le déplacez contre le mur, vous verrez que le mur se déplace comme s’il était inégal.

Causes et solutions aux accrocs et aux bosses

La raison pour laquelle cela se produit semble être que « la détermination des coups est effectuée sur la base d’une puce cartographique ». En fait, lorsque vous sélectionnez TilemapObject, une ligne verte apparaît à l’endroit où se trouve la détection de hit, et vous pouvez voir qu’il s’agit d’une ligne tracée dans les unités MapTip.

Ainsi, si l’objet en mouvement se trouve sur une ligne équivalente à exactement une puce de carte, il sera jugé comme un succès avec une puce de carte. Si vous entrez en collision à la limite des puces de carte, deux puces de carte seront touchées et jugées, de sorte que la force du rebond augmentera.

Je pense que la meilleure façon de résoudre ce problème est de combiner la détection de succès avec les puces de carte attachées. Voici comment procéder :

SélectionnezTilemap Collider 2D « TilemapObject » avec détection de succès dans l’inspecteur et cochez « Utiliser en composite » à partir de .

Comme indiqué dans l’avertissement, cela seul n’a aucun effet, alors sélectionnez « Physique 2D -> collisionneur composite 2D » dans « Ajouter un composant ».

Rigidbody 2D est ajouté avec Composite Collider 2D.

C’est un peu déroutant, mais je pense que vous pouvez confirmer que la ligne verte à la limite entre les mapchips avec détection de hit a disparu.

Je ne veux pas que le tilemap se déplace, donc je vais Rigidbody 2D laisser le type de corps du composant comme « statique ».

Maintenant, lancez le jeu et essayez de le faire bouger. Je pense que même si vous vous déplacez en diagonale le long du mur, il ne sera pas pris et vous pouvez vous déplacer en douceur sans mouvement cahoteux.

Éliminez les repoussements de personnages des murs

Vous pouvez voir que si vous déplacez le personnage pour pousser le mur puis arrêter de bouger, il se comportera un peu comme rebondi du mur.

Pour résoudre ce problème,Rigidbody 2D sélectionnez l’objet personnage et remplacez « Détection de collision » par « Continu » à partir du composant.

La différence entre « discontinu » et « continu » est la suivante.

Discontinu

La détection de collision est un mécanisme qui pense après un déplacement. C’est une forme qui effectue une détection de collision à partir de l’état où elle est déplacée et intégrée dans le mur. Il est facile de comprendre si vous l’associez à des trampolines et du caoutchouc, mais plus il est intégré, plus la force augmentera et le rebond sera plus fort. Au lieu de cela, le calcul est effectué après le déménagement, de sorte que le coût de traitement est faible.

Continu

Il est traité tout en déterminant ce qui est en route. Déterminer s’il y a un mur entre la position avant et après le déménagement, S’il y a un mur, il jugera la collision et s’arrêtera, de sorte qu’il n’y a pratiquement pas de répulsion. Au lieu de cela, le coût de traitement augmente un peu parce que le calcul est inclus au milieu du mouvement.

Pris dans le coin d’un objet cartographique

Selon le programme et l’emplacement, certains sont capturés et d’autres non, et la cause n’a pas beaucoup changé. Soit dit en passant, cela se produit avec des coins angulaires comme Box Collider 2D, et non avec des cercles arrondis.

Même si un phénomène aussi mystérieux se produit, il est bon d’avoir des coins arrondis du collisionneur pour éviter les accrocs. Il est limité à Box Collider 2D, mais pour le rendre arrondi, le composant Box Collider 2D de l’objet personnage a un « rayon d’arête » et vous y mettez une valeur. Si vous entrez 1 en tant qu’unité numérique, l’arrondissement se produit pour la taille de l’objet. Cela dépend de la taille, mais il est bon de mettre environ 0,1.

À propos, le jugement de frappe n’augmente que par la taille de la rondeur, veuillez donc l’ajuster s’il est grand. Box Collider 2D dispose d’un bouton Collider Edit qui vous permet de le redimensionner directement dans la vue en cliquant dessus. Étant donné que la ligne verte extérieure est la détection de succès réelle, définissez la taille de sorte qu’elle ne soit pas non naturelle.

Après cela, exécutez le jeu pour vous assurer qu’il ne se raye pas et faites des ajustements.