2016-04-14 21 views
0

Sonuç olarak, bir sahneyi yüklediğimde, dosyalarıma kaydedilen bilgilere bağlı olarak belirli veya etkin olmayan nesnelerin olmasını istiyorum.Bir sahnede Gameobject öğelerinin durumunu kaydetme ve kaydetme Birlik

Örnek varlık: Benim oyunda

, bir duvar var benim sahnelerinden birini yüklemek, o zaman belli bir noktaya bir kitaplık itmek ve inaktif olarak ayarlanmalıdır duvarı tetikler. Bu sahneden çıkıp sahneye geri dönüyorum ve duvar tekrar aktif. İstediğim şey duvarın aktif olmadığı zaman, sahneden çıkarken bile etkisiz kalıyor ve daha sonra sahneye geldiğimde görünmeyecek.

Yapmakta olduğum sorun bunun nasıl yapılacağıdır.

[Serializable] 
public class Game_Info { 

    public bool WoodWallEnabled; 

    public void Default(){ 
     WoodWallEnabled = true; 
    } 
} 

Benim WoodWall komut:

public class Get_WoodWall_Info : MonoBehaviour { 

    void Awake() { 
     gameObject.SetActive (Helper_Manager.instance.gameInfo.WoodWallEnabled); 
    } 
} 

Ben var Şu anda ne var oyuncusu "Yeni Oyun" düğmesini tıkladığında yeni bir Game_Info üretmek ve Varsayılan() seçmektir Bunu doğru şekilde yapmadığımı ve bununla başa çıkmanın daha iyi bir yolunun olduğunu hissettiğimi hissediyorum, çünkü bunu yaptığımdan beri, kaydedilen dosyamdan (Get_WoodWall_Info, Get_WoodWall_Info1, vb.) manipüle etmek istediğim her gameobject için benzersiz bir betiğe ihtiyaç olacaktır. ..) ama bunu yapmak için çok miktarda betik oluşturmuş olsam bile, gameobjectlerin durumunu korumanın bir yolunu bulamıyorum.

Bu tür verileri nasıl ele alırsınız?

+0

Ben sorunuzun diğer kısmı için benim cevap düzenlenebilir. Bu bölümü fark etmediğim için üzgünüm. Neyse, umarım yardımcı olur. – DRKblade

cevap

1

Bu durumda PlayerPref'un iyi bir seçim olduğunu düşünüyorum. Böyle yapabilirsiniz:

  • Çağrısı PlayerPrefs.SetInt("wall enabled", active ? -1 : 0);active ile ahşap duvarın durumunu kurtarmak için duvarın durumudur. 0 olarak wall enabled anahtarını ayarlamak isteyebilirsiniz bunun yerine Yardım Yöneticisi değerini kullanmak yerine, PlayerPrefs içinde PlayerPrefs.GetInt("wall enabled") != 0

Değerler kullanmak

  • Ve Get_WoodWall_Info yılında

    , oyun seansları aracılığıyla kaydedilir yeni bir oyun başlattığınızda.

    böyle, tüm oyun nesneler için bir komut dosyası oluşturmak yok Neden DÜZENLEME

    @JoeyL:

    public class StateHandler : MonoBehaviour { 
        void Awake() { 
         string keyName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + gameObject.name; 
         if (PlayerPrefs.GetInt(keyName) == 0) 
          gameObject.SetActive(false); 
        } 
        public void SetActiveState (bool state) { 
         string keyName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + gameObject.name; 
         PlayerPrefs.SetInt(keyName, state ? -1 : 0); 
         gameObject.SetActive(state); 
        } 
    } 
    

    Bu, geçerli sahne adını ve ekli oyun nesne adını kullanacak Anahtar olarak, bu betiği kullanan tüm gameobject'lerin farklı isimleri olduğundan emin olmanız yeterlidir.

  • +0

    SetActiveState (bool stat) öğenizdeki PlayerPrefs.SetInt() parametresinin ilk parametresi keyName olmalıdır? – JoeyL

    +0

    Gerçekten bunun benim aradığım şey olduğunu düşünüyorum! Ben bir 2D RPG başlangıç ​​kiti yapmaktayım ve bunu, PlayerPrefs'in çevrimiçi olarak ne yaptığımdan beri kullanmak için iyi olacağını düşündüğüm için bir araç yapmak için bununla çalışabilirim. Bir senaryo hazırlamak ve konuştukça test yapmak. – JoeyL

    +0

    @JoeyL Oh evet, haklısın, yanılmışım. Ve ayrıca, oyunda iyi şanslar :) – DRKblade

    1

    Yalnızca WoodWallEnabled değişkenini kaydediyorsanız, yukarıda belirtildiği gibi PlayerPref kullanın. Eğer böyle bir nesne konumunda veya Game_Info sınıfındaki her değişken olarak tüm sahneyi bilgileri kaydedilirken eğer Şimdi, tasarruf o PlayerPref kullanarak sonra, JsonUtility.ToJson ile Jsoniçin sınıf dönüştürmek zorundayız.Daha sonra yüklemek için PlayerPref kullanın ve sonra JsonUtility.FromJson ile Game_Info sınıfınıza geri seri hale getirin.

    diziler içeren bir tam çalışma örnekleri:

    Serialize and Deserialize Json and Json Array in Unity

    +0

    Yup, sahnede önemli bilgiler saklıyorum ama her şey değil. Kitabın taşınmasından bahsettiğim gibi, o sahnede yaklaşık 5 tane kitaplık var ama sadece 1'inin bir örneği gibi duruyorum. Bazı sahneler, bazıları daha fazla iken, kaydetmeye ihtiyaç duyan çok az şey var. – JoeyL

    +0

    Yukarıda gönderdiğiniz linkteki çözüm sizin için çalışmalıdır. – Programmer

    +0

    Teşekkür ederim Programcı Kontrol edeceğim. Bu arada bu yöntemi kullanmanın güvenliği nasıl? Bir Unity öğreticisini izlediğimi hatırlıyorum, PlayerPrefs kullanmak kullanıcının istediği dosyaya girip dosyayı düzenleyebileceğinden emin değil. – JoeyL