Çözüldü Unity Diğer Sahneye Geçerken Değişken Aktarma

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

DtEray

Hectopat
Katılım
30 Temmuz 2019
Mesajlar
116
Çözümler
4
Arkadaşlar merhaba. Diğer sahneye geçişte değişken aktarmak istiyorum. Nasıl yapabilirim? İnternetteki çoğu şeyi denedim ama çalışmıyor. Yardımlarınız için şimdiden teşekkür ederim.
 
Çözüm
Cevabınız için çok teşekkür ederim. C# ve uniyt'de biraz yeniyim.
Diyelim public int sayi = "1"; değişkenimiz var. Bunu bu kod ile nasıl kullanabilirim.
Hiç php'ye benzemiyor çok zorlanıyorum 😅
Aşağıdaki değişkeni vereceğimiz script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenGöndermeScripti : MonoBehaviour
{
    int gönderilecekSayi;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();
        manager.sayi = gönderilecekSayi;
    }
}

Aşağıdaki bizim değişken aktarımı yapacağımız script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    public int sayi;
 
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

Aşağıdaki script ise sonraki sahnede değişkeni alacağımız script.
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenAlmaScripti : MonoBehaviour
{
    int gelenDeğişken;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();

        gelenDeğişken = manager.sayi;
    }
}

Kısaca anlatmak gerekirse,
İlk scriptte sahne aktarımında silinmeyen scriptimizi bulup buna istediğimiz değeri veriyoruz. En son adımda ise tekrardan aktarımda görevli scripte erişip, bu script içerisinden istediğimiz deiğişkeni alıyoruz.

DeğişkenGöndermeScripti ile DeğişkenAlmaScripti farklı sahnelerdeki scriptler oluyor.
DontDestroyOnLoad() komutunu kullanabilirsiniz.

Örneğin, aşağıdaki kod gibi yaparsanız; kodun bulunduğu obje artık sahne geçişlerinde her zaman aktif kalacaktır. Bu script ile değişkenlerinizi aktarabilirsiniz.
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}
 
DontDestroyOnLoad() komutunu kullanabilirsiniz.

Örneğin, aşağıdaki kod gibi yaparsanız; kodun bulunduğu obje artık sahne geçişlerinde her zaman aktif kalacaktır. Bu script ile değişkenlerinizi aktarabilirsiniz.
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

Cevabınız için çok teşekkür ederim. C# ve uniyt'de biraz yeniyim.
Diyelim public int sayi = "1"; değişkenimiz var. Bunu bu kod ile nasıl kullanabilirim.
Hiç php'ye benzemiyor çok zorlanıyorum 😅
 
Cevabınız için çok teşekkür ederim. C# ve uniyt'de biraz yeniyim.
Diyelim public int sayi = "1"; değişkenimiz var. Bunu bu kod ile nasıl kullanabilirim.
Hiç php'ye benzemiyor çok zorlanıyorum 😅
Aşağıdaki değişkeni vereceğimiz script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenGöndermeScripti : MonoBehaviour
{
    int gönderilecekSayi;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();
        manager.sayi = gönderilecekSayi;
    }
}

Aşağıdaki bizim değişken aktarımı yapacağımız script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    public int sayi;
 
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

Aşağıdaki script ise sonraki sahnede değişkeni alacağımız script.
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenAlmaScripti : MonoBehaviour
{
    int gelenDeğişken;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();

        gelenDeğişken = manager.sayi;
    }
}

Kısaca anlatmak gerekirse,
İlk scriptte sahne aktarımında silinmeyen scriptimizi bulup buna istediğimiz değeri veriyoruz. En son adımda ise tekrardan aktarımda görevli scripte erişip, bu script içerisinden istediğimiz deiğişkeni alıyoruz.

DeğişkenGöndermeScripti ile DeğişkenAlmaScripti farklı sahnelerdeki scriptler oluyor.
 
Çözüm
Bunun için çok farklı yöntemler var.

En kolayı statik değişken kullanmak ama pek önerilmiyor.

İkinci yolu yukarıdaki DontDestroy ile GameObject üzerinden aktarma yöntemi.

Diğer bir yöntem de ScriptableObject kullanmak.

Statik değişkenler sınıftan üretilen nesnelere değil de sınıfın kendisine değişken tanımlama anlamına geliyor. Değişkeni tanımlarken public int sayi = "1"; olarak değil de public static int sayi = "1"; olarak tanımlıyorsunuz. Değişkene erişmek için de SınıfAdi.sayi şeklinde erişiyorsunuz. Sahneler arası bu şekilde kullanabilirsiniz.

GameObject aktararak kullanmak için yukarıdaki örnekteki gibi DontDestroy yapıyorsunuz sonraki sahnede ise yine o GameObject üzerinden erişmeniz gerekiyor. Yeni sahnede tabi bu GameObject'e bağlantı kurmanız lazım. Bunun için GameObject.Find().GetComponent<>() gibi arama, bulma componente erişme vs. uğraşmanız lazım.

Son yöntem en kapsamlısı ama bence en temizi ScriptableObject kullanmak. ScriptableObject'teki temel mantık sınıflardan sahnelere eklenen GameObject'ler değil, dosya olarak erişilebilen Asset'ler oluşturmak. Bu Assetler sahneler arası çok kolay kullanılabiliyor. Normal Inspectorden bağlanıp diğer componentlere erişir gibi erişebiliyorsunuz. Burada tam kullanımını anlatmak zor ama ScriptableObject kullanımı diye aratırsanız bulabilirsiniz.

Bence üç yola da bakın. Temel Unity bilginizi geliştirmek için çok güzel bir konu. En kolayı statik değişken kullanmak olsa da bence diğer yöntemler çok daha sağlıklı ve temiz kod yazmayı sağlıyor. Özellikle ScriptableObjectler.
 
Artı -1 Eksi
Aşağıdaki değişkeni vereceğimiz script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenGöndermeScripti : MonoBehaviour
{
    int gönderilecekSayi;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();
        manager.sayi = gönderilecekSayi;
    }
}

Aşağıdaki bizim değişken aktarımı yapacağımız script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    public int sayi;
 
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

Aşağıdaki script ise sonraki sahnede değişkeni alacağımız script.
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenAlmaScripti : MonoBehaviour
{
    int gelenDeğişken;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();

        gelenDeğişken = manager.sayi;
    }
}

Kısaca anlatmak gerekirse,
İlk scriptte sahne aktarımında silinmeyen scriptimizi bulup buna istediğimiz değeri veriyoruz. En son adımda ise tekrardan aktarımda görevli scripte erişip, bu script içerisinden istediğimiz deiğişkeni alıyoruz.

DeğişkenGöndermeScripti ile DeğişkenAlmaScripti farklı sahnelerdeki scriptler oluyor.

Şimdi anladığım kadarıyla toplam 3 script dosyası olacak. İlk sahnede kendi scripti ve DontDestroy scripti yüklü olacak. Sahne değişincede son sahnenin scripti ve yine DontDestroy scripti yüklü olacak değil mi?
 
Aşağıdaki değişkeni vereceğimiz script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenGöndermeScripti : MonoBehaviour
{
    int gönderilecekSayi;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();
        manager.sayi = gönderilecekSayi;
    }
}

Aşağıdaki bizim değişken aktarımı yapacağımız script;
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroy : MonoBehaviour
{
    public int sayi;
 
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

Aşağıdaki script ise sonraki sahnede değişkeni alacağımız script.
Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeğişkenAlmaScripti : MonoBehaviour
{
    int gelenDeğişken;
    void DeğişkeniGönder()
    {
        var manager = GameObject.FindObjectOfType<DontDestroy>().GetComponent<DontDestroy>();

        gelenDeğişken = manager.sayi;
    }
}

Kısaca anlatmak gerekirse,
İlk scriptte sahne aktarımında silinmeyen scriptimizi bulup buna istediğimiz değeri veriyoruz. En son adımda ise tekrardan aktarımda görevli scripte erişip, bu script içerisinden istediğimiz deiğişkeni alıyoruz.

DeğişkenGöndermeScripti ile DeğişkenAlmaScripti farklı sahnelerdeki scriptler oluyor.
Arkadaşlar cevaplarınız için çok teşekkür ederim. Abdullah Bey'in verdiği kodlarla yaptım. Kendisi çok yardımcı oldu. Tekrardan teşekkür ederim. Bir değişken göndermek bu kadar zor olmamalı 😕 Ahhh PHP üzümlü kekim..

SceneManager.LoadScene("oyunsahnesi"){
degisken1 = "";
degisken2 = "";
}

şöyle yapsalar bile bu kadar zahmete değmeyecek 🤷‍♂️

Evet, doğru anlamışsınız.
Abdullah hocam string ve int değişkenlerini bu kodlar ile aktarabiliyoruz. object değişkenini nasıl yapmamız lazım? object olarak atayınca görmüyor çünkü. Bu konuda bilginiz var mı acaba?
 
Son düzenleme:
Abdullah hocam string ve int değişkenlerini bu kodlar ile aktarabiliyoruz. object değişkenini nasıl yapmamız lazım? object olarak atayınca görmüyor çünkü. Bu konuda bilginiz var mı acaba?
Hocam sahneler değişince objeler siliniyor. Bunun için farklı bir yöntem uygulanabilir. Mesela bir int değeri aktarırsınız bu int değerine göre yeni bir obje Instantiate edersiniz. Direk objeyi aktarmak için objeye de DontDestroy komutunu vermeniz gerekiyor.
 

Technopat Haberler

Geri
Yukarı