टाइलमैप के साथ हिट डिटेक्शन लागू करें
सत्यापन वातावरण
- विंडोज़
-
- विंडोज 11
- एकता संपादक
-
- 2021.3.3f1
- इनपुट सिस्टम पैकेज
-
- 1.3.0
इस टिप के लिए आवश्यक शर्तें
इस टिप के विवरण के लिए एक आधार के रूप में निम्नलिखित सेटिंग्स पहले से बनाई गई हैं।
इस टिप के लिए आवश्यक शर्तें क्या हैं?
- मानक एकता टाइलमैप्स का उपयोग करके एक टॉप-डाउन 2 डी मानचित्र बनाएं
- मानक भौतिकी के साथ टकराव हैंडलिंग (2 डी)
मानचित्र सामग्री उधार लेने के बारे में
हम निम्नलिखित साइटों से उधार ली गई प्रक्रिया करते हैं।
चलने वाले पात्रों का कार्यान्वयन
सबसे पहले, एक मानचित्र और एक चरित्र लागू करें जो हिट डिटेक्शन करता है। इस वर्ण को कीबोर्ड पर कर्सर कुंजियों के साथ ले जाया जा सकता है। हालांकि, यदि आप एक उचित सैर को लागू करते हैं, तो यह पुस्तक युक्तियों के सार से लंबा और दूर होगा, इसलिए इस बार मैं केवल एक साधारण एकल तस्वीर को स्थानांतरित करूंगा।
यदि आप चलने वाले एनिमेशन को लागू करना चाहते हैं, तो निम्न युक्तियाँ देखें:
प्रोजेक्ट बनाने के बाद, उस ऑब्जेक्ट की स्प्राइट छवि जोड़ें जिसे आप प्रोजेक्ट में ले जाना चाहते हैं।
छवि का चयन करें और निरीक्षक से पिक्सेल प्रति यूनिट 32 पर सेट करें। ऐसा इसलिए है क्योंकि मैपचिप के एक वर्ग का आकार 32 पिक्सेल है, इसलिए यह फिट बैठता है। एक बार कॉन्फ़िगर होने के बाद, नीचे दिए गए "लागू करें" बटन पर क्लिक करें।
स्प्राइट को दृश्य में रखें।
स्प्राइट को स्थानांतरित करने के लिए एक स्क्रिप्ट बनाएँ। यह निम्नलिखित युक्तियों के समान है:
स्क्रिप्ट का नाम 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);
}
}
}
उस स्प्राइट से संलग्न करें जिसे आप स्थानांतरित करना चाहते हैं।
गेम चलाएं और जांचें कि क्या आप इसे कीबोर्ड के साथ स्थानांतरित करना चाहते हैं।
मैपटिप्स तैयार करना
सबसे पहले, हम एक मैपचिप तैयार करेंगे और एक नक्शा बनाएंगे। यह कार्यविधि निम्न युक्तियों के समान है: 2 डी टाइलमैप एक्स्ट्रा के साथ मैपटिप्स भी टकराव का पता लगाने में सक्षम हैं, लेकिन उनका उपयोग इस लेख में नहीं किया जाएगा क्योंकि प्रक्रिया लंबी होगी।
MapTip की मूल छवि तैयार करें और इसे अपनी परियोजना में जोड़ें। ऑपरेशन को समझने में आसान बनाने के लिए, कृपया मानचित्र चिप सामग्री के लिए "चलने योग्य स्थान" और "गैर-चलने योग्य स्थान" तैयार करें।
इसे निरीक्षक में मैपचिप्स के लिए सेट करें और लागू करें बटन पर क्लिक करें। एक बार कॉन्फ़िगर होने के बाद, स्प्राइट संपादक खोलें।
यह एक 32-पिक्सेल मैपटिप है, इसलिए मैं इसे 32 पर विभाजित करूंगा।
टाइल पैलेट टैब का चयन करें। यदि नहीं, तो इसे मेनू से "विंडो > 2 डी -> टाइल पैलेट" के साथ प्रदर्शित करें। एक नया पैलेट बनाएँ। नाम मनमाना है, लेकिन अभी के लिए हम इसे "मैपचिपपैलेट" कहेंगे।
दृश्यों में एक MapChipPalett फ़ोल्डर बनाएँ और इसे निर्दिष्ट करें।
पैलेट में खींचकर एक मैपटिप जोड़ें। इसे आपके द्वारा पहले बनाए गए MapChipPalette फ़ोल्डर में सहेजें।
एक नक्शा बनाएँ
इस बार, मैप हिट निर्णय "टाइलमैप" की इकाइयों में किया जाएगा। इसलिए, हम दो टाइलमैप बनाएंगे, "हिट डिटेक्शन के बिना टाइलमैप" और "हिट डिटेक्शन के साथ टाइलमैप"।
सबसे पहले, पदानुक्रम में दो टाइलमैप बनाएं। आप ग्रिड में दो बना सकते हैं। स्पष्टता के लिए नाम "टाइलमैपओबेजेक्ट" और "टाइलमैपग्राउंड" हैं।
सबसे पहले, एक "TilemapGround" बनाएं। चूंकि यह एक जंगम रेंज है, इसलिए आप बस जमीन बिछा सकते हैं। यदि यह जमीन पर है, तो आप पैटर्न बदल सकते हैं।
वैसे, यदि चरित्र छिपा हुआ है, तो वर्ण ऑब्जेक्ट का चयन करें और निरीक्षक के परत क्रम Sprite Renderer
को 2 पर सेट करें।
परतों का क्रम डिफ़ॉल्ट रूप से 0 है और टाइलमैप 0 है, इसलिए यदि आप इसे इस मान से ऊपर बढ़ाते हैं, तो यह अग्रभूमि में प्रदर्शित होगा।
फिर TilemapObject का चयन करें और उस मैपटिप को रखें जिसे आप गतिहीन बनाना चाहते हैं। पहले लेयर ऑर्डर को 1 पर सेट करें। यह इसे जमीन के सामने दिखाने के लिए है।
अगर आप जमीन छिपाते हैं तो यह कैसा दिखता है।
बेशक, इस बिंदु पर, टक्कर का पता लगाने से संबंधित कोई सेटिंग्स नहीं हैं, इसलिए आप सामान्य रूप से उच्च जमीन पर सवारी कर सकते हैं। इसके बाद, हम टक्कर का पता लगाने के लिए सेट करेंगे।
टक्कर का पता लगाने की सेटिंग्स
सबसे पहले, चलो चरित्र सेट करते हैं। यह सेटिंग लगभग नीचे दी गई युक्तियों के समान है, इसलिए मैं विवरण छोड़ दूंगा और संक्षेप में प्रक्रिया की व्याख्या करूंगा।
पदानुक्रम से किसी वर्ण ऑब्जेक्ट का चयन करें और घटक जोड़ें से भौतिकी 2D -> वृत्त कोलाइडर 2D का चयन करें. यदि वस्तु का आकार आयताकार है, तो "बॉक्स कोलाइडर 2 डी" ठीक है।
इसी तरह, "भौतिकी 2 डी -> रिजिडबॉडी 2 डी" जोड़ें।
स्वचालित गिरावट को रोकने Rigidbody 2D
के लिए गुरुत्वाकर्षण पैमाने को 0 पर सेट करें।
टकराने पर स्प्राइट को घूमने से रोकने के लिए बाधाओं के तहत जेड की जांच करें।
इसके बाद, "टाइलमैपऑब्जेक्ट" चुनें जिसे आप हिट करना चाहते हैं और "घटक जोड़ें" से "टाइलमैप -> टाइलमैप कोलाइडर 2 डी" चुनें।
इसमें बस इतना ही है। आपको किसी प्रोग्रामिंग की भी आवश्यकता नहीं है। गेम चलाएं और दीवार बनने वाली वस्तु को हिट करने का प्रयास करें। मुझे लगता है कि आप यह सुनिश्चित कर सकते हैं कि यह ठीक से बंद हो जाए।
हालांकि, जब आप वास्तव में इसे मारते हैं, तो मुझे लगता है कि व्यवहार में चिंता के बिंदु होंगे। यहाँ कुछ समाधान दिए गए हैं:
मानचित्र और समाधान के साथ हिट डिटेक्शन का असुविधाजनक व्यवहार।
जब आप एक दीवार से टकराते हैं, तो आपको कुछ चीजें मिल सकती हैं जो आपको परेशान करती हैं।
यदि आप दीवार के खिलाफ चलते हैं, तो आप बीच में फंस जाएंगे।
Box Collider 2D
मुझे लगता है कि यह तब होगा जब आप किसी वस्तु का उपयोग कर रहे हैं।
उदाहरण के लिए, नीचे दिए गए दृश्य से, जब आप निचले बाएं में कुंजी दबाते हैं, तो आप चाहते हैं कि यह दीवार के साथ बाईं ओर जाए। हालांकि, कुछ प्रगति के बाद, मुझे लगता है कि यह किसी चीज में फंस जाएगा और रुक जाएगा।
स्थिति के आधार पर दीवारों में सेंध को पहचानें
Circle Collider 2D
मुझे लगता है कि यदि आप संलग्न करते हैं तो इसे समझना आसान है।
दीवार सपाट होनी चाहिए, लेकिन यदि आप इसे दीवार के खिलाफ ले जाते हैं, तो आप देखेंगे कि दीवार असमान है।
गड़बड़ियों और धक्कों के कारण और समाधान
ऐसा होने का कारण यह प्रतीत होता है कि "हिट निर्धारण एक मैपचिप आधार पर किया जाता है"। वास्तव में, जब आप TilemapObject का चयन करते हैं, तो एक हरी रेखा उस स्थान पर दिखाई देती है जहां हिट डिटेक्शन स्थित है, और आप देख सकते हैं कि यह MapTip इकाइयों में खींची गई रेखा है।
इसलिए, यदि चलती वस्तु बिल्कुल एक मानचित्र चिप के बराबर रेखा पर है, तो इसे एक मानचित्र चिप के साथ हिट के रूप में आंका जाएगा। यदि आप मानचित्र चिप्स की सीमा पर टकराते हैं, तो दो मैप चिप्स हिट और जज किए जाएंगे, इसलिए उछाल की ताकत बढ़ जाएगी।
मुझे लगता है कि इस समस्या को हल करने का सबसे अच्छा तरीका संलग्न मैपचिप्स के साथ हिट डिटेक्शन को जोड़ना है। यहां बताया गया है कि यह कैसे करना है:
निरीक्षक से हिट डिटेक्शन के साथ "टाइलमैपऑब्जेक्ट" चुनेंTilemap Collider 2D
और "समग्र में उपयोग" की जांच करें।
जैसा कि चेतावनी में कहा गया है, अकेले इसका कोई प्रभाव नहीं है, इसलिए "घटक जोड़ें" से "भौतिकी 2 डी -> कम्पोजिट कोलाइडर 2 डी" चुनें।
रिजिडबॉडी 2 डी को कम्पोजिट कोलाइडर 2 डी के साथ जोड़ा गया है।
यह थोड़ा भ्रामक है, लेकिन मुझे लगता है कि आप पुष्टि कर सकते हैं कि हिट डिटेक्शन के साथ मैपचिप्स के बीच की सीमा पर हरी रेखा गायब हो गई है।
मैं टाइलमैप को स्थानांतरित नहीं करना चाहता, इसलिए मैं घटक शरीर के प्रकार को "स्थिर" के रूप में छोड़ दूंगा Rigidbody 2D
।
अब गेम चलाएं और इसे आगे बढ़ाने की कोशिश करें। मुझे लगता है कि भले ही आप दीवार के साथ तिरछे चलते हैं, यह पकड़ा नहीं जाएगा और आप ऊबड़-खाबड़ आंदोलन के बिना आसानी से आगे बढ़ सकते हैं।
चरित्र को दीवारों से पीछे धकेलें
आप देख सकते हैं कि यदि आप दीवार को धक्का देने के लिए चरित्र को स्थानांतरित करते हैं और फिर चलना बंद कर देते हैं, तो यह दीवार से वापस उछलने जैसा व्यवहार करेगा।
इसे हल करने के लिए,Rigidbody 2D
वर्ण ऑब्जेक्ट का चयन करें और घटक से "टकराव का पता लगाने" को "निरंतर" में बदलें।
"असंतुलित" और "निरंतर" के बीच का अंतर इस प्रकार है।
सांतर
टकराव का पता लगाना एक तंत्र है जो चलने के बाद सोचता है। यह एक ऐसा रूप है जो उस स्थिति से टकराव का पता लगाता है जहां इसे स्थानांतरित किया जाता है और दीवार में एम्बेडेड किया जाता है। यह समझना आसान है कि क्या आप इसे ट्रैम्पोलिन और रबर के साथ जोड़ते हैं, लेकिन जितना अधिक यह एम्बेडेड होगा, उतना ही प्रतिकारक बल बढ़ेगा, और उछाल मजबूत होगा। इसके बजाय, गणना स्थानांतरित करने के बाद की जाती है, इसलिए प्रसंस्करण लागत कम है।
लगातार
रास्ते में क्या है यह निर्धारित करते समय इसे संसाधित किया जाता है। निर्धारित करें कि क्या चाल से पहले और बाद की स्थिति के बीच एक दीवार है, यदि कोई दीवार है, तो यह वहां टक्कर का न्याय करेगा और रुक जाएगा, इसलिए व्यावहारिक रूप से कोई प्रतिकर्षण नहीं है। इसके बजाय, प्रसंस्करण लागत थोड़ी बढ़ जाती है क्योंकि गणना आंदोलन के बीच में शामिल होती है।
मानचित्र वस्तु के कोने में पकड़ा गया
कार्यक्रम और स्थान के आधार पर, कुछ पकड़े जाते हैं और कुछ नहीं होते हैं, और कारण बहुत अधिक नहीं बदला है। वैसे, यह बॉक्स कोलाइडर 2 डी जैसे कोणीय कोनों के साथ होता है, न कि गोल सर्कल के साथ।
यहां तक कि अगर ऐसी रहस्यमय घटना होती है, तो गड़बड़ी से बचने के लिए कोलाइडर के गोल कोनों का होना अच्छा है। यह बॉक्स कोलाइडर 2 डी तक सीमित है, लेकिन इसे गोल बनाने के लिए, चरित्र ऑब्जेक्ट के बॉक्स कोलाइडर 2 डी घटक में "किनारे त्रिज्या" है और आप वहां एक मान डालते हैं। यदि आप 1 को संख्यात्मक इकाई के रूप में दर्ज करते हैं, तो ऑब्जेक्ट आकार के लिए राउंडिंग होगी। यह आकार पर निर्भर करता है, लेकिन लगभग 0.1 डालना अच्छा है।
वैसे, हिट जजमेंट केवल गोलाई के आकार से बढ़ता है, इसलिए यदि यह बड़ा है तो कृपया इसे समायोजित करें। बॉक्स कोलाइडर 2 डी में एक कोलाइडर एडिट बटन है जो आपको बटन पर क्लिक करके सीधे दृश्य में इसका आकार बदलने की अनुमति देता है। चूंकि बाहरी हरी रेखा वास्तविक हिट डिटेक्शन है, इसलिए आकार निर्धारित करें ताकि यह अप्राकृतिक न हो।
उसके बाद, यह सुनिश्चित करने के लिए गेम चलाएं कि यह खरोंच न हो और समायोजन करें।