मैं वर्तमान में अपने खेल के लिए एक स्वास्थ्य प्रणाली को कोड करने की कोशिश कर रहा हूं और मैं चाहता हूं कि मेरा प्लेयर गेमऑब्जेक्ट हेल्थ पोशन गेमऑब्जेक्ट के साथ टकराव को अनदेखा करे यदि प्लेयर के पास अधिकतम स्वास्थ्य है। मेरी समस्या यह है कि मैं प्लेयर लेयर और हेल्थ पोशन लेयर के बीच टकराव को आसानी से बंद नहीं कर सकता क्योंकि प्लेयर के पास मैक्स हेल्थ होने पर मैं केवल टकराव को अनदेखा करना चाहता हूं। मैंने इसे स्वयं करने की कोशिश की लेकिन यह काम नहीं किया। यहाँ मेरा कोड है:

public class ExampleCodeUA : MonoBehaviour{

public int PlayerMaxHealth = 100, PlayerCurrentHealth;
public HealthBar healthBar;

private void Start()
{
    PlayerCurrentHealth = PlayerMaxHealth;
}

    private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("HealthPotion"))
    {
        if (PlayerCurrentHealth == PlayerMaxHealth)
        {
            Physics2D.IgnoreLayerCollision(6, 7);
        }
        else if (PlayerCurrentHealth > 50)
        {
            GetHealth(PlayerMaxHealth - PlayerCurrentHealth);
        }
        else if (PlayerCurrentHealth <= 50)
        {
            GetHealth(50);
        }

    }
}

void GetHealth(int healing)
{
    PlayerCurrentHealth += healing;
    healthBar.SetHealth(PlayerCurrentHealth);
}

}

1
L1NTHALO 21 अगस्त 2021, 13:12
क्या आप उन परतों के बीच टकराव को नजरअंदाज नहीं कर सकते हैं जब खिलाड़ी के पास अधिकतम स्वास्थ्य होता है और जब खिलाड़ी कुछ स्वास्थ्य खो देता है तो टकराव को बहाल करता है?
 – 
yasirkula
21 अगस्त 2021, 13:49
मैंने ऐसा करने की कोशिश की है, लेकिन जब खिलाड़ी का स्वास्थ्य अधिकतम से कम था तब भी उसके और स्वास्थ्य औषधि के बीच कोई टकराव नहीं था।
 – 
L1NTHALO
21 अगस्त 2021, 18:05

1 उत्तर

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

आप रनटाइम पर अपने भौतिकी विन्यास को संशोधित नहीं करना चाहते हैं। टक्कर से बचने के लिए आप क्या कर सकते हैं... इसे असंभव बना देना है, जिससे टकराने के लिए कुछ भी न हो। आपकी दोनों वस्तुओं में एक कोलाइडर है। आप क्या कर सकते हैं सभी मौजूदा HealthPotion कोलाइडर को उनके कोड को संशोधित करके अक्षम करना है। एक कार्यान्वयन निम्नलिखित हो सकता है:

using System.Collections.Generics;
using UnityEngine;

public class HealthPotion : MonoBehaviour
{
    private static List<HealthPotion> _existingPotions = new List<HealthPotion>();

    public static void EnablePotionsCollider(bool value)
    {
        foreach (var potion in _existingPotions)
        {
            potion._collider.enabled = value;
        }
    }

    private Collider _collider;

    void Awake()
    {
        _collider = GetComponent<Collider>();
    }

    void OnEnable()
    {
        _existingPotions.Add(this);
    }

    void OnDisable()
    {
        _existingPotions.Remove(this);
    }
}

फिर आपको केवल उस विधि को कॉल करना होगा जब आप कर कर सक्षम/अक्षम करना चाहते हैं

HealthPotion.EnablePotionsCollider(value you want);
0
Infenix 21 अगस्त 2021, 18:25
जब मैं इस कोड का उपयोग करता हूं तो मुझे EnablePotionsCollider पर लाइन 9 में दो त्रुटियां मिलती हैं: विधि में एक वापसी प्रकार और एक से अधिक सुरक्षा संशोधक होना चाहिए। मुझे इसे किस लिपि में लिखना है? खिलाड़ी या स्वास्थ्य औषधि लिपि?
 – 
L1NTHALO
21 अगस्त 2021, 18:06
मैंने इसे कंपाइलर के बिना लिखा था इसलिए मैं रिटर्न टाइप भूल जाता हूं (यहां शून्य, हम कुछ भी वापस नहीं करना चाहते हैं)। मैं जवाब संपादित कर रहा हूँ। मैंने जो लिखा है वह पोशन स्क्रिप्ट में लिखा जाना चाहिए, और जब आप टकराव को सक्षम/अक्षम करना चाहते हैं तो अपने प्लेयर स्क्रिप्ट से मेरे उत्तर के नीचे विधि को कॉल करें
 – 
Infenix
21 अगस्त 2021, 18:25
यह काम करता है!! शुक्रिया! मैं इसे घंटों तक हल करने की कोशिश कर रहा हूं और कुछ भी काम नहीं किया। हो सकता है कि एक दिन मैं Google के बिना स्वयं किसी समस्या का समाधान कर दूं :D
 – 
L1NTHALO
21 अगस्त 2021, 19:23
निश्चित रूप से आप करेंगे, इसलिए आप सीखते हैं। मैं आपको यह सुनिश्चित करने की सलाह देता हूं कि आप समझते हैं कि कोड क्या करता है और इसे कॉपी पेस्ट करने के लिए नहीं;)
 – 
Infenix
21 अगस्त 2021, 19:37
हाँ, मैंने ऐसा किया। मैं वास्तव में नहीं जानता था कि कौन सी सूचियां थीं इसलिए मैंने इसके लिए एक ट्यूटोरियल देखा।
 – 
L1NTHALO
21 अगस्त 2021, 22:03