C# başka bir fonksiyondan değişken çağırma

Herkese iyi akşamlar ödev olarak unity de bir kim milyoner olmak ister benzeri bir proje yapıyordum ama bir yerde sıkıştım C# ile de çok aşina değilim o yüzden foruma sorayım dedim.


//Burda VerilenCevap değişkenini oluşturdum
public string VerilenCevap;

public void CevapAl()
    {
        //Burada butona basınca CevapAl fonksiyonunu çalıştırıyor ve butonun childreni olan text ögesini alıyor 
        //Ama VerilenCevap Değişkeni fonksiyon dışına çıkmıyor.
        VerilenCevap = GetComponentInChildren<TMPro.TextMeshProUGUI>().text;
    }

public void Check()
    {
        //Burada kullanıcıya Evet Hayır sorusu yönelttim 
        string Karar_str = GetComponentInChildren<TMPro.TextMeshProUGUI>().text;
        Debug.Log(Karar_str); 
        if (Karar_str == "EVET")
        {
            //Eğer kullanıcı Evet e tıklarsa sonra doğruların olduğu bir array ile teker teker bakıyor
            foreach (string DCevap in DogruCevap)
            {
                //İşte burada Verilen cevabı istediğimde başta değer koymadığım için boş değerini veriyor. 
                //Yani CevapAl fonksiyonunda ki atadığım değeri görmezden geliyor.
                //Sorum ise bunu CevapAl fonksiyonundan alamaz mıyız ben internette cevabını bulamadım.
                Debug.Log(VerilenCevap);
                if (DCevap == VerilenCevap)
                {

                    DoğruSayısı++;
                    //Burda soru doğruysa SoruÇek fonksiyonu ile öbür soruya geçiyor.
                    soru.SoruCek();
                }
            }
        }
    }

//Sorum ise bunu CevapAl fonksiyonundan alamaz mıyız ben internette cevabını bulamadım.

İşte bunu yapmanın bir yolu var mıdır eğer yoksa nasıl halledebilirim inşallah yol gösterirsiniz.

Check fonksiyonunu Cevap al içine mi yazacaksınız

VerilenCevap değişkenini CevapAl fonksiyonunda bir değer atıyorum sonra Check fonksiyonunda da atadığım CevapAl içindeyken VerilenCevap a atadığım değeri kullanmak istiyorum.

fonksiyonu çağırın debugtan önce

C# ile çok aşina değilim de lütfen açar mısınız dediğinizi

yani

public void Check()
    {
        //Burada kullanıcıya Evet Hayır sorusu yönelttim 
        string Karar_str = GetComponentInChildren<TMPro.TextMeshProUGUI>().text;
        Debug.Log(Karar_str); 
        if (Karar_str == "EVET")
        {
            //Eğer kullanıcı Evet e tıklarsa sonra doğruların olduğu bir array ile teker teker bakıyor
            foreach (string DCevap in DogruCevap)
            {
                //İşte burada Verilen cevabı istediğimde başta değer koymadığım için boş değerini veriyor. 
                //Yani CevapAl fonksiyonunda ki atadığım değeri görmezden geliyor.
                //Sorum ise bunu CevapAl fonksiyonundan alamaz mıyız ben internette cevabını bulamadım.
                Debug.Log(VerilenCevap);
                if (DCevap == VerilenCevap)
                {

                    DoğruSayısı++;
                    //Burda soru doğruysa SoruÇek fonksiyonu ile öbür soruya geçiyor.
                    soru.SoruCek();
                }
            }
        }
    }

bu kısmda şunu deneyin

public void Check()
    {
        //Burada kullanıcıya Evet Hayır sorusu yönelttim 
        string Karar_str = GetComponentInChildren<TMPro.TextMeshProUGUI>().text;
        Debug.Log(Karar_str); 
        if (Karar_str == "EVET")
        {
            //Eğer kullanıcı Evet e tıklarsa sonra doğruların olduğu bir array ile teker teker bakıyor
            foreach (string DCevap in DogruCevap)
            {
                //İşte burada Verilen cevabı istediğimde başta değer koymadığım için boş değerini veriyor. 
                //Yani CevapAl fonksiyonunda ki atadığım değeri görmezden geliyor.
                //Sorum ise bunu CevapAl fonksiyonundan alamaz mıyız ben internette cevabını bulamadım.
                CevapAl();
                Debug.Log(VerilenCevap);
                if (DCevap == VerilenCevap)
                {

                    DoğruSayısı++;
                    //Burda soru doğruysa SoruÇek fonksiyonu ile öbür soruya geçiyor.
                    soru.SoruCek();
                }
            }
        }
    }

Biraz uzun tuttum kusura bakmayın dediğinizi deniyordum.
Yazbel
Şimdi yukarıda gördüğünüz gibi butonlar ve onların child i olan yazılar var. Ve kodun CevapAl fonksiyonunu şık olarak yaptığım butonlara onClick te yani onlara basıldığında işleme giren fonksiyon işleme girdiğinde o şıkkın altındaki yazıyı alıyor böylece onun doğru mu değil mi olduğunu anlıyorum. Sizin dediğiniz değişikliği yapınca bu sefer Evet Butonunda çalışıyor ve bu yüzden şıktan almak yerine Evet_Text ten alıyor yani olmuyor.

diğer türlü nasıl olmakta peki

Dediğim gibi butonda onClick diye bir şey var yani kodu o butonlara atıyorum sonra onClick te o butona tıklandığı zaman kod içerisinden hangi fonksiyonu çağırabildiğimi seçebiliyorum.

Unity le çok uğraşmadım ama ilk başta sorduğunuz soruda bilgim vardı

C# öğrenseniz sorun kökten çözülür aslında.

C# ve Unity i beraber derslerden vakit kaldıkça bakmaya çalışıyorum. Burada da Python dan aşina olduğum fonksiyonda return olmayınca takılı kaldım. İngilizce forumlarda da insanların açtığı konuları okudum ama şu ana kadar bana cevap olan birşey bulamadım.

Burada debugging yapıp değişkenin değiştiğinden emin olun.

Yazbel
yukarıdaki CevapAl fonksiyonunun içindeki aşağıdaki ise Check fonksiyonun içindeki VerilenCevap değişkeni

Herkese günaydınlar sonunda olayı çözdüm C# tan çok Unity nin kodlarıyla çözdüm sonunda, adım adım anlatıcam şimdi.

Yazbel

    public void CevapAl()
    {
        //Şimdi butona tıkladığımızda tıkladığımız butonun Tag i "SeçilenŞık" olarak değişiyor.
        gameObject.tag = "SeçilenŞık";
        //Buralar o kadar önemli değil
        GameObject x = GameObject.FindGameObjectWithTag("SeçilenŞık");
        SoruEkranı.transform.localScale = new Vector3(0, 0, 0);
        music.Stop();
        SonKararEkranı.SetActive(true);
        //Burada TagDeğişti diyerek fonksiyonun çalıştığını doğruluyorum.
        Debug.Log("TagDeğişti");
    }

Check fonksiyonuna gelirsek

    public void Check()
    {
        //Şimdi burada GameObject.FindGameObjectWithTag ile istediğimiz Tag i içeren gameobject i buluyoruz.
        //Sonrasında GetComponentInChildren deyince o Tag i içeren butonun child i olan text i alıyoruz.
        //O text i alınca seçtiğimiz cevabı almış olduk.
        string VerilenCevap = GameObject.FindGameObjectWithTag("SeçilenŞık").GetComponentInChildren<TMPro.TextMeshProUGUI>().text;
        string Karar_str = GetComponentInChildren<TMPro.TextMeshProUGUI>().text;
        Debug.Log(Karar_str);
        Debug.Log(VerilenCevap);
        if (Karar_str == "EVET")
        {
            foreach (string DCevap in DogruCevap)
            {
                if (DCevap == VerilenCevap)     
                {
                    DoğruSayısı++;
                    Debug.Log("Doğrular:" + DoğruSayısı);
                    //Soru doğruysa SoruCek fonksiyonu ile öbür soruya geçiyoruz.
                    soru.SoruCek();
                    //Buralar yine çok önemli değil
                    SonKararEkranı.SetActive(false);
                    SoruEkranı.transform.localScale = new Vector3(1, 1, 1);
                    music.Play();
                    //Burada da önceki seçtiğimiz şıkkın Tag i hala "SeçilenŞık" olarak durduğu 
                    //için bir daha ki soru da 2 tane "SeçilenŞık" tagli gameobject olması sıkıntı olacak
                    //o yüzden de "SeçilenŞık" Tag inde olan gameobject in Tag ini yeniden "Şık" olarak belirledim.
                    GameObject.FindGameObjectWithTag("SeçilenŞık").tag = ("Şık");
                }
                
            }
        }
     }


Anlamadığınız bir yer varsa lütfen sorunuz. Ve yardım etmeye çalışan herkese teşekkürler.