Gestion des collisions avec la physique standard (2D)
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 2D
Box 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.