State Pattern: Nesnelerin Durumlarına Göre Davranış Yönetimi

Sosyal medyada paylaşın

Öncelikle bu yazıyı ChatGpt’nin yazdığını belirtmeliyim 🙂 Ek olarak kendimden bir şeyler katmam gerekirse State Pattern’i bazı mühendislik ve türevi bölümlerde anlatılan Otomata Teorisi adlı dersin bir uygulamasıdır. Oyunlarda sık sık kullanılır, bu pattern’i kullanmadan da kod yazabilir ve çalıştırabilirsiniz fakat State Pattern’i bu süreci daha düzenli daha değişime açık ve bağımlılığı az hale getiriyor. Örneğin karakterinizin kontrollerini gerçekleştiren PlayerController adlı scriptiniz var ve Update’de sürekli koşullu kontrol gerçekleştirip işlem yaptırıyorsunuz, bu anlayacağınız üzere çok karışık düzenlemesi zor bir kodlama tarzıdır. Fakat bu patterni kullanırsanız işler daha kolay hale gelecektir. Aşağıdaki görselde bu karmaşaya bir örnek verilmiştir.

Nesnelerin farklı durumlarına bağlı olarak davranışlarını yönetmek, yazılım geliştirmenin önemli bir parçasıdır. State Pattern, bu tür senaryolarda etkili bir şekilde kullanılabilen bir tasarım desenidir. Bu blog yazısında, State Pattern’i C# ve Unity kullanarak anlamaya ve uygulamaya odaklanacağız. Bunun için, bir oyuncunun farklı durumlarına bağlı olarak davranışlarını nasıl yönetebileceğimizi inceleyeceğiz.

Öncelikle, State Pattern’in temel bileşenlerine bakalım:

State (Durum) Interface:

public interface IState
{
    void Enter();
    void Exit();
    void UpdateStatus();
}

State arayüzü, durumları temsil eden sınıfların uygulaması gereken temel metodları içerir. Bu metodlar, duruma özgü davranışları gerçekleştirmek için kullanılır.

Concrete State (Somut Durum) Sınıfları:

public class IdleState : IState
{
    //...
}

public class AttackState : IState
{
    //...
}

public class SearchState : IState
{
    //...
}

Concrete State sınıfları, State arayüzünü uygular ve durumlara özgü davranışları gerçekleştirir. Örneğin, “IdleState”, “AttackState” ve “SearchState” gibi durumları temsil eder.

Context (Bağlam) Sınıfı:

public class PlayerController : MonoBehaviour
{
    private IState currentState;
    
    void Start()
    {
        // Başlangıç durumu olarak IdleState'i atayalım
        currentState = new IdleState();
        currentState.Enter();

        //...
    }

    void Update()
    {
        // currentState.UpdateStatus();
    }

    public void SetState(IState newState)
    {
        currentState.Exit();
        currentState = newState;
        currentState.Enter();
    }
}

Context sınıfı, durumları yönetir ve durum geçişlerini kontrol eder. “PlayerController” sınıfı, durumları temsil eden nesnelerin oluşturulduğu ve durum geçişlerinin yapıldığı yerdir.

Örnek Senaryo: Oyuncunun Durumlarına Göre Davranışlarını Yönetme

Aşağıda, verdiğiniz kodlardan örneklerle bir senaryo oluşturalım:

// AttackState örneği
public class AttackState : IState
{
    public void Enter()
    {
        // Oyuncunun Saldırı durumuna geçişte yapılacak işlemler
        Debug.Log("Oyuncu Saldırı durumuna geçti.");
    }

    public void UpdateStatus()
    {
        // Oyuncunun güncelleme işlemleri
        Debug.Log("Oyuncu Saldırı durumu güncelleme işlemi");
    }

    public void Attack()
    {
        // Oyuncunun Düşman'a saldırma işlemi
        Debug.Log("Oyuncu Düşman'a saldırıyor.");
    }

    //...
}
// PlayerController örneği
public class PlayerController : MonoBehaviour
{
    //...

    void Start()
    {
        currentState = new IdleState();
        currentState.Enter();
        SetState(new AttackState());
    }

    void Update()
    {
        //...
    }

    //...
}

Bu blog yazısında, State Pattern’in C# ve Unity ile nasıl kullanılabileceğini öğrendik. Oyuncunun farklı durumlarına bağlı olarak davranışlarını yönetmek için State Pattern’i kullanarak, kodumuzu daha modüler ve esnek hale getirdik. Verdiğimiz örneklerle durum geçişlerini ve duruma özgü davranışları yönetmeyi gösterdik.

State Pattern, yazılım geliştirme sürecinde nesnelerin durumlarına göre davranışlarını yönetmek istediğimiz senaryolarda önemli bir rol oynar. Modüler bir yapı oluşturarak kodun okunabilirliğini ve bakımını artırır. Ayrıca, daha fazla durum eklemek veya mevcut durumları değiştirmek gibi değişiklikler için de esneklik sağlar.

Umarız bu yazı, State Pattern’in kullanımını anlamanıza yardımcı olur ve projelerinizde bu deseni etkili bir şekilde kullanmanızı sağlar.