मुझे इकाइयों की दुश्मन "जागरूकता" को कैसे लागू करना चाहिए?


12

मैं RTS / TD हाइब्रिड प्रोटोटाइप गेम विकसित करने के लिए Unity3d का उपयोग कर रहा हूं। इकाइयों और उनके दुश्मनों के बीच "जागरूकता" के लिए सबसे अच्छा तरीका क्या है? क्या प्रत्येक इकाई के पास प्रत्येक शत्रु से दूरी की जाँच करने और सीमा के भीतर संलग्न करने के लिए समझदारी है?

अभी मैं जिस दृष्टिकोण के लिए जा रहा हूं, वह है कि हर इकाई पर ट्रिगर गोले हों। यदि कोई दुश्मन ट्रिगर में प्रवेश करता है, तो यूनिट दुश्मन से अवगत हो जाता है और दूरी की जांच शुरू कर देता है। क्या यह कुछ अनावश्यक जांचों को बचाता है?

यहां सबसे अच्छा अभ्यास क्या है?


मुझे यह जोड़ना चाहिए कि यूनिट / दुश्मन की गिनती सुप्रीम कमांडर
फिल

जवाबों:


10

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

मूल रूप से, आप समूह के दुश्मनों को एक-दूसरे के पास एक साथ कई माता-पिता क्षेत्रों में रखना चाहेंगे। जब एक इकाई को स्थानांतरित किया जाता है, तो आप जाँच करेंगे कि यह प्रत्येक दुश्मन की जाँच करने के बजाय माता-पिता के गोले के विरुद्ध ट्रिगर है। यदि ट्रिगर पेरेंट के गोले के साथ घूमता है, तो आप प्रत्येक दुश्मन की जाँच करेंगे। यदि ऐसा नहीं होता है, तो आप अपने भीतर मौजूद सभी दुश्मनों को त्याग सकते हैं। आप प्रत्येक क्षेत्र के लिए अधिकतम क्षेत्र आकार या शत्रु संख्या के आधार पर कई स्तरों के क्षेत्र निर्धारित करना चाहेंगे और शीर्ष स्तर के क्षेत्र के आधार पर चेक का प्रदर्शन करेंगे। फिर यह प्रत्येक दुश्मन की जाँच करने की आवश्यकता के बिना पेड़ की नीचे चलने की बात है।

प्रत्येक फ्रेम में आवश्यक कदम:

  1. दुश्मनों को स्थानांतरित करें
  2. नए दुश्मन पदों के लिए BVH का पुनर्निर्माण / अद्यतन करें
  3. इकाइयों को स्थानांतरित करें और गोले-वृक्ष के खिलाफ जांचें।

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


3
+1 यह दृष्टिकोण सबसे सरल होगा, हालांकि इसमें कुछ त्रुटियां होंगी। ओपी इसे लागू करना चाहता है और फिर ऑक्ट्री जैसा कुछ लागू कर सकता है। इसके अलावा, अधिकांश आरटीएस में, इकाइयां कुछ देरी से प्रतिक्रिया करती हैं। वास्तव में, खेलों में अधिकांश एआई की गणना 10-30 फ्रेम प्रति सेकंड की जाती है जहां खेल 30-60 फ्रेम प्रति सेकंड (संख्याएं, बिल्कुल, सन्निकटन) पर चल सकता है।
समरसता

धन्यवाद, यह वही था जो मुझे एक कदम आगे ले जाने के लिए आवश्यक था। मैं बीवीएच को देखूंगा और इसे एकता में कैसे लागू किया जाए। बहुत ही शैक्षणिक और सूचनात्मक पोस्ट! +1
फिल

यदि आप RTS में हैं तो ओह और सुप्रीम कमांडर की जाँच करें। यह वास्तव में एक बहुत अच्छा खेल है, जैसा कि सभी क्रिस टेलर खेल वास्तव में हैं।
फिल

7

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

बस प्रत्येक इकाई (इसकी सीमा का प्रतिनिधित्व करते हुए) के लिए एक बड़ी बाउंडिंग-स्फ़ेयर ट्रिगर संलग्न करें OnCollisionEnter()और OnCollisionExit()प्रत्येक यूनिट की सीमा के भीतर दुश्मनों का पता लगाने के लिए कॉलबैक को हैंडल करें ।

ध्यान दें कि जिस मामले में आप रुचि रखते हैं, वह तब होता है जब दूसरी इकाई गोले से टकराती है, न कि तब जब दूसरी इकाई का गोला गोले से टकराता है।


1
मुझे लगता है कि स्वीकृत उत्तर से कम से कम ऊपर उठने की जरूरत है। स्वीकृत उत्तर अध्ययन के लिए अच्छा है, लेकिन यह उत्तर सबसे ऊपर होना चाहिए क्योंकि यह सबसे व्यावहारिक तरीका है।
वैरक्विलेक्स

मेरा मानना ​​है कि आप का मतलब है OnTriggerEnter()और OnTriggerExit()सही है?
जिब स्मार्ट

1

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

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

यहां मैंने एक वीडियो बनाया है जो अवधारणा को समझाता है: https://www.youtube.com/watch?v=MEd6XV2Pecw

और यहाँ एक कार्यान्वयन है: https://www.youtube.com/watch?v=y_ewoxlZlgc

मैं स्टार्टअप पर ग्रिड टाइल के यूनिट संग्रह को शुरू नहीं करने की सलाह देता हूं - लेकिन इसके बजाय केवल संग्रह की आवश्यकता होने पर।

वैकल्पिक रूप से, आप एक्स लंबाई की एक सरणी का उपयोग कर सकते हैं यदि आप जानते हैं कि एक टाइल पर एक्स इकाइयों से अधिक कभी नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.