एकता में 2 डी चरित्र नियंत्रक (पुराने स्कूल platformers वापस पाने की कोशिश)


11

इस दिन मैं एकता के साथ एक 2D चरित्र नियंत्रक बनाने की कोशिश कर रहा हूँ (फ़िसिक्स का उपयोग करके)। मैं जिस्मानी इंजनों के लिए काफी नया हूँ और मुझे लग रहा है कि नियंत्रण महसूस करना वास्तव में कठिन है। अगर मैं किसी समस्या का हल खोज सकता हूं, तो मुझे बहुत खुशी होगी:

यह मेरा अभी फिक्स्ड है:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

मैं यहाँ कोशिश कर रहा हूँ कि कठोर शरीर को केवल एक गुरुत्वाकर्षण और बाएँ और दाएँ के लिए एक रैखिक बल लगाने के लिए स्थानांतरित किया जाए। मेरे पास एक ऐसी भौतिक सामग्री है जो चलती नहीं है और जब चलती है तो 0 घर्षण होता है और स्टैंड के साथ 1 घर्षण। मुख्य समस्या यह है कि मेरे पास ढलान के साथ कोलाइडर हैं और ऊपर जाने (धीमी) से वेग में परिवर्तन होता है, ढलान (तेज) से नीचे जा रहा है और एक सीधे कोलाइडर (सामान्य) पर चलता है। यह कैसे तय किया जा सकता है? जैसा कि आप देख रहे हैं कि मैं एक्स अक्ष के लिए समान वेग लागू कर रहा हूं।

खिलाड़ी के लिए मेरे पास यह पैरों की स्थिति पर एक क्षेत्र के साथ सेटअप है जो मैं जिस पर लागू कर रहा हूं वह कठोर है।

कोई अन्य टिप जो इस के साथ मेरे जीवन को आसान बना सकती है उसका स्वागत है :)।

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


4
पुराने स्कूल प्लेटफ़ॉर्मरों ने पैदल चलने के लिए यांत्रिकी और प्रत्यक्ष गति नियंत्रण (यानी कोई भौतिकी नहीं) के लिए हाथ से चलने वाले "कार्टून भौतिकी" का इस्तेमाल किया। यदि आप चरित्र नियंत्रक को फिर से लिख सकते हैं, तो ऐसा करें, क्योंकि यह एक कठिन भौतिकी सिमुलेशन को कुरकुरे आंदोलनों में उकसाना और उड़ाना मुश्किल है, जो पुराने स्कूल के खेल थे।
पैट्रिक ह्यूजेस

एक रिवाज लिखने की समस्या यह है कि टक्कर का पता लगाना खो जाता है। और रेकास्ट (पर्यावरण के आधार पर, आदि ...) का उपयोग किए बिना इसे पुनर्निर्माण करना आसान नहीं है ... यह उनमें से एक गुच्छा हो सकता है। आप इस स्थितियों को कैसे संभालेंगे?
11

आपके पास उन चीज़ों पर कोलाडर हो सकते हैं जो अभी भी कस्टम एनिमेटेड हैं- जब आप कैनेमैटिक रिडिबॉडी का उपयोग करते हैं। मुझे लगता है कि ज्यादातर स्थितियों में आप वास्तव में इस तरह के आवेदन के लिए वास्तविक दुनिया भौतिकी / सेना आदि नहीं चाहते हैं। यदि आप एक अधिक तकनीकी कोण की तलाश में हैं, तो शायद मानव IK
Runonthespot

1
इस स्थिति में डिफ भौतिकी को परिभाषित करें।
रे_गर्नेर

जवाबों:


7

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


3

आपको शायद खुशी होगी कि महोना ने क्या सिफारिश की है। लेकिन अगर आप एकता के भौतिकी का उपयोग करने जा रहे हैं, तो आप शायद उपयोग करना चाहते हैंForceMode.VelocityChange

उदाहरण:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

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

ForceMode.Impulseसमान है लेकिन कठोर व्यक्ति के द्रव्यमान से प्रभावित होता है। धुन करना कठिन हो जाता है।


2

भले ही आप कैरेक्टर कंट्रोलर कंपोनेंट में निर्मित नापसंद करें (जैसा कि मैं करता हूं), 2 डी प्लेप्ले ट्यूटोरियल के लिए एकता के उदाहरण कोड पर एक नज़र डालें ।

कोड कैरेक्टर कंट्रोलर का उपयोग करते हुए टकराव वाले प्लेटफॉर्म, दुश्मन और बक्से के साथ एक पूर्ण 2D गेमप्ले को लागू करता है।

लेकिन अगर आप भी एक नज़र नहीं रखना चाहते हैं, तो मैं आपको भौतिकी के उपयोग को कम करने और अपने स्वयं के कोड के साथ इसके व्यवहार को कॉपी करने का प्रयास करने का सुझाव देता हूं। इस बात पर निर्भर करता है कि आप किस तरह के 2 डी गेम की योजना बना रहे हैं। उदाहरण के लिए, Rigidbody.velocityअपने चरित्र को स्थानांतरित करने के लिए बल को लागू करने के बजाय आप सीधे उसके साथ गड़बड़ कर सकते हैं Transform.Translate(), जो वस्तु Transform.positionको उसके अक्ष पर आधारित करता है। आप स्वयं या शायद प्लेटफ़ॉर्म या फ़्लोर पर ऑब्जेक्ट से संबंधित forwardऔर निर्धारित कर सकते backहैं Transform.up, इसलिए आपको पता चल जाएगा कि उसका रैंप और उसके एंगल का पता है या नहीं।

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

यदि आप भौतिकी का उपयोग करते रहना चाहते हैं, तो मैं आपकी बिल्कुल मदद नहीं कर सकता क्योंकि मैं इसमें बहुत अच्छा नहीं हूं, लेकिन इस बात का ध्यान रखें कि यह 'ढलान' को धीमा करने के लिए एक सामान्य व्यवहार है क्योंकि शरीर को बनाए रखने के लिए अधिक बल की आवश्यकता होती है , वास्तविक जीवन की तरह।


जब मैंने एकता में प्रवेश किया तो सबसे पहले मैंने उस ट्यूटोरियल को पढ़ा था। समस्या यह है कि नियंत्रण महसूस बहुत बुरा है। यही कारण है कि मैं अपना खुद का समाधान खोजना चाहता था। दूसरी ओर जब आप Transform.Translate () का उपयोग करने के बारे में बात करते हैं तो ढलान और अन्य चीजों को करना इतना आसान नहीं होता है। आपको कई बार (2 या 3 मंजिल के लिए, आपके द्वारा नायक के आकार के आधार पर आगे बढ़ रहे हैं) के लिए किरण डाली जानी चाहिए। मोबाइल उपकरणों के लिए रेकास्ट अच्छा नहीं है, और कम है अगर यो 5. करने के लिए आह। टक्कर टक्कर का पता लगाने के प्रति। शायद मैं गलत हो सकता हूं, लेकिन मुझे ऐसा नहीं लगता।
नोटबंदी

1

क्या आप चाहते हैं कि यह चरित्र नियंत्रक में बनाया गया है । step offsetइस घटक पर संपत्ति सेट करके आप आसानी से ढलान ऊपर और नीचे जाने के लिए एक खिलाड़ी प्राप्त कर सकते हैं।


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

मुझे लगता है कि एक बार जब आप कैरेक्टर कंट्रोलर पर सेटिंग्स के साथ फील करते हैं तो यह अच्छी तरह से काम करता है। आपको क्या कमी लगी?
NoobsArePeople2

पहली बात मुझे यह पसंद नहीं है कि यह कुछ रे कास्ट वाले सामान्य कठोर निकायों के सापेक्ष धीमा है। यह जानने के लिए कि इसे कैसे प्राप्त किया जाए, मुझे लगता है कि मैं अधिक हल्के नियंत्रक कर सकता था। एक अन्य समस्या यह है कि प्लेटफ़ॉर्म किनारों पर एक कैप्सूल / गोलाकार अजीब व्यवहार हो रहा है (इसे कुछ और किरणों के साथ हल किया जा सकता है)। यही कारण है कि मैं अपना रोल करना चाहता हूं।
नोटबंदी

0

यहाँ छवि विवरण दर्ज करेंमुझे लगता है कि यह इसलिए है क्योंकि बल प्लेटफ़ॉर्म के समानांतर नहीं है और परिणाम समाप्त होने से कम और वंश में उच्चतर होता है।

यदि आप समन्वय प्रणाली के लिए एक सापेक्ष बल लागू करते हैं

AddRelativeForce

आप "x" में अधिकतम गति रखना चाहते हैं और इसे एक स्केलर के खिलाफ तुलना करते हैं, याद रखें कि गति एक वेक्टर है और vx और vy की रचना करता है, समतल इलाके में vy शून्य है, लेकिन जरूरी है कि ढलान शून्य से अधिक है।

शरीर की दिशा के अनुसार वेग में परिवर्तन होता है, और इसके सापेक्ष vx इसकी समग्र vx के संबंध में बदलता है

यह आपके V को ऐसे तरीके से संशोधित कर सकता है जो आप नहीं चाहते हैं:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

उसी वैश्विक Vx को बनाए रखना आंख को अजीब लग सकता है। (अवांछित समझौते)

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