Farklı objeler farklı değerler üretiyor

phan metal

Centipat
Katılım
10 Temmuz 2022
Mesajlar
1.200
Çözümler
5
Her obje attığım kodun içindeki değerler, her obje için ayrı ayrı tutuluyor.

Örneğin a.cs kodunda;
bool a = false;
bool b = false
bool c = false

adında 3 değişken var bu değişkenleri her obje için ayrı ayrı tutuluyor.

Yani player objesi için;
a = true;
b= true;
c = true;

iken enemey objesi için;
a = false;
b = false;
c = false; olabilir.

Bunun önüne nasıl geçerim. Ayrı ayrı değişken değerleri oluşmasın da sadece aynı kod içindeki veriler işlensin.
 
Neden aynı blokta işlenmesini istiyorsun?

Sınıfın dışına çıkartman lazım bu değişkenleri. Eğer
C#:
public class Class {
    bool a = false, b = a, c = a;
    public Class(args) {
        a = false;
        b = true;
        c = true;
    }
}
şeklinde kullanırsan sadece oluşturduğun nesne için değişir bool değişkenler. Ama
PHP:
bool a = false, b = a, c = a;
public void set_Bool() {
    a = false;
    b = true;
    c = b;
}

public class Class {
    public Class() {
        set_Bool();
    }
}
şeklinde kullanırsan bu değerler o scope içerisinde herhangi bir fonksiyondan ve/veya nesne tarafından erişilebilir olur. Dolayısıyla isteğin yerine gelmiş olur. Geliştirirsin.
 
Değişkenleri static yaparak da ortak kullanılabilir hale getirebilirsiniz.

C#:
public static bool a = false;
public static bool b = false;
public static bool c = false;

Bu genelde önerilen bir yöntem değil çünkü uzun vadede kod karışabilir.

Bunun yerine genelde ortak kullanılan değişkenleri ayrı bir scriptte tanımlayıp kullanmak istediğiniz yere Unity üzerinden bağlamak öneriliyor.
 
Değişkenleri static yaparak da ortak kullanılabilir hale getirebilirsiniz.

C#:
public static bool a = false;
public static bool b = false;
public static bool c = false;

Bu genelde önerilen bir yöntem değil çünkü uzun vadede kod karışabilir.

Bunun yerine genelde ortak kullanılan değişkenleri ayrı bir scriptte tanımlayıp kullanmak istediğiniz yere Unity üzerinden bağlamak öneriliyor.
Static ile düzeltilebilir mi?
 
Static ile tanımladığınızda tüm nesneler için ortak değişken oluşturmuş oluyorsunuz. İstediğiniz buysa düzeltilebilir. Neden Player ile Enemy ortak değişken kullanıyor onu bilmiyorum ama yapmak istediğiniz buysa static işinizi görür. public static olarak tanımlarsanız diğer scriptlerden de ClassAdi.StaticDegiskenAdi şeklinde erişebilirsiniz. Hepsi ortak tek bir değeri kullanır.
 
Tam sorunu anlamadim. Her scope icinde ayni isimdeki variable farkli degerler alabiliyor demeye calismissin sanirim, yani "a" variable'a her zaman her yerde ayni olsun istiyorsun sanki?

Eger buysa sorun global readonly immutable constant kullanabilir ya da singleton obje kullanabilirsin.

Eger variable degeri compile time'da assign edilecek ve hic degismeyecekse global immutable constant isini gorur.
Eger zaman icerisinde bu degerler degisecekse singleton yapabilirsin.
Multi-thread ise thread-safety singleton olmasina dikkat et, ortalikta gezen singleton objelerinin %90'i thread-safe degil.
Global deger verip her yerde degistirirsen kodun 50 satirda spagettiye doner.
 
Tam sorunu anlamadim. Her scope icinde ayni isimdeki variable farkli degerler alabiliyor demeye calismissin sanirim, yani "a" variable'a her zaman her yerde ayni olsun istiyorsun sanki?

Eger buysa sorun global readonly immutable constant kullanabilir ya da singleton obje kullanabilirsin.

Eger variable degeri compile time'da assign edilecek ve hic degismeyecekse global immutable constant isini gorur.
Eger zaman icerisinde bu degerler degisecekse singleton yapabilirsin.
Multi-thread ise thread-safety singleton olmasina dikkat et, ortalikta gezen singleton objelerinin %90'i thread-safe degil.
Global deger verip her yerde degistirirsen kodun 50 satirda spagettiye doner.
Basit bir oyun yapıyorum. Puzzle oyunu.

Yaklaşık 100 level olacak.

Spagettiye dönmez belki.
 
Basit bir oyun yapıyorum. Puzzle oyunu.

Yaklaşık 100 level olacak.

Spagettiye dönmez belki.

Genel temiz kod yazma prensibi benim dedigim. Her gun uzerinde calistigin projede senin icin spagetti olmaz belki ama 6 ay sonra donup baktiginda "bu ne arkadas" tepkisi verebilirsin. Aliskanlik olmadan dogrusunu ogrenmek gerek bence.

Hackaton ya da code challenge yapmiyorsan bence cok gerekli bir skill temiz, anlasilir ve reusable kod yazabilmek.
 
Değişkenleri static yapmak ya da global başka bir classta tanımlamak bu işi çözebilir. Eğer unity kullanıyorsanız bu tarz sabit değişkenleri tutmak için Scriptable Object'ler kullanıp diğer scriptlerde bu objeye erişerek sabit değişkenleri kullanabilirsiniz. Ya da birkaç farklı değişken tipi ile oluşmuş objeler yapıp prefabler oluşturup onları kullanabilirsiniz
 

Technopat Haberler

Geri
Yukarı