2013-01-14 27 views
12

में उच्च गति वाले ऑब्जेक्ट को कैसे टक्कर मारें I Android के लिए गेम बनाने का प्रयास करें और मुझे उच्च गति वाली वस्तुओं के साथ समस्या है, वे टकराव नहीं करना चाहते हैं।यूनिटी

मैं क्षेत्र कोलाइडर और बाउंसी सामग्री, और दृढ़ पिण्ड इस परम (गुरुत्वाकर्षण = झूठी, अंतर्वेशन = अमान्य तरीके से, टकराव की जांच = सतत गतिशील)

इसके अलावा, मैं बॉक्स कोलाइडर और बाउंसी सामग्री के साथ 3 दीवारों के साथ क्षेत्र की है।

इस परियोजना सेटिंग्स में मैं सेट क्षेत्र

function IncreaseBallVelocity() { 
rigidbody.velocity *= 1.05; 
} 

function Awake() { 
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse); 

InvokeRepeating("IncreaseBallVelocity", 2, 2); 
} 

के लिए मेरे कोड है: "न्यूनतम प्रवेश जुर्माना सेना के लिए" = 0.001, "सॉल्वर interation गणना" = 50

जब मैं शुरू पर खेलने यह ठीक काम करता है (यह उछालता है) लेकिन जब गति अधिक हो जाती है, तो क्षेत्र सिर्फ दीवार को पास करता है।

क्या कोई मेरी मदद कर सकता है?

धन्यवाद।

संपादित

var hit : RaycastHit; 

var mainGameScript : MainGame; 

var particles_splash : GameObject; 

function Awake() { 
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse); 

InvokeRepeating("IncreaseBallVelocity", 2, 2); 
} 

function Update() { 
if (rigidbody.SweepTest(transform.forward, hit, 0.5)) 
    Debug.Log(hit.distance + "mts distance to obstacle"); 
if(transform.position.y < -3) { 
    mainGameScript.GameOver(); 
    //Application.LoadLevel("Menu"); 
} 
} 

function IncreaseBallVelocity() { 
rigidbody.velocity *= 1.05; 
} 

function OnCollisionEnter(collision : Collision) { 
Instantiate(particles_splash, transform.position, transform.rotation); 
} 

संपादित अधिक जानकारी जोड़ा

  1. फिक्स्ड timestep = 0.02 अधिकतम अनुमति Tir = 0.333
  2. वहाँ संपादक खिलाड़ी में और Android पर खेल चल रहा है कोई फर्क नहीं है
  3. नहीं। यह ठीक दिखता है जब मैं 0.01
  4. सेट करता हूं 210
  5. मेरा पैडल Rigidbody के बिना बॉक्स कोलाइडर है, दीवारें एक ही हैं
  6. भौतिकी में सभी समान परत (जब गति सामान्य होती है यह सभी काम करती है) डिफ़ॉल्ट होती है (छवि में समान होती है) "सॉल्वर इंटरनेशनल कंपनी .. = 50
  7. नहीं। जब मैं गति बदलता हूं तो यह दूसरी दीवार
  8. मैं मानक घन का उपयोग कर रहा हूं लेकिन मैं अपनी स्क्रीन और अन्य वस्तुओं को फिट करने के लिए इसे विस्तार/छोटा करता हूं, जब मैं दीवार का विस्तार करता हूं तो यह ठीक है
  9. नहीं, ये वीडियो http://www.youtube.com/watch?v=edfd1HJmKPY से सरल परियोजना सरल उदाहरण
  10. है मैं गुरुत्वाकर्षण
  11. का उपयोग नहीं करते

उत्तर

4

देखें:

  1. Similar SO Question
  2. A community script तेज वस्तुओं
  3. UnityAnswers post (2)

में स्क्रिप्ट तुम भी बदल रहा है की कोशिश कर सकते करने के लिए अग्रणी प्रबंधन में मदद करने के लिए अनुरेखण रे का उपयोग करता है fixed time step for physics। इस मूल्य को छोटा, एक बार एकता एक दृश्य के भौतिकी की गणना करता है। लेकिन चेतावनी दीजिये, इस मूल्य को बहुत छोटा बनाते हुए, < = 0.005 कहें, संभवतः एक पोर्टेबल डिवाइस पर एक अस्थिर खेल होगा।

उपरोक्त स्क्रिप्ट गोलियों या छोटी वस्तुओं के लिए सबसे अच्छी है।आप कर सकते हैं manually force कठोर शरीर टकराव परीक्षण:

public class example : MonoBehaviour { 
    public RaycastHit hit; 
    void Update() { 
     if (rigidbody.SweepTest(transform.forward, out hit, 10)) 
      Debug.Log(hit.distance + "mts distance to obstacle"); 

    } 
} 
+0

मैं भौतिकी 0.01 के लिए निश्चित समय कदम सेट करने का प्रयास किया जाना चाहिए और यह काम किया, अब क्षेत्र अधिक खड़े हो सकते हैं, लेकिन जब वह तेज़ हो मैं एक ही समस्या है। मैं DontGoThroughThings कोशिश, लेकिन मैं नहीं कर रहा हूँ निश्चित रूप से यह सही तरीका है, मैं बस अपने क्षेत्र जेएस स्क्रिप्ट में कोड कॉपी करता हूं, क्या मुझे कुछ और सेटअप करने की आवश्यकता है? – Kec

+0

@ केईसी नहीं, जब तक आपके क्षेत्र में कठोर घटक हो। स्क्रिप्ट केवल बहुत मोटे परीक्षणों के लिए उपयोगी है और यह परीक्षण के लिए आपके ऑब्जेक्ट का केंद्र संभवतः उपयोग करता है। लेकिन चूंकि आपके पास एक क्षेत्र है, इसलिए आप आसानी से कास्ट कर सकते हैं, निकटतम हिट, और यदि वह हिट <आपके क्षेत्र का त्रिज्या है, तो क्षेत्र को रोकें। – Jerdak

+0

मैं विभिन्न कोशिश करता हूं चीजें लेकिन यह काम नहीं कर रही है। अब मेरे पास यह कोड है, तो क्या आप मुझे बता सकते हैं कि क्या बदलना है। मैं ques को कोड जोड़ता हूं tion। मदद के लिए धन्यवाद। – Kec

1

मुझे लगता है कि मुख्य समस्या Rigidbody के velocity के हेरफेर है। मैं समस्या को हल करने के लिए निम्नलिखित कोशिश करता हूं।

  1. सुनिश्चित करना है कि IncreaseBallVelocity और Rigidbody के हर हेरफेर FixedUpdate भीतर कहा जाता है अपने कोड को पुनः डिजाइन। जांचें कि Transform.position पर कोई अन्य कुशलता नहीं है।
  2. AddForce या इसी तरह के तरीकों का उपयोग करके सीधे सेटिंग वेग को प्रतिस्थापित करने का प्रयास करें ताकि भौतिकी इंजन में सभी निर्भरताओं की गणना करने का उच्च अवसर हो।
  3. यदि भौतिकी गणना से संबंधित अधिक आइटम (मुख्य खिलाड़ी चरित्र, ...) शामिल हैं, तो सुनिश्चित करें कि उनका कोड फिक्स्डअपडेट में भी चलता है।

एक और बिंदु जिस पर मैंने ठोकर खाई थी वह बहुत अधिक है। GameObject स्केल < = 0.01 या> = 100 के साथ भौतिकी गणना पर निश्चित रूप से नकारात्मक प्रभाव पड़ता है। गुरुओं में से किसी एक से docs और this Unity forum entry के अनुसार आपको ट्रांसफॉर्म.scale मानों से बचना चाहिए! = 1

अभी भी खुश नहीं है? ठीक है तो अगला परीक्षण उच्च वेग से शुरू हो रहा है लेकिन कोई त्वरण नहीं है। इस चरण में हम जानना चाहते हैं, अगर उच्च वेग स्वयं या त्वरण समस्या के लिए दोषी है। भौतिक विज्ञान इंजन विफल होने लगने वाले वेगों के मूल्यों को जानना दिलचस्प होगा - कृपया उन्हें पोस्ट करें ताकि हम उनकी तुलना कर सकें।


संपादित करें: कुछ और बातें
6.7 मीटर/सेकंड की जांच के लिए इतना नहीं लग रहा है, ताकि मुझे लगता है कि वहाँ एक विशेष कारण या क्यों कोई बात बिगड़ जाए कारणों में से एक संयोजन है।

  • क्या आपका Maximum Allowed Timestep पर्याप्त है? परीक्षण के लिए मैं 5 से 10x Fixed Timestep का सुझाव देता हूं। ध्यान दें कि यह फ्रेम दर को मार सकता है लेकिन इसे बाद में dfixed किया जा सकता है।
  • क्या संपादक प्लेयर और एंड्रॉइड पर गेम चलाने के बीच कोई अंतर है?
  • क्या आपने 0.01FixedTimestep की वजह से फ्रेम दर में कोई भी बूंद देखी है? यह इंगित करेगा कि भौतिकी इंजन परेशानी में हो सकता है।
  • क्या यह हो सकता है कि स्थिर कोलाइडर (ऑब्जेक्ट वाले कोलाइडर हैं लेकिन Rigidbody) जो अन्यथा चारों ओर स्थानांतरित या घुमाए गए हैं? इससे फिजएक्स के भीतर भारी पुनर्मूल्यांकन होगा।
  • परतों के बारे में क्या: एक ही परत पर सभी दीवारें हैं। क्या शामिल परतें collision detection matrix में उचित रूप से कॉन्फ़िगर की गई हैं?
  • क्या एक ही दीवार पर नो-बाउंस प्रभाव हमेशा होता है? यदि हां, तो क्या आप केवल पहली दीवार की प्रतिलिपि बना सकते हैं और यह देखने के लिए दूसरे स्थान पर रख सकते हैं कि इस विशिष्ट दीवार के साथ कुछ गड़बड़ है या नहीं।
  • यदि अधिक प्रयास नहीं किया जाता है, तो मैं कुछ मानक क्यूब्स सेट करने की कोशिश करता हूं ताकि दीवार सुनिश्चित हो सके कि transform.scale इसके लिए दोष नहीं है (मैंने इसके साथ वास्तव में बुरा अनुभव किया है)।
  • क्या आप एक स्क्रिप्ट के भीतर गुरुत्वाकर्षण या TimeManager.timeScale का उपयोग करते हैं?
  • बीटीडब्ल्यू: क्या आप गुरुत्वाकर्षण का उपयोग कर रहे हैं? (कोई समस्या नहीं सिर्फ
+0

ठीक है, मैंने कुछ परीक्षण किया है और यह एक परिणाम है: 1. जब मैं Velocity = 6.7 सेट करता हूं तो गेंद पहली दीवार में उछालती है लेकिन यह दूसरी बार गुजरती है, उस मामले में OnCollisionEnter कॉल है लेकिन काम नहीं कर रहा है, शायद यह कुछ बाउंसी सामग्री के साथ गलत क्या मैं उपयोग करता हूँ? 2. जब मैं दीवार की चौड़ाई या गेंद त्रिज्या को बढ़ाता हूं तो अच्छा होता है, काम कर रहा है। रिगिडबॉडी के सभी हेरफेर को फिक्स्ड अपडेट के भीतर बुलाया जाता है और मैं increaseBallVelocity का उपयोग नहीं करता, मैं बस rigidbody सेट करता हूं। AddForce (6.7, 6.7, 0, ForceMode.Impulse); – Kec

+0

जब मैं गेंद बनाता हूं तो शुरुआत में गेंद के स्केल पैरामीटर सेट करता हूं और यह सब कुछ है। लेकिन मुझे इसमें अधिक दिलचस्पी है, कि यह ऑनकॉलिजनइंटर कहता है लेकिन कोई उछाल नहीं है, जैसे कि "उछाल" सामग्री के साथ कुछ सही नहीं है। – Kec

+0

@ केक वेल 'बाउंसीनेस = 1' और' बाउंस कम्बाइन = मैक्स 'करना चाहिए। स्केलिंग के बारे में: [डॉक्स] के अनुसार (http://docs.unity3d.com/Documentation/Components/class-transform.html) और [गुरुओं में से एक से फ़ोरम प्रविष्टि] (http: //forum.unity3d .com/threads/105468-मेष-स्केल-फैक्टर-बनाम-ट्रांसफॉर्म-स्केल) आपको Transform.scale मानों से बचना चाहिए! = 1. – Kay

संबंधित मुद्दे