# Player Controller Nedir ?

**APlayerController**, oyuncunun oyun dünyasıyla etkileşimini sağlayan ve istemcinin sunucuya bağlandığı ilk sınıf olarak kabul edilir. Oyuncunun kontrol ettiği varlıkların (genellikle bir **Pawn**) hareketini yönetirken, aynı zamanda oyuncu ile sunucu arasındaki iletişimi sağlar. Her istemci, yalnızca kendi **PlayerController**'ına sahiptir ve bu **PlayerController** sadece istemcinin tarafında ve sunucuda mevcuttur.

Her istemci, yalnızca kendi **PlayerController**'ını bilirken, sunucu tüm istemcilerin **PlayerController**'larına sahiptir. Bu sınıf, oyun içindeki girişlerin (input) merkezi olduğu için oldukça önemlidir.

#### APlayerController'ın Temel Özellikleri

1. **Giriş Yönetimi (Input Management)**:
   * **APlayerController**, oyuncunun oyunla etkileşime girmesini sağlayan temel bileşendir. Ancak bu, doğrudan sadece klavye tuşlarına basma, fare hareketleri veya oyun kumandasının eksenleri gibi girişleri içermez. Bu tür girişler, **APawn** veya **ACharacter** gibi sınıflara yerleştirilmesi genellikle daha iyidir, çünkü bu tür girişler **Pawn**'a veya **Character**'a özeldir.
   * Örneğin, **ACharacter**'ın **MovementComponent**'i, oyuncunun karakterini hareket ettirmek için gerekli girişleri işlerken, **APlayerController**'da yer alan girişler, tüm karakterlere genel olan, her zaman geçerli olabilen eylemleri içerir.
2. **Sunucu ve İstemci Arasındaki Bağlantı**:
   * **APlayerController**, istemcinin sunucuya bağlandığı köprü işlevini görür. Her istemcinin yalnızca bir **PlayerController**'ı vardır ve bu **PlayerController**, istemcinin oyunla olan etkileşimini yönlendirir.
   * **Sunucu** her istemcinin **PlayerController**'ını bilir, ancak istemciler yalnızca kendi **PlayerController**'larını tanıyabilir. Diğer istemcilerin **PlayerController**'larına erişemezler.
3. **GetPlayerController Fonksiyonu**:
   * **GetPlayerController(0)** veya **UGameplayStatics::GetPlayerController(GetWorld(), 0);** gibi fonksiyonlar, sunucu ve istemcilerde farklı şekilde çalışır:
     * **Listen-Server** üzerinde çağrıldığında, sunucunun **PlayerController**'ını döndürür.
     * **Client** üzerinde çağrıldığında, sadece istemcinin kendi **PlayerController**'ını döndürür.
     * **Dedicated Server** üzerinde çağrıldığında ise, ilk istemcinin **PlayerController**'ını döndürür.
   * Bu davranış, özellikle çoklu oyuncu oyunlarında doğru **PlayerController**'a erişim sağlamak için önemlidir.
4. **Pawn ve PlayerController İlişkisi**:
   * **APlayerController**, doğrudan oyuncunun **Pawn**'ını kontrol eder. Her **Pawn**, bir **PlayerController** tarafından sahiplenilir (**possessed**) ve **unpossessed** edildiğinde, oyuncu başka bir **Pawn**'ı sahiplenebilir.
   * Bu süreç, istemci tarafında gerçekleşirken, sunucuda da doğru yönetilmesi gereken bir işlemdir. Oyuncu karakterinin kontrolünü sağlamak ve doğru davranışı sergilemek için **PlayerController** kullanılır.
