मानक भौतिकी के साथ टकराव हैंडलिंग (2 डी)

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

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

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

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

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

पहले

यह टिप दो वस्तुओं को रखता है ताकि आप एक वस्तु में हेरफेर करने के व्यवहार को लागू कर सकें और दूसरे के संपर्क में आने पर दूसरे को धक्का देने के लिए यूनिटी के मानक भौतिकी का उपयोग कर सकें।

वैसे, अधिकांश सेटिंग्स पिछले लेख में वर्णित प्रक्रिया के समान हैं "यह निर्धारित करना कि क्या वस्तुएं एक दूसरे से टकराती हैं (2 डी)"।

तैयारी

यहां प्रक्रिया लगभग पिछले सुझावों के समान है, इसलिए चलो इसे सुचारू रूप से प्रवाहित करें।

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

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

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

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

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

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

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

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

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

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

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

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

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

नीचे मुक्त गिरावट को रोकने के लिए गुरुत्वाकर्षण पैमाने को 0 पर सेट करें।

इसी तरह, हिट को चिह्नित Box Collider 2D करने के लिए अन्य ऑब्जेक्ट "UnityTips_2" में एक घटक जोड़ें।

इसके अलावा, इस बार प्रतिद्वंद्वी के बल के साथ आगे बढ़ना आवश्यक है,Rigidbody 2D इसलिए जोड़ें। गुरुत्वाकर्षण पैमाना 0 होना चाहिए।

इसमें बस इतना ही है। इस समय किसी कार्यक्रम की आवश्यकता नहीं है। गेम चलाएँ और किसी अन्य ऑब्जेक्ट को छूने का प्रयास करें।

मुझे लगता है कि आप इस बात की पुष्टि कर सकते हैं कि यदि आप प्रतिद्वंद्वी को इस तरह से धक्का देते हैं, तो प्रतिद्वंद्वी ऐसा व्यवहार करेगा जैसे कि उसे धक्का दिया गया हो। मानक फ़ंक्शन की भौतिकी का उपयोग करना बहुत आसान है क्योंकि किसी प्रोग्राम की आवश्यकता नहीं है।

ऑब्जेक्ट्स को घूमने से रोकें

आप इसे छूने पर देख सकते हैं, लेकिन अगर हिट पॉइंट थोड़ा भी बदल जाता है, तो प्रत्येक ऑब्जेक्ट घूमेगा। एक खेल के रूप में, यह अक्सर अप्राकृतिक हो जाता है, इसलिए आपको इसे सेट करने की आवश्यकता है ताकि यह घूमन सके।

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

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

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

पिछले सुझावों के समान------, लेकिन विधि का नाम अब "ऑनट्रिगर 2 डी" के बजाय "ऑनकोलिजन------2 डी" है।

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

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

OnCollisionEnter2D जब वस्तुएं एक-दूसरे से टकराती हैं
OnCollisionStay2D जबकि वस्तुएं एक-दूसरे से टकरा रही हैं
ऑनकोलिजनएग्जिट 2 डी जब वस्तुएँ टकराव की स्थिति छोड़ देती हैं

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

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

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

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

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

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

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

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