सब लोग!

मैं समस्या में भाग गया। मुझे दुश्मन के हमले का दायरा बनाने की जरूरत है। त्रिज्या को उस पर लटके हुए SphereCollider की त्रिज्या के बराबर होना चाहिए। मैंने इसे LineRenderer की मदद से करने की कोशिश की है जो सर्कल खींचता है। हाँ, वास्तव में यह सर्कल को सही ढंग से खींचता है, लेकिन मेरे सर्कल का त्रिज्या उस पर कोलाइडर के त्रिज्या से कम है, इस तथ्य के बावजूद कि मैंने GetComponent() से एक चर का मान दिया है।

क्या कोई जानता है कि परेशानी क्या है?

मेरे कोड का हिस्सा:

    float x;
    float z;

    float change = 2 * (float)Math.PI / segments;
    float angle = change;

    x = Mathf.Sin(angle) * radius;
    _line.SetPosition(0, new Vector3(x, 0, Mathf.Cos(angle) * radius));

    for (int i = 1; i < (segments + + 2); i++)
    {
        x = Mathf.Sin(angle) * radius;
        z = Mathf.Cos(angle) * radius;

        yield return new WaitForSeconds(drawSpeed);
        _line.SetPosition((int)i, new Vector3(x, 0, z));

        angle += change;
    }
-1
gh272b 23 पद 2020, 18:54

3 जवाब

सबसे बढ़िया उत्तर

टिप्पणियों में आपने उल्लेख किया है कि आप अपना दायरा प्राप्त करते हैं

float radius = _collider.radius;

जहां _collider आपका SphereCollider है।

तो ध्यान दें कि SphereCollider.radius

गोले की त्रिज्या वस्तु के स्थानीय स्थान में मापी जाती है।

गोलाकार त्रिज्या को परिवर्तन के पैमाने से बढ़ाया जाएगा।

मुझे ऐसा प्रतीत होता है कि या तो आपकी वस्तु या उसके माता-पिता में से किसी एक को 1,1,1 से अलग तरीके से स्केल किया गया है, जिस स्थिति में वास्तविक अंतिम त्रिज्या उस पैमाने से प्रभावित होगी।

आपको त्रिज्या को तदनुसार transform.lossyScale के अनुसार मापना होगा जैसे

// Get the lossyScale
// this is the localScale of all parent objects and this localScale combined
var lossyScale = _collider.transform.lossyScale;

// find the biggest extends of the lossyScale
// if you already know they are always equal anyway simply use e.g. lossyScale.x instead   
float maxScale = 0;
for(var i = 0; i < 3; i++)
{
   maxScale = Mathf.Max(maxScale, Mathf.Abs(lossyScale[i]);
}

float radius = _collider.radius * maxScale;
1
derHugo 24 पद 2020, 14:10

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

0
jjxtra 23 पद 2020, 19:39

दुश्मन के हमले की सीमा के लिए कोलाइडर घटक का उपयोग न करें!

सर्कल कोलाइडर घटक जोड़ने के बजाय आपको कोड और भौतिकी के माध्यम से एक कोलाइडर चाहिए।

तुम्हे क्या करना चाहिए?

यह कोड और भौतिकी के माध्यम से एक कोलाइडर का उपयोग करने का एक उदाहरण है:

float theCircleRadios = /* You radios */;
Collider2D[] detectedEnemiesColliders = Physics2D.OverlapCircleAll(theCirclePosition, theCircleRadios, DetectedLayers);

फिर अपनी लाइन lineRenderer radios == theCircleRadios बनाएं।

0
halfer 27 पद 2020, 12:01