एकता: बच्चे की वस्तु पर टकराने वाली टक्कर का पता कैसे लगाएं, एक मूल स्क्रिप्ट से?


12

मेरे पास एक दुश्मन है, इस संरचना के साथ

  • दुश्मन
    • तन
      • सिर
      • बांया बांया
      • भुजा दाहिने

और इसी तरह।

मेरे पास शरीर के प्रत्येक भाग के लिए एक कोलाइडर भी है। अपनी "दुश्मन" वस्तु में मैंने एक स्क्रिप्ट संलग्न की है और उस स्क्रिप्ट में मैं शरीर, सिर, हाथ, बाएं आदि के लिए संभावित टक्कर (एक गोली) को रोकना चाहता हूं।

क्या इसे करने का कोई तरीका है?

जवाबों:


16

यदि आप चरित्र के साथ एक कठोर का उपयोग कर रहे हैं, तो आप इसे बॉक्स से बाहर निकाल सकते हैं। :)

तो आपका पदानुक्रम इस तरह दिख सकता है:

  • चरित्र (रिगिडॉडी और नियंत्रण स्क्रिप्ट है)
    • बच्चा (शायद कोलाइडर है)
      • पोता (शायद कोलाइडर है)

OnCollisionEnter संदेश गेमबॉज पर आग लगा देगा, जिसमें रिगिडबॉडी होगी, प्रत्येक कोलाइडर पर चिपकाने के लिए अतिरिक्त रिले स्क्रिप्ट लिखने की आवश्यकता के बिना अपने मूल नियंत्रण स्क्रिप्ट तक पहुंच जाएगी।

यदि आपको यह पता लगाने की आवश्यकता है कि आपके बच्चे में से कौन सा टकराव टकराव में शामिल था, तो आप ऐसा कर सकते हैं:

void OnCollisionEnter(Collision collision) {
    Collider myCollider = collision.contacts[0].thisCollider;
    // Now do whatever you need with myCollider.
    // (If multiple colliders were involved in the collision, 
    // you can find them all by iterating through the contacts)
}

5

इसे हल करने का एक तरीका दो लिपियों का होना होगा: एक शत्रु वस्तु के लिए और दूसरा बच्चे के लिए (जो आपको शत्रु के बच्चों को सौंपने की आवश्यकता है)

जनक लिपि

using UnityEngine;

 public class ParentScript : MonoBehaviour 
 {
     public void CollisionDetected(ChildScript childScript)
     {
         Debug.Log("child collided");
     } 
 }

बाल लिपि

using UnityEngine;

public class ChildScript : MonoBehaviour 
{
     void OnCollisionEnter(Collision collision)
     {
         transform.parent.GetComponent<ParentScript>().CollisionDetected(this);
     }
 }

जब भी किसी बच्चे से टकराव होता है तो इस तरह से आपको सूचना मिलनी चाहिए


2
यदि आप इस तरह के एक समाधान का उपयोग करते हैं और ये टकराव बहुत होता है, तो मैं अत्यधिक बच्चों को उनके माता-पिता के गेमऑबजेक्ट को प्राप्त करने की सलाह देता हूं। जब भी आप एक ही GetComponent को कॉल करने जा रहे हों, तो यह एक अच्छी आदत है और आपको किसी भी ट्रिकियर को बनाने की अनुमति देता है "जो कि माता-पिता को" लॉजिक के लिए भेजने के लिए चेन को खोजने के लिए केवल एक बार होने की आवश्यकता है। यह भी याद रखें कि transform.parent केवल तत्काल माता-पिता को मिलेगा ।
लूनिन

2

आप बस बच्चों को शीर्ष वस्तु दे सकते हैं और सीधे उस पर एक फ़ंक्शन कॉल कर सकते हैं। यह गारंटी देता है कि आपको माता-पिता के प्रचार पर भरोसा करने की आवश्यकता नहीं है। तो आप अंत में मूर्खतापूर्ण चीजें करना पसंद नहीं करते हैंtransform.parent.parent

हालाँकि आप इस प्रक्रिया को GetComponentInParent के साथ स्वचालित कर सकते हैं । यह पहली स्क्रिप्ट को पुनः प्राप्त करता है। फिर कैश करें कि आपकी टक्कर की वस्तु में, कैश्ड ऑब्जेक्ट पर सीधे कॉल फ़ंक्शन।

वैकल्पिक रूप से आप चाइल्ड ऑब्जेक्ट में फ़ंक्शंस को बाँधने के लिए UnityEvents (संदेशों का उपयोग न करें) का उपयोग कर सकते हैं। एकता की घटनाओं के साथ आप किसी भी मनमाने श्रोता को जोड़ सकते हैं ताकि आप बच्चे के हिट होने वाली वस्तु के शीर्ष स्तर की वस्तु को सूचित कर सकें।


1

एकता के जवाबों का सीधा उद्धरण ( आशीष द्विवेदी द्वारा लिखित ):

बच्चे के लिए एक स्क्रिप्ट जोड़ें और उसके अंदर मूल वस्तु की स्क्रिप्ट का एक संदर्भ है। अब मूल विधि में 3 तरीके लिखें (OnCollisionEnter2DChild, OnCollisionStay2DChild, OnCollisionExit2DChild) और तरीकों से संबंधित विधि (OnCollisionEnter2D, OnCollisionStay2D, OnCollisionStay2D, OnCollisionStay2D), जो कि चाइल्ड स्क्रिप्ट स्क्रिप्ट में हैं।


1

आप टकराव पर एक जांच कर सकते हैं और देख सकते हैं कि कौन सा हिट बॉक्स हिट किया गया था और जरूरत पड़ने पर प्रभाव का बिंदु भी प्राप्त कर सकता है।

नोट: कठोरता को उसी ऑब्जेक्ट पर रखा गया है जिसमें Collision Check स्क्रिप्ट है।

यह उदाहरण यह देखने के लिए जाँच कर रहा है कि किसी लक्ष्य पर 'प्रक्षेप्य' हिट किस बॉक्स में है।

private void OnCollisionEnter(Collision collision)
{                 
    if (collision.contacts[0].otherCollider.transform.gameObject.name == "HeadShot")                
       //DO STUFF            

    if (collision.contacts[0].otherCollider.transform.gameObject.name == "BodyShot")
       //DO STUFF    
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.