कुछ संदर्भों में कुछ वस्तुओं के साथ टकराव को अनदेखा करें


14

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

दूसरी ओर, मैं लाश के साथ टकराव को नजरअंदाज नहीं करना चाहता, क्योंकि मैं अभी भी उन्हें प्रभावित करना चाहता हूं।

मुझे इसे कैसे नियंत्रित करना चाहिए? मूल रूप से, मैं जो चाहता हूं वह कार के लिए है जब कुछ वस्तुओं से टकराते हुए नहीं घूमता।

जवाबों:


7

रनटाइम पर अपनी परतों में हेरफेर करने पर विचार करें।

संपूर्ण परतों वाली कुछ वस्तुओं के लिए टकरावों को सक्षम / अक्षम करना

Physics.IgnoreCollision और Physics.IgnoreLayerCollision आपको क्रमशः दो कोलाइडर और दो परतों के बीच टकराव को अक्षम करने की अनुमति देता है।

यदि आप किसी विशिष्ट कोलाइडर को टकराव से बाहर करना चाहते हैं, तो ऐसा करने के लिए कोई रास्ता नहीं बनाया गया है। यदि आप गैर-महामारी संबंधी कठोरता का उपयोग गैर-ट्रिगर कॉलर के साथ कर रहे हैं, तो हमेशा एक प्रतिक्रिया होगी, भले ही आप टैग द्वारा प्रतिक्रियाओं को फ़िल्टर करने का प्रयास करें।

जिस तरह से हमने अपनी परियोजना पर यह पूरा किया वह "शून्य" नामक एक परत बनाने के लिए था। शून्य किसी भी चीज से नहीं टकराता है।

अब आप अस्थायी रूप से एक कोलाइडर की टक्कर को "Void" पर अपनी परत सेट करके अक्षम कर सकते हैं, और अपनी पुरानी परत को पुनर्स्थापित करके इसे फिर से सक्षम कर सकते हैं।

यहाँ जिस्ट है:

int oldLayer = -1;
int voidLayer;

void Start()
{
    voidLayer = LayerMask.NameToLayer("Void");
}

void DisableCollider(Collider col)
{
    oldLayer = col.gameObject.layer;
    col.gameObject.layer = voidLayer;
}

void EnableCollider(Collider col)
{
    col.gameObject.layer = oldLayer;
}

हमने ऐसा विशेष रूप से इसलिए किया क्योंकि उन राइडर को सक्षम करना और निष्क्रिय करना जो कठोर बच्चों के बच्चे थे, कुछ परिस्थितियों में वास्तव में चीजों को पेंच कर सकते हैं। तो आप मज़बूती से एक कंपाउंड रिगिडबॉडी कोलाइडर के हिस्से को निष्क्रिय नहीं कर सकते हैं, लेकिन आप मज़बूती से किसी कंपाउंड कोलाइडर भागों की परत के चारों ओर स्वैप कर सकते हैं।

अब आपकी विशिष्ट स्थिति

आपकी कार पर होने वाले जॉम्बी के टकराव को कम करने के लिए, अपनी लाश को काइनेमैटिक कठोरता से ट्रिगर करने पर विचार करें, या अन्यथा उनके द्रव्यमान को बहुत छोटा करें (जैसे फ्लोट.इप्सिलॉन), इसलिए प्रभाव का कार की गति पर शून्य प्रभाव पड़ता है। प्रभाव पर, आप इस लेयर स्विच को भी कर सकते हैं, ताकि बाद में टकराव शुरू न हो, भले ही पहले वाला कार बॉडी के लिए एक नगण्य बल लागू करता हो।

आप उन्हें एक ऐसी परत पर भी ले जा सकते हैं जो कार से नहीं टकराती है।

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

आपको खुद से पूछना होगा:

  • क्या मैं अपनी कार के साथ भागा हुआ लाश खटखटाने में सक्षम होना चाहता हूं, या उन्हें सिर्फ एक मौत का एनीमेशन खेलना चाहिए?

  • क्या मुझे परवाह है अगर लाश को मारने से कार का वेग और कोणीय वेग छोटे तरीके से प्रभावित होता है?


1

कॉल Physics.IgnoreCollision सभी लाश पर, समारोह खिलाड़ी वस्तु के रूप में अच्छी तरह से गुजर रहा है, जब कार बढ़ाने शुरू होता है। यह एकता खिलाड़ी और लाश के बीच किसी भी टकराव पर प्रतिक्रिया नहीं करने का कारण होगा। जब कार बूस्टिंग खत्म हो जाती है, तो Physics.IgnoreCollisionप्रत्येक ज़ोंबी के लिए फिर से कॉल करें, इसे प्लेयर ऑब्जेक्ट पास करें और falseफिर से शुरू करने के लिए टकराव-प्रतिक्रिया का कारण बनें।


लेकिन इसका मतलब यह है कि वे किसी भी चीज़ से नहीं टकराएंगे।
पॉल मंटा

मैं कुछ और शोध करूँगा। केवल एक चीज जिसके बारे में मैं सोच सकता हूं: शायद आप ऑनकॉलिजन ईंटर से झूठे टकराव को अनदेखा कर सकते हैं?
वाकीदेव 21

@Wackidev यह मामला नहीं है।
Rhys van der Waerden

@Paul मैंने अपना उत्तर संपादित कर लिया है।
वैकेदेव

0

मैं अनुमान लगा रहा हूँ कि आप वस्तुओं के नामों की जाँच कर सकते हैं, या वस्तुओं के वर्गों के लिए एक नाम मान जोड़ सकते हैं तो जाँच करें?

bool boosting = false; //need a trigger in the game to set this to true.

function OnCollisionEnter(theCollision : Collision)
{   
    if (boosting == true)
    {
        if(theCollision.gameObject.name == "Zombie")
        {
              Debug.Log("Zombie hit during boost");              
        }
        else if(theCollision.gameObject.name == "Wall")
        {
              Debug.Log("Wall hit during boost");            
        }
    }
    else 
    {
        if(theCollision.gameObject.name == "Zombie")
        {
              Debug.Log("Zombie hit not in boost");              
        }
        else if(theCollision.gameObject.name == "Wall")
        {
              Debug.Log("Wall hit not in boost");                
        }
    }
}

तो बस एक और चर है जिसे आप बूस्टिंग के लिए जांचने के लिए उपयोग कर सकते हैं और चेक में जोड़ सकते हैं।

संपादित करें: इस चर को इसमें जोड़ा गया।


वह जानता है कि टकराव की सूचना कैसे दी जाए; वह सिर्फ यह नहीं चाहता है कि परिणाम के रूप में कोई कार्रवाई की जाए। वह कुछ मामलों में अंतर्निहित टक्कर प्रतिक्रिया को अक्षम करना चाहता है।
वाकीदेव 21

निश्चित रूप से जो कुछ भी होता है जब टकराव शुरू होता है कोष्ठक के बीच चला जाता है? मैंने पहले एकता का उपयोग नहीं किया है इसलिए मुझे नहीं पता लेकिन cocos2d में, और XNA ने ऐसा किया है।
लुईस

दरअसल, फिजिक्स के माध्यम से ही एकता टक्कर को संभालती है। OnCollisionEnter सिर्फ एक अधिसूचना विधि है; यह वास्तविक टकराव की प्रतिक्रिया को संभालने के लिए डिज़ाइन नहीं किया गया है।
वैकेदेव

0

मुझे लगता है कि आप भौतिक इंजन का उपयोग कर रहे हैं 'विचलन' स्वचालित रूप से आकार / द्रव्यमान पर आधारित होता है जब चीजें एक साथ टकराती हैं? अगर ऐसा है, तो अपनी लाश के द्रव्यमान को बहुत न्यूनतम मान में बदल दें और वे कार को प्रभावित नहीं करेंगे।


0

यहाँ उत्तर की दो कक्षाएं हैं:

  1. टकराव को अनदेखा या अक्षम करना
    • ये समाधान समस्या को हल नहीं करेंगे, वह चाहता है कि हिट होने पर लाश उड़ जाए।
  2. बड़े पैमाने पर परिवर्तन:
    • यह एक अच्छा तरीका है। तदनुसार जड़ता को बदलने के लिए भी मत भूलना।
      • जब आप बूस्ट करते हैं तो आप वैकल्पिक रूप से कारों को बदल सकते हैं मास और जड़ता (जब हम कार पर सभी गैर-किनेमेटिक वस्तुओं के प्रभाव को कम करते हैं)
      • यह सड़क या दीवारों को यह मानते हुए प्रभावित नहीं करना चाहिए कि वे गतिज हैं।

उम्मीद है की यह मदद करेगा!


छह साल पहले के मौजूदा उत्तरों में से दो पहले से ही आपके द्वारा सुझाए जा रहे द्रव्यमान-आधारित दृष्टिकोण की सलाह देते हैं। क्या कोई नई रणनीति है जिसे आप जोड़ना चाहते हैं?
DMGregory

मैं माफी माँगता हूँ, मैं अभी तक नहीं कर पा रहा हूँ और मैं यह सुनिश्चित करना चाहता था कि पॉल मेंटा नेतृत्व नहीं कर रहे थे।
dwuLive
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.