Input yönetiminde Command pattern nasıl kullanılır? Tuş atama ve undo nasıl sağlanır?
Cevap
Command pattern, bir eylemi nesneye dönüştürür. Input kodu "Space tuşuna basıldı, zıpla" demek yerine "Space'e bağlı komutu çalıştır" der. Böylece girdi ile oyun mantığı birbirinden ayrılır.
public interface ICommand
{
void Execute(Unit unit);
void Undo(Unit unit);
}
public class MoveCommand : ICommand
{
readonly Vector2Int dir;
public MoveCommand(Vector2Int d) => dir = d;
public void Execute(Unit u) => u.Move(dir);
public void Undo(Unit u) => u.Move(-dir);
}
public class InputHandler
{
readonly Dictionary<KeyCode, ICommand> bindings = new();
readonly Stack<ICommand> history = new();
public void Bind(KeyCode key, ICommand cmd) => bindings[key] = cmd; // tuş atama
public void Handle(Unit unit)
{
foreach (var (key, cmd) in bindings)
if (Input.GetKeyDown(key)) { cmd.Execute(unit); history.Push(cmd); }
if (Input.GetKeyDown(KeyCode.Z) && history.Count > 0)
history.Pop().Undo(unit);
}
}Sağladıkları
- Tuş atama (rebinding): Sadece sözlükteki eşleşme değişir.
- Undo/redo: Strateji ve bulmaca oyunlarında komut geçmişi tutulur.
- Replay ve test: Komut dizisi kaydedilip yeniden oynatılabilir.
- AI ve oyuncu ortaklığı: AI da aynı komutları üreterek aynı
Unit'i kontrol edebilir. - Ağ: Multiplayer'da sunucuya ham tuş değil komut gönderilir.
Unity'nin yeni Input System paketi de benzer bir soyutlama sunar: tuşlar Action'lara bağlanır ve kod sadece jump.performed gibi aksiyonlarla ilgilenir. Bu sayede klavye, gamepad ve dokunmatik girdi aynı kodla desteklenir.
İlgili Oyun Programlama soruları
- Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?
- Delta time nedir, neden kullanılır?
- Object pooling nedir, neden kullanılır?
- Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?
- Çarpışma tespitinde broad phase ve narrow phase nedir?
- Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.