Çözüldü Unity sahneler arası veri çekme nasıl yapılır?

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

Tunahan Arık

Hectopat
Katılım
22 Ağustos 2020
Mesajlar
560
Çözümler
3
Merhaba, Unity'de ilk sahnede input field ile kullancıdan bir sayı girmesini istiyorum. Sayıyı girdikten sonra devam butonuna basarak farklı bir sahneye geçiyor. Geçtiği sahnede, ilk sahnede girmiş olduğu sayıyı nasıl çekebilirim? Değere static parametresi atamamı söylediler fakat beceremedim. Yardımcı olabilir misiniz?
 
Son düzenleyen: Moderatör:
Çözüm
Kod:
    private static SingletonKod obje = null;
 
    void Awake()
    {
        if( obje == null )
        {
            obje = this;
            DontDestroyOnLoad( this );
        }
        else if( this != obje )
        {
            Destroy( gameObject );
        }
    }
Don't Destroy On Load aradığın metod. Şurayı detaylı inceleyebilirsin.
Kod:
 private static SingletonKod obje = null;

 void Awake()
 {
 if( obje == null )
 {
 obje = this;
 DontDestroyOnLoad( this );
 }
 else if( this != obje )
 {
 Destroy( gameObject );
 }
 }
Don't destroy on load aradığın metot. Şurayı detaylı inceleyebilirsin.

Teşekkür ederim, integer değerini obje olarak göstererek mi yapmalıyım acaba? Anlatım objeyi korumak için zannedersem.
 
Nereden nasıl çekmeye çalıştığına bağlı bu. DontDestroyOnLoad( this.gameObject ); Bu kod sahneler arasında bağlı olduğu GameObject'i silinmeden geçirmek için yeterli. Awake içine yazılmalı.

Yazdığın scripti sahnede tutmak için bir Game Object'e atamış olman lazım. Bu o Game Objesinin ve dolayısıyla üzerindeki scriptin sahneler arasında geçişte silinmesini engellemesi için yeterli olmalı.

Değeri farklı scriptten çekmek istiyorsan o farklı bir konu.
Değeri alınacak script:public static int playerSkoru=10;
Değer kullanılacak script:
Kod:
private static int yerelPlayerSkoru;
yerelPlayerSkoru = DegeriAlınacakScriptAdı.playerSkoru;
//degisken=ScriptAdı.degiskenAdı;
Alternatif olarak update içinde tutup sürekli değeri senkronize edebilirsin. (Değeri güncel tutabilirsin.)
Kod:
private static int yerelPlayerSkoru;
    void Update()
    {
        yerelPlayerSkoru = DegeriAlınacakScriptAdı.playerSkoru;
    }
Uzun zamandır kodlamadım belki yanlış hatırlıyor olabilirim.
 
Son düzenleme:
Kod:
 private static SingletonKod obje = null;

 void Awake()
 {
 if( obje == null )
 {
 obje = this;
 DontDestroyOnLoad( this );
 }
 else if( this != obje )
 {
 Destroy( gameObject );
 }
 }
Don't destroy on load aradığın metot. Şurayı detaylı inceleyebilirsin.

Hocam attığınız linkteki anlatımı yaptım. Sahneler arası geçiş yaparken dont destroy obje ismiyle veriyi aktarıyor, ikinci sahneye geçtiğimde soldaki hierarchy penceresinde görüyorum bunda sıkıntı yok şu an teşekkürler. Ben bir sayı tahmin oyunu yapmaya çalışıyordum. İlk sahnede, oyunun aralığında sayı tutacağı alt ve üst limitleri girmesini istiyorum kullanıcıdan. Dont destroy metoduyla da kullanıcının girdiği bu alt ve üst limit verilerini diğer sahneye aktarıyorum ama asıl yapmak istediğim o değerleri geçilen yeni sahnede kullanabilmek.

Biraz karışık olduğundan ayrıca detaylı yazıyorum.

1. sahnede alt limit ve üst limit almak için 2 input field var. "inputmin" ve "inputmax" isimli 2 değer olarak scripte atadım.
2. sahne olan, oyunun belirtilen alt ve üst limit aralığında bir sayı tutacağı ve tahmin etmeye çalışacağımız asıl oyun sayfasına geçiyoruz.
Benim amacım ilk sahnedeki "inputmin" ve "inputmax" değerlerini 2. sahnede kullanabilmek. Scriptte doğrudan var olmayıp inputfield ile aldığımız için değerleri doğrudan scriptler aracılığıyla aktaramıyorum sanırım.
Zahmet olmazsa tekrar yardımcı olabilir misiniz :).
 
4 Numaralı mesajım tam olarak bunu anlatıyor zaten. Daha net bir anlatımı yok. Input fieldi alıp statik bir değişkene atamanız lazım. Sayı ise kullanmadan integer'e dönüştüreceksiniz.
(int x = Convert.ToInt32(stringDegisken);) Dönüştürmeyi ister sınıf içinde yapın, isterseniz de değişkeni kullandığınız sınıfta.
Kod:
 using UnityEngine.UI;
       public Text Hedef;
       //Input fieldi editörde sürükleyip bırakın
       public static string stringDegeri = Hedef.text.ToString();
ya da
Kod:
using UnityEngine.UI;
public static string inputStringDegeri;
 void Start ()
     {
         var input = gameObject.GetComponent<InputField>().text;
         input.onEndEdit.AddListener(IcerigiAl);
     }
     private void IcerigiAl(string icerik)
     {inputStringDegeri=icerik;}
 
Son düzenleme:
4 numaralı mesajım tam olarak bunu anlatıyor zaten. Daha net bir anlatımı yok. Input fieldi alıp statik bir değişkene atamanız lazım. Sayı ise kullanmadan Integer'e dönüştüreceksiniz.
(int x = Convert.ToInt32(stringDegisken);) dönüştürmeyi ister sınıf içinde yapın, isterseniz de değişkeni kullandığınız sınıfta.
Kod:
 using UnityEngine.UI;
 public Text Hedef;
 //Input fieldi editörde sürükleyip bırakın.
 public static string stringDegeri = Hedef.text.ToString();
Ya da.
Kod:
using UnityEngine.UI;
public static string inputStringDegeri;
 void Start ()
 {
 var input = gameObject.GetComponent<InputField>().text;
 input.onEndEdit.AddListener(IcerigiAl);
 }
 private void IcerigiAl(string icerik)
 {inputStringDegeri=icerik;}

Veriyi alacağım ilk sahnedeki kod:

Kod:
 public static string inputmin;
 public static string inputmax;

//string değerini integer değerine çevirmek için int.Parse kullanılıyormuş.

 int minimum = int.Parse(inputmin);
 int maximum = int.Parse(inputmax);

Olarak değişkenleri belirledim.
İkinci sahnedeki, değişkenleri çekeceğim scriptte de kod olarak şunları yazdım:

Kod:
private static int yerelinputmin = GetInput.minimum;
private static int yerelinputmax = GetInput.maximum;
//GetInput, ilk sahnedeki veriyi almak istediğim scriptin adı.

Bu kodlarda hata mı var acaba çekemiyorum çünkü veriyi. Gameobject içine de atadım scripti. Obje içinde geçiyor diğer sahnede görebiliyorum ama değerleri kullanmıyor.
 
Kodun devamı var değil mi? Tamamını paylaşın.

Tabii, bu ilk sahnedeki 2 input fielddan veri alacak GetInput.cs scripti:

C#:
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GetInput : MonoBehaviour.
{
 public static string inputmin;
 public static string inputmax;

 int minimum = int.Parse(inputmin);
 int maximum = int.Parse(inputmax);

 public void Continue(){
 SceneManager.LoadScene(2);
 }

 public void GetMaxValue(string max)
 {
 inputmax = max;
 Debug.Log("Maximum value is: " + inputmax);
 }

 public void GetMinValue(string min){
 inputmin = min;
 Debug.Log("Minimum value is: " + inputmin);
 }
}

Bu da scripti çekeceğim ikinci sahnedeki scriptin kodu. Oyunun butona bas doğruysa doğru yaz gibi ıvır zıvır kısımlarını kırpıyorum gereksiz kalabalık etmesin diye:

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameLogic : MonoBehaviour.
{
 private int randomNumber;
 private static int yinputmin = GetInput.minimum;
 private static int yinputmax = GetInput.maximum;

    void Start()
    {
        ResetGame();
    }
    private void ResetGame(){
        randomNumber = GetRandomNumber(yinputmin, yinputmax);
    }

 private int GetRandomNumber (int min, int max)
 {
 int random = Random.Range(min, max);
 return random;
 }
}
 

Yeni konular

Yeni mesajlar

Geri
Yukarı