निर्धारित करें कि क्या वस्तुएं एक दूसरे से टकराती हैं (2 डी)

पेज अद्यतन :
पेज निर्माण की तारीख :

सत्यापन वातावरण

विंडोज़
  • विंडोज 11
एकता संपादक
  • 2021.3.3f1
इनपुट सिस्टम पैकेज
  • 1.3.0

इस टिप के लिए आवश्यक शर्तें

इस टिप के विवरण के लिए एक आधार के रूप में निम्नलिखित सेटिंग्स पहले से बनाई गई हैं।

पहले

यह टिप बताती है कि यह कैसे निर्धारित किया जाए कि दो ऑब्जेक्ट संपर्क में हैं या नहीं। कीबोर्ड के साथ एक ऑब्जेक्ट ले जाएं।

तैयारी

प्रोजेक्ट बनाने के बाद, स्प्राइट की दो छवियां तैयार करें जो ऑब्जेक्ट होंगी। यदि आपको तैयारी करने में परेशानी हो रही है, तो आप दो समान स्प्राइट रख सकते हैं, लेकिन इस बार हम उन्हें स्पष्टता के लिए अलग करेंगे। नाम क्रमशः "यूनिटीटिप्स" और "UnityTips_2" हैं।

दो छवि फ़ाइलों को दृश्य में छोड़ कर जोड़ें।

कुंजीपटल के साथ बाएँ ऑब्जेक्ट को स्थानांतरित करने के लिए कोई स्क्रिप्ट जोड़ें. स्क्रिप्ट का नाम Player है। स्क्रिप्ट सामग्री मूव, रोटेट और स्केल स्प्राइट में युक्तियों के समान है।

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

उस ऑब्जेक्ट से अनुलग्न करें जिस पर आप स्क्रिप्ट चलाना चाहते हैं.

गेम चलाएं और जांचें कि क्या यह आपके कीबोर्ड पर कर्सर कुंजियों के साथ काम करता है।

अंत में, टकराव का पता लगाने की स्थिति प्रदर्शित करने के लिए एक पाठ ऑब्जेक्ट रखें। ऑब्जेक्ट का नाम TextState है।

टक्कर हैंडलिंग सेटिंग्स

यहां से, आप टकराव से संबंधित सेटिंग्स को कॉन्फ़िगर कर सकते हैं।

सबसे पहले, उस ऑब्जेक्ट का चयन करें जिसे आप स्थानांतरित करना चाहते हैं, "यूनिटीटिप्स", और निरीक्षक से "घटक जोड़ें" पर क्लिक करें। सूची से Physics 2D चुनें. Physics एक 3 डी ऑब्जेक्ट है, इसलिए कोई गलती न करें।

Physics 2DBox Collider 2D में से चुनें. चूंकि यह स्प्राइट आयताकार है, इसलिए बॉक्स का चयन किया जाता है, लेकिन यदि यह सर्कल के आकार का है, उदाहरण के लिए, सर्कल जैसे अन्य आकृतियों का चयन करें।

Box Collider 2D चूंकि घटक जोड़ा जाएगा, इसलिए मापदंडों से "इसे ट्रिगर बनाएं" की जांच करें। यह आपको केवल "आप हिट करते हैं या नहीं" के बारे में जानकारी प्राप्त करने की अनुमति देगा।

Rigidbody 2D फिर के घटक जोड़ें। आप इसे "भौतिकी 2 डी -> रिजिडबॉडी 2 डी" से जोड़ सकते हैं। Rigidbody वस्तु को भौतिकी की जानकारीCollider देता है और उन वस्तुओं के साथ टकराव भी निर्धारित कर सकता है जिनके पास है।

Rigidbody हालांकि, यदि आपके पास एक घटक है, तो इसमें -वाई दिशा में गुरुत्वाकर्षण की जानकारी भी होगी, इसलिए यदि आप इसे निष्पादित करते हैं, तो यह नीचे गिर जाएगा। इसलिए मापदंडों से "गुरुत्वाकर्षण पैमाने" को 0 पर सेट करें।

वैसे, यदि यह एक साइड-स्क्रॉलिंग एक्शन गेम है, तो गुरुत्वाकर्षण पैमाने का उपयोग करना इस अर्थ में सुविधाजनक हो सकता है कि यह फ्री फॉल डाउन है।

इसी तरह, अन्य ऑब्जेक्ट "UnityTips_2" में Box Collider 2D एक घटक जोड़ें। यह इस बार प्रभावित पक्ष है, इसलिए आपको किसी भी सेटिंग्स को बदलने की आवश्यकता नहीं है।

Player स्क्रिप्ट खोलें और निम्नानुसार उपयोग करके प्रत्येक फ़ील्ड और विधि जोड़ें:

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

चूंकि हम इस बात की जानकारी प्रदर्शित करना चाहते हैं कि यह हिट हुआ था या नहीं, इसलिए हम इसे निम्नानुसार टेक्स्ट ऑब्जेक्ट में प्रदर्शित करना संभव बनाएंगे।

/// <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}";
}

Rigidbody 2D उपरोक्त घटनाओं में से प्रत्येक तब होती है जब कोई वस्तु जो किसी अन्य वस्तु Collider 2D से टकराती है। यह आपको यह निर्धारित करने और संसाधित करने की अनुमति देगा कि यह सही है या नहीं।

तीन घटनाएं हैं, जिनमें से प्रत्येक को निम्नलिखित समय पर बुलाया जाता है।

OnTriggerEnter2D जब वस्तुएं एक-दूसरे से टकराती हैं
OnTriggerStay2D जबकि वस्तुएं एक-दूसरे से टकरा रही हैं
OnTriggerExit2D जब वस्तुएँ टकराव की स्थिति छोड़ देती हैं

दोनों मामलों में, प्रतिद्वंद्वी वस्तु प्रतिद्वंद्वी की वस्तु को एक तर्क के रूप में प्राप्त करती है, इसलिए आप प्रतिद्वंद्वी की Collider2D वस्तु को हिट किए गए लक्ष्य के प्रकार (दुश्मन, आइटम, Collider2D.tag आदि) को देखकर Collider2D.gameObject प्राप्त कर सकते हैं।

उपरोक्त तीन घटनाओं में OnTriggerEnter2D से, और OnTriggerExit2D उन्हें प्रति टक्कर एक बार कहा जाता है।

OnTriggerStay2D टकराव के दौरान हर फ्रेम कहा जाता है, लेकिन दोनों वस्तुओं के रुकने के बाद एक निश्चित समय बीत जाने के बाद घटना को अब नहीं कहा जाता है। ऐसा इसलिए है क्योंकि इसे नींद की स्थिति में प्रवेश करने के लिए माना जाता है, और इसे किसी ऐसी चीज के साथ हर फ्रेम की गणना करने के लिए प्रसंस्करण की बर्बादी माना जाता है जो आगे नहीं बढ़ रहा है।

यदि आप Rigidbody 2D इसे सोना नहीं चाहते हैं, तो पैरामीटर के नींद मोड को "नींद न लें" में बदलें।

कोड बदलने के बाद, जानकारी प्रदर्शित करने के लिए पाठ सेट करें।

गेम चलाएं और ऑब्जेक्ट को किसी अन्य स्प्राइट को छूने के लिए कीबोर्ड के साथ ले जाएं। आप देख सकते हैं कि प्रत्येक के लिए तीन फ़ंक्शन बुलाए जाते हैं।

वैसे, यदि आप किसी वस्तु को छूते हैं और फिर चलना बंद कर देते हैं, तो विधि को थोड़े समय के लिए OnTriggerStay2D बुलाया जाएगा। आपको यह देखने में सक्षम होना चाहिए कि विधि को अब एक निश्चित समय के बाद OnTriggerStay2D नहीं कहा जाता है।

यह इंगित करता है कि आपने नींद की स्थिति में प्रवेश किया है, लेकिन यदि आप इस नींद में प्रवेश करने तक समय बदलना चाहते हैं, तो आप प्रोजेक्ट सेटिंग्स से "2 डी भौतिकी" का चयन करके और सेकंड में "नींद का समय" पैरामीटर निर्दिष्ट करके इसे बदल सकते हैं। इसे 0 पर सेट नहीं किया जा सकता है, लेकिन यदि इसे OnTriggerStay2D असीम रूप से छोटा सेट किया गया है, तो विधि को ही नहीं कहा जाएगा।