Bir alanı müfettişte görünür (eklenebilir) ancak kodla erişilemez hale getirme (özel benzeri) nasıl yapılır?


9

Diyelim ki elbette ki buttontype adlı bir değişkenim var .ButtonSystem.Serializable

Bu değişkenin müfettiş aracılığıyla atanabilir olmasını istiyorum, bu yüzden bunu yapıyorum public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Bu da bana şunu veriyor:

resim açıklamasını buraya girin

Şimdi, kodu temiz ve güvenli (organize) tutmak istiyorum ve kapsüllemeyi korumamın gerçek bir nedeni var.

Çalışma zamanında bileşenleri almanın birden fazla yolu olduğunu biliyorum transform.Find("Some/Genius/TypeUnsafe/Path")veya bundan GameObject.Find("3 seconds scene iteration").GetComponent(...).kaçınmak istiyorum.

Nasıl bir değişken birbirine karıştırıyorsunuz private accessöyle ile public accessdenetçisindeki?


Neden bu alanı "güvenli" yapmak istiyorsun / bununla ne demek istiyorsun? Ben tırnak koyarım, çünkü kod istemci makinede çalışırsa, istemci hemen hemen ne isterse yapabilir. privateüçüncü bir tarafın bir alana erişmesini önlemek için tasarlanmamıştır, "gerçekten yaptığım şeye perdenin arkasına bakma" demek için bir yol sağlamak anlamına gelir - yani, çoğunlukla erişmenize engel olun .
Clockwork-Muse

Evet, kapsüllemenin ne için olduğunu biliyorum! : DI çeşit inşa UI/ API MVC/ MVVMdev uygulama için desen (aslında bir oyun istemcisi) ve ben ayırmak zorunda UIdan API. Müfettiş aracılığıyla değerler atamam gerekiyordu, çünkü başka yolu yok. Find()yöntemleri güvensizdir ve sürükleyip bırakarak işleri bir araya getirmek daha kolaydır. Klasik bir OOP çerçevesi oluşturmak gerçekten, gerçekten zor Unityve bunun gibi hileli şeyler aramalısınız.
Jacob

Özel öğenin, değişkeni diğer komut dosyalarından korumadığını unutmayın. Sen taksi akways yansıma veya bazı işaretçi hile ile ulaşmak
Bálint

Yanıtlar:


19

SerializeField Özniteliğini arıyorsunuz

Dokümanlardan:

Unity'yi özel bir alanı serileştirmeye zorla.

Neredeyse asla buna ihtiyacınız olmayacak. Unity komut dosyalarınızı serileştirdiğinde, yalnızca ortak alanları serileştirir. Buna ek olarak, Unity'nin özel alanlarınızdan birini serileştirmesini istiyorsanız, alana SerializeField özniteliğini ekleyebilirsiniz.

Kodunuz şöyle görünecektir:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
okunabilirlik için genellikle hepsini tek bir satıra yazıyorum: [SerializeField] private Button button; Arka arkaya bir sürü alan olduğunda taramanın daha kolay olduğunu düşünüyorum. Ayrıca, "neredeyse hiç buna ihtiyacınız olmayacak" için dokümanları vidalayın; Bunu her zaman tamamen yapıyorum.
Ağustos'ta

1

Özel değişkeninizi , değişkenin önüne SerializeField özniteliğini ekleyerek gösterebilirsiniz . Böyle bir şey

[SerializeField]
private Button button;

Yukarıdaki değişken müfettişinize gösterilecek, ancak diğer sınıflarınız bunu alamayacak. Bunun tersine , müfettişte açılan herkesi HideInInspector özniteliğiyle de gizleyebilirsiniz . Böyle bir şey

[HideInInspector]
public Button button;

Yukarıdaki değişkeninize diğer komut dosyanız tarafından erişilebilir, ancak denetçiye gösterilmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.