Gestion des collisions avec la physique standard (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 place deux objets afin que vous puissiez implémenter le comportement de manipulation d’un objet et d’utilisation de la physique standard de Unity pour pousser l’autre lorsqu’il entre en contact avec l’autre.

À propos, la plupart des paramètres sont les mêmes que la procédure décrite dans l’article précédent « Déterminer si les objets entrent en collision les uns avec les autres (2D) ».

Préparation

La procédure ici est presque la même que les conseils précédents , alors suivons-la en douceur.

Après avoir créé le projet, préparez deux images de sprites qui seront des objets et ajoutez-les. 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 .

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 à 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.

La dernière fois, je voulais obtenir des informations uniquement sur le fait que je l’ai frappé ou non, alors j’ai coché « Make it trigger », mais cette fois je ne le ferai pas. Cela permet la gestion des collisions en physique.

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 .

Réglez l’échelle de gravité sur 0 pour éviter la chute libre en dessous.

De même, ajoutez un composant à l’autre objet « UnityTips_2 » pour marquer Box Collider 2D les hits.

De plus, cette fois, il est nécessaire de se déplacer avec la force de l’adversaire,Rigidbody 2D alors ajoutez . L’échelle de gravité doit être égale à 0.

C’est tout ce qu’il y a à faire. Aucun programme n’est requis pour le moment. Lancez le jeu et essayez de toucher un autre objet.

Je pense que vous pouvez confirmer que si vous poussez l’adversaire comme ça, l’adversaire se comportera comme s’il était poussé. Il est très facile d’utiliser la physique de la fonction standard car aucun programme n’est requis.

Empêcher la rotation des objets

Vous pouvez voir quand vous le touchez, mais si le point de vie se déplace même légèrement, chaque objet tournera. En tant que jeu, il devient souvent contre nature, vous devez donc le régler pour qu’il ne tourne pas.

Rigidbody 2D Le composant a un élément appelé « Rotation fixe » dans « Contraintes », alors cochez Z. Maintenant, vous pouvez travailler pour qu’il ne tourne pas. Essayez de le définir sur deux objets et exécutez le jeu pour le vérifier.

Je pense que vous pouvez être sûr qu’il ne tourne pas, quel que soit l’angle sous lequel vous le poussez.

Faites quelque chose lorsque des objets se heurtent

Par exemple, vous pouvez mettre en œuvre une balle qui frappe un ennemi tout en poussant l’adversaire tout en réduisant la santé de l’ennemi. C’est la même chose que les conseils précédents , car l’événement se produira, vous pouvez donc y faire face.

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 OnCollisionEnter2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

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

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

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

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

Semblable aux conseils précédents------, mais le nom de la méthode est maintenant « OnCollision------2D » au lieu de « OnTrigger2D ».

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.

OnCollisionEnter2D Lorsque les objets se heurtent
OnCollisionStay2D Pendant que les objets se heurtent
OnCollisionExit2D 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 Collision2D cible touchée par (ennemi, objet, Collider2D.collider.tag etc.).

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

OnCollisionStay2D 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 OnCollisionStay2D une courte période. Vous devriez pouvoir voir que la méthode n’est plus appelée après OnCollisionStay2D 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 OnCollisionStay2D est défini sur infiniment petit, la méthode elle-même ne sera pas appelée.