emin2045' Alıntı:
UPROPERTY(editanywhere, blueprintreadonly / blueprintreadwrite) ne farkı var bunların? Zaten her yerde editleyemiyor muyuz?
Bunlara "UPROPERTY Specifier"lar deniyor. C++ ta tanımladığınız değişken ya da component ın BP ye geçtiğinizde yani bu C++ classın BP de bir child ını oluşturduğunuz orada neler yapıp neler yapamayacağınızı belirliyor. İlk kullanılış maksadı programcıların yazdığı C++ kodlarının daha sonra Designer lar tarafından kullanılması sırasında yanlışlıkları önlemek, onları uygun şekilde kısıtlamak ve yönlendirmektir.
Bunlardan 2 grup var diye biliriz. Birincisi en önce yazılanlar ki bunlarda kendi içinde Edit.... veya Visible... ile başlayanlar olarak 2 ye ayrılıyor.:
Bu birinci taraf değişkenin ya da component ın editlenip edilenemeyeceğini ya da gözüküp gözükmeyeceğini belirliyor. Visible... ile başlayanlar BP de görülebiliyor ancak değiştirilemiyor. Edit... ile başlayanlar ise hem görülebiliyor hem değiştirilebiliyor. Bunların ikisi birden aynı değişkene verilemiyor. Yani bir değişken hem Visible... ile başlayan hem de Edit ile başlayan specifier a sahip olamaz. Birinden biri seçilmek zorunda:
Visible... ile başlayanlar şöyle:
VisibleDefaultsOnly -> Bu değişken BP de görülebilecek ancak değiştirilemeyecek. Ama görülürkende sadece Defaults ta görünecek. Yani o class ı açtığınızda Defaults kısmında yada sağda details kısmında Class ın kendi penceresi içerisinde gözükecek. Başka hiç bir yerde gözükmeyecek.
VisibleInstanceOnly -> Bu değişken O BP class content browserdan alınıp levele koyulduğunda yani dünya-map içerisinde bir tane yaratıldığında levelin sağında bulunan details kısmında (Yani BP Class ın penceresi içinde değil) güzükecek. Conten Browserda o class çift tıklasanız ve açılsa ama sahneye koymasanız bu değişken gözükmeyecek. Sahneye koyulduğunda sadece o koyulanın details panelinde gözükecek. Yani designer bunu görebilmesi için sahneye bir tane koyması ve sağda details e bakması gerekecek.
VisibleAnywhere -> Yukarıdaki anlattığım iki yerde de gözükecek. BP class yapıldığında hem class penceresinde hem de sahneye konulduğunda levelin sağındaki detailste görülebilecek.
Buraya kadarkiler Visible .... ile başlayanlardı. Şimdi Edit... ile başlayanlar. Unutmayın. Bu ikisi aynı yer bir arada bulunamaz.
EditDefaultsOnly -> Bu değişken visible ile başlayan versionundaki gibi content browserda çift tıklayıp o BP classı açtığımızda defaults bölümünde ya da o pencerede hem görülebilecek hem değiştirilebilecek. Farkı aynı zamanda değiştirilebilmesi.
EditInstanceOnly -> Bu değişken visible ile başlayan versiyonundaki gibi sahneye bir tane koyduğumuzda dışarıdan değiştirilebilecek. Hem görülecek hem değiştirilebilecek. Ancak defaults bölümünde değiştirilemyecek
EditAnywhere -> Bu değişken her yerde yani iki durumda da gösterilecek ve değiştirilebilecek. Yani en serbesti bu.
UPROPERTY() nin içine ilk olarak yukarıdakilerden birini seçerek veriyoruz. Sonra ise ikinci kısım geliyor. BlueprintReadOnly veya BlueprintReadWrite.
BlueprintReadOnly -> Bu değişken BP de "GRAPH" da yani görsel kodlama yaparken "Get" yaparak okuyabiliyoruz ancak "Set" yapamıyoruz.
BlueprintReadWrite -> Bu değişken BP de "GRAPH" da yani görsel kodlama yaparken istersek Get ile değerini okuyabiliyoruz, istersen Set ile yeni bir değer atayabiliyoruz.
İkinci olarak yukarıdaki ikisinden birini seçiyoruz ve Category kısmıyla bir Category belirliyoruz ki BP Graph da sağ tıklayıp ararken o başlık altında rahat bulunsun ya da details panelde diğer değişkenlerden kendi bu başlığı ile tamamen ayrı gözüksün ki gruplama yapabilelim ve rahat bulalım.
Sonuç olarak BP ye geçtiğimiz de değişkenimizle ilgili hiç bir sorun yaşamak istemiyoruz ve ben uğraşamam öyle her yerde her işlemi yapayım diyorsak şöyle yazabiliriz:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category= "Bu Benim Bolum")
int Variable;
Ama tüm bu sistemde çok önemli bir nüans var. Bu değişkenimiz eğer bir "Component" ise (Mesela USceneComponent, USphereComponent ya da USkeletalmeshComponent vb.) ilk aklımıza gelen başına EditAnywhere koymak oluyor. ama YANLIŞ. Componentlar her zaman VisibleAnywhere ile başlıyoruz. Bunun neden böyle olduğunun sebepleri var ama anlatmaya gerek yok. Component tanımlıyorsanız bu hataya düşmeyin.
Yukarıda anlattığım haricinde de bir sürü specifier lar var ( Replicates, Transient, SaveGame vb..) ancak onları zamanı yeri gelince öğrenirsiniz. Çok sık kullanılmıyorlar. Şu sayfada listesi var:
https://docs.unrealengine.com/en-US...re/Reference/Properties/Specifiers/index.html
Kolay gelsin.