Unity'den React Native'e geçerken en çok kafam karışan şey framework'ün dili değildi — terminolojisiydi. Component, State, Props... Bunlar ne demek? Ama bir süre sonra fark ettim: Unity'de bunları zaten biliyordum, sadece farklı isimler kullanıyordum.
GameObject = Component (Neredeyse)
Unity'de her şey bir GameObject'tir. Sahnedeki bir küp, bir ışık kaynağı, görünmez bir yönetici — hepsi GameObject. Bunlara davranış eklemek için MonoBehaviour script'leri attach edersiniz.
React Native'de her şey bir Component'tir. Bir buton, bir metin kutusu, görünmez bir context sağlayıcı — hepsi component. Bunlara davranış eklemek için props ve hooks kullanırsınız.
Fark şu: Unity'de bu ilişki görsel bir editörde kurulur. React Native'de kod yazarak kurulur.
// Unity MonoBehaviour düşünce yapısıyla React Native Component
function PlayerCard({ name, score }: { name: string; score: number }) {
return (
<View style={styles.card}>
<Text style={styles.name}>{name}</Text>
<Text style={styles.score}>{score}</Text>
</View>
);
}
State = Inspector Değişkenleri
Unity'de [SerializeField] ile Inspector'da görebileceğiniz değişkenler tanımlarsınız. Runtime'da bu değerler değişince GameObject güncellenir.
React Native'de useState hook'u tam olarak bunu yapar. State değişince component yeniden render edilir.
// Unity'deki [SerializeField] private int _health = 100;
// React Native karşılığı:
const [health, setHealth] = useState(100);
Props = Inspector'a Dışarıdan Veri Vermek
Unity'de bir script'e prefab'dan ya da başka bir script'ten değer atayabilirsiniz. React Native'de bunu props ile yaparsınız.
Temel fark: Unity'de bu bağlantı editörde kurulur, React Native'de parent component tarafından verilir.
En Büyük Zihinsel Kayma: Declarative vs Imperative
Unity geliştirme büyük ölçüde imperative'dir. "Şu nesneyi şuraya taşı, şu rengi değiştir, şu animasyonu oynat" dersiniz.
React Native declarative'dir. "Bu state'deyken ekran şöyle görünsün" dersiniz. Framework gerisini halleder.
Bu fark başta sinir bozucu geldi. "Ama ben bunu nasıl yapacağını söylemek istiyorum!" Zamanla anlıyorsunuz ki "nasıl"ı framework'e bırakmak, sizi "ne" üzerine odaklanmaya serbest bırakıyor.
Paradigma: Data-Driven vs Frame-Driven
Yüzeydeki "imperative vs declarative" ayrımının altında daha temel bir fark var: veriye yaklaşım.
React Native data-driven çalışır. State değişir, framework arayüzü yeniden render eder. Aradan başka bir döngü geçmez — veri doğrudan UI'yi tetikler.
Unity ise frame-driven. Her saniye 60 (veya 90, 120) kez Update() çağrılır. Bir verinin görsele yansıması için ya o döngü içinde okunması, ya da bir event ile başka bir nesneye haber verilmesi gerekir. Reaktivite yok — bağlantıyı siz kuruyorsunuz.
Bu yüzden Unity projelerinde observer pattern ve singleton sık karşımıza çıkar: GameManager hangi veriyi tutuyor, UIManager bunu nasıl haber alıyor, ses sistemi level başlangıcını nereden duyuyor — her bağlantıyı tek tek düşünüp kurmanız gerekir. C# event'leri, UnityEvent'ler, ScriptableObject tabanlı event channel'lar... Hepsi aslında aynı soruya verilen farklı cevaplar: "değişiklikten kim haberdar olmalı?"
React Native'de bu soruyu sormazsınız. Bir component bir state'i okuyorsa, state değiştiğinde otomatik re-render olur. Provider/Context ya da Zustand gibi araçlarla bu otomatikliği büyük uygulamalara da taşıyabilirsiniz; temel mantık aynı kalır: veri akar, UI takip eder.
Unity'den geçince bu rahatlık başta tedirgin edici geliyor — "peki re-render maliyeti yok mu?" diye soruyorsunuz. Var, ama Virtual DOM diff'iyle minimize ediliyor; useMemo ve useCallback ile gereksiz render'ları kesebiliyorsunuz. Yine de zihinsel yük çok daha düşük: "bu değişince ne re-render olacak?" sorusu, "bu değişince kim haberdar olmalı?" sorusundan kat kat hafif.
Sonuç
Eğer Unity geçmişiniz varsa ve React Native öğrenmeye çalışıyorsanız, sıfırdan başladığınızı düşünmeyin. Temeller aynı — sadece dili çevirmeniz gerekiyor.