# Client Side Prediction Nedir ?

Unreal Engine'deki **CharacterMovementComponent** (CMC), karakter hareketlerinin yönetimi için kullanılan güçlü bir bileşendir. Hem tek oyunculu hem de çok oyunculu oyunlarda, oyuncu karakterinin hareketlerini simüle etmek ve kontrol etmek için bu bileşen kullanılır. Çok oyunculu oyunlarda özellikle **ağ replikasyonu** ve **görünür hareket simülasyonu** için CMC önemli bir rol oynar.

#### CharacterMovementComponent Nedir?

**CharacterMovementComponent**, oyuncu karakterinin tüm hareket ihtiyaçlarını karşılamak için tasarlanmış bir bileşendir. Bu, yerçekimi, zıplama, yavaşlama, kayma, koşma gibi çeşitli hareket türlerinin yanı sıra, çok oyunculu oyunlarda ağ üzerinden hareketin senkronizasyonunu da yönetir.

CMC, **Character** sınıfının bir parçasıdır ve çoğu zaman oyuncu karakterinin veya yapay zeka karakterlerinin hareketlerini yöneten ana bileşendir. Bu bileşen, karakterin fiziksel etkileşimlerini ve çevreyle olan ilişkisini (duvarlara çarpma, zeminle etkileşim, hız kontrolü, vb.) simüle eder.

#### CMC ve Ağ Replikasyonu

Unreal Engine'deki **CharacterMovementComponent**, çok oyunculu oyunlarda istemciler arasında hareketlerin doğru bir şekilde senkronize edilmesini sağlamak için ağ replikasyonuna sahiptir. Ancak, burada önemli bir nokta vardır: hareketlerin **server-authoritative (sunucu yetkili)** olmasıdır.

* **Sunucu Yetkili Hareket (Server-Authoritative Movement):** Bu, istemcilerin sadece yerel simülasyonu gerçekleştirdiği, ancak hareketlerin ve konumların son doğrulamasının **sunucuda yapıldığı** bir yaklaşımdır. İstemci, input'ları sunucuya gönderir, ancak nihai hesaplamalar sunucu tarafından yapılır ve sonuçlar tüm istemcilere replikasyon yoluyla iletilir.
* **Hareket Simülasyonu (Client-Side Simulation):** İstemci, input’lara dayalı olarak hareketi anında simüle eder ve istemcinin hareketi sunucuya gönderilene kadar gecikmesiz görünür. Bu, istemci tarafındaki **instance** üzerinden simülasyon yapılır. Yani her istemcinin kendi **instance'ı** (örneği) kendi hareketini simüle eder. Ancak, bu simülasyonun son doğrulaması sunucu tarafından yapılır.

#### CMC ile Hareketin Simülasyonu ve Client Side Simulation

İstemci, **CharacterMovementComponent** kullanarak, hareketi ve karakterin fiziksel durumunu **yerel olarak simüle eder**. Bu işlem, istemcinin o anki input'larına dayalı olarak pozisyonu, hızı ve diğer hareket verilerini tahmin eder. Bu tahmin, istemcinin oyun dünyasında anında tepki vermesini sağlar, yani hareketin gecikmesi en aza indirilir.

Ancak burada önemli bir detay vardır: Bu simülasyon, istemcinin **instance’ı** üzerinde gerçekleştirilir. Yani, her istemci kendine ait bir "örnek" (instance) üzerinde hareketleri simüle eder ve **input’lar bu instance’lar üzerinden işlenir**.

Örneğin, bir oyuncu karakteri **W** tuşuna bastığında, istemci karakterin hareketini **anında** simüle eder, yani karakterin pozisyonunu ileriye doğru hareket ettirir. Ancak bu hareket, sadece o istemcinin **instance’ında** görülür ve **sunucuya veri gönderilene kadar sadece o istemcinin ekranında gerçekleşir**.

Sunucu, istemciden gelen verileri doğrular ve **nihai pozisyon ve hız bilgilerini** gönderir. Eğer istemcinin yaptığı simülasyonla sunucunun doğruladığı veri arasında fark varsa, istemci bu farkı düzeltir ve **senkronize eder**.

#### Simülasyonun Instance Üzerinde Yapılması

**Simülasyon**, istemcinin yerel örneği (instance) üzerinde yapıldığından, oyuncuların hareketleri yerel olarak anında görünür. Bu, istemci üzerinde çalışan her **instance** için farklı olabilir ve diğer istemcilerde görülen hareketler, sadece sunucudan gelen veriye göre senkronize edilir.

* **Instance'ın Rolü:** Her istemci, kendi oyun içindeki hareketini **yani her karakterin yerel örneğini** simüle eder. Bu, istemcinin sadece kendi karakterinin hareketini simüle etmesini sağlar. Diğer istemcilerin hareketi, **sunucu tarafından replikasyon yoluyla** alınır.
* **Hareketin Yerel Simülasyonu:** Hareketin simülasyonu, istemcinin **local instance'ı** üzerinde yapılır, bu nedenle sunucuya bağlı gecikmeler anında hissedilmez ve oyuncu, input’larına hızlı bir şekilde tepki verir.

Bu nedenle, istemcinin hareketinin ve pozisyonunun doğru senkronize olması için **server-side doğrulama** gereklidir. Aksi takdirde, yüksek ping veya ağ sorunları gibi durumlarda istemciler arasında tutarsızlıklar ve hatalar oluşabilir.
