Déterminer si les objets entrent en collision les uns avec les autres (2D)

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.

Au début

Cette astuce explique comment déterminer si deux objets sont en contact. Déplacez un objet avec le clavier.

Préparation

Après avoir créé le projet, préparez deux images du sprite qui sera l’objet. Si vous êtes difficile à préparer, vous pouvez placer deux sprites identiques, mais cette fois, nous les séparerons pour plus de clarté. Les noms sont respectivement « UnityTips » et « UnityTips_2 ».

Ajoutez deux fichiers image en les déposant dans la vue.

Ajoutez un script pour déplacer l’objet gauche avec le clavier. Le nom Player du script est . Le contenu du script est similaire aux conseils de Déplacer, faire pivoter et mettre à l’échelle un sprite.

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    // スプライトの移動処理
    // Translate メソッドでスプライトの位置が移動します
    // Space.World を指定すると回転の影響をうけません
    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 à l’objet sur lequel vous souhaitez exécuter le script.

Exécutez le jeu et vérifiez s’il fonctionne avec les touches du curseur de votre clavier.

Enfin, placez un objet texte pour afficher l’état de détection des collisions. Le nom TextState de l’objet est .

Paramètres de gestion des collisions

À partir de là, vous pouvez configurer les paramètres liés aux collisions.

Tout d’abord, sélectionnez l’objet que vous souhaitez déplacer, « UnityTips », et cliquez sur « Ajouter un composant » dans l’inspecteur. Sélectionnez dans Physics 2D la liste. Physics est un objet 3D, alors ne vous y trompez pas.

Physics 2DBox Collider 2D Sélectionnez parmi . Étant donné que ce sprite est rectangulaire, Box est sélectionné, mais s’il est en forme de cercle, par exemple, sélectionnez d’autres formes telles que Cercle.

Box Collider 2D Puisque le composant sera ajouté, cochez « Make it trigger » dans les paramètres. Cela vous permettra d’obtenir des informations uniquement sur « si vous frappez ou non ».

Rigidbody 2D Ajoutez ensuite les composants de . Vous pouvez l’ajouter à partir de « Physique 2D -> Rigidbody 2D ». Rigidbody donne des informations physiques à l’objet et peut également déterminer les collisions avec desCollider objets qui ont .

Rigidbody Cependant, si vous avez un composant, il contiendra également des informations de gravité dans la direction -Y, donc si vous l’exécutez, il tombera. Réglez donc « Échelle de gravité » sur 0 à partir des paramètres.

Soit dit en passant, s’il s’agit d’un jeu d’action à défilement horizontal, il peut être pratique d’utiliser l’échelle de gravité dans le sens où il s’agit d’une chute libre.

De même, ajoutez un composant à l’autre Box Collider 2D objet « UnityTips_2 ». C’est le côté affecté cette fois, vous n’avez donc pas besoin de modifier les paramètres.

Player Ouvrez le script et ajoutez chaque champ et méthode comme suit :

using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class Player : MonoBehaviour
{
  /// <summary>状態表示用テキストオブジェクト。</summary>
  [SerializeField] private Text TextState;

  // 中略

  /// <summary>衝突した瞬間に呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerEnter2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerStay2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerExit2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }
}

Puisque nous voulons afficher des informations sur le fait qu’il ait été touché ou non, nous allons permettre de l’afficher dans un objet texte comme suit.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

Le processus de détection des collisions est décrit comme suit.

/// <summary>衝突した瞬間に呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerEnter2D(Collider2D partner)
{
  TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
  TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
  TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Rigidbody 2D Chacun des événements ci-dessus se produit lorsqu’un objet qui a entre en collision avec un autre objet Collider 2D qui a . Cela vous permettra de déterminer et de traiter si c’est correct ou non.

Il y a trois événements, dont chacun est appelé au moment suivant.

OnTriggerEnter2D Lorsque les objets se heurtent
OnTriggerStay2D Pendant que les objets se heurtent
OnTriggerExit2D Lorsque les objets quittent l’état de collision

Dans les deux cas, l’objet adversaire reçoit l’objet de l’adversaire comme argument, vous pouvez donc obtenir l’objet de l’adversaire en recherchant Collider2D.gameObject le type de Collider2D cible touchée par (ennemi, objet, Collider2D.tag etc.).

Parmi les OnTriggerEnter2D trois événements ci-dessus, et OnTriggerExit2D sont appelés une fois par collision.

OnTriggerStay2D est appelé chaque image pendant la collision, mais l’événement n’est plus appelé après un certain temps écoulé depuis que les deux objets se sont arrêtés. C’est parce qu’il est considéré comme étant entré dans un état de veille, et il est considéré comme un gaspillage de traitement de calculer les collisions à chaque image avec quelque chose qui ne bouge pas.

Si vous Rigidbody 2D ne voulez pas qu’il se mette en veille, changez le mode veille du paramètre sur « Ne pas dormir ».

Après avoir modifié le code, définissez le texte d’affichage des informations.

Lancez le jeu et déplacez l’objet avec le clavier pour toucher un autre sprite. Vous pouvez voir que trois fonctions sont appelées pour chacune.

Soit dit en passant, si vous touchez un objet puis arrêtez de bouger, la méthode sera appelée pendant OnTriggerStay2D une courte période. Vous devriez pouvoir voir que la méthode n’est plus appelée après OnTriggerStay2D un certain temps.

Cela indique que vous êtes entré dans un état de veille, mais si vous souhaitez modifier l’heure jusqu’à ce que vous entriez dans ce sommeil, vous pouvez le modifier en sélectionnant « Physique 2D » dans les paramètres du projet et en spécifiant le paramètre « Temps de sommeil » en secondes. Il ne peut pas être défini sur 0, mais s’il OnTriggerStay2D est défini sur infiniment petit, la méthode elle-même ne sera pas appelée.