…bir NPC’nin eylemlerini “ön koşul + etki + maliyet” olarak tanımlayabilecek, A* ile en ucuz planı bulabilecek, plan başarısız olunca yeniden planlayan bir asker yazabilecek ve GOAP ile HTN arasında bilinçli seçim yapabileceksiniz.
🤔 ISINMA: ALMA ACIKTI (Orkin’in örneği)
F.E.A.R.’daki Alma’nın amacı: tok olmak. İki yolu var: pizza ısmarlamak (para gerekir) ya da pasta yapmak (tarif gerekir).
Parası yoksa? Önce bankamatikten para çeker, sonra pizza ısmarlar. İki eylemlik bir plan.
Bunu hiçbir yerde “önce para çek, sonra ısmarla” diye yazmadık. Sadece her eylemin neye ihtiyaç duyduğunu (ön koşul) ve neyi değiştirdiğini (etki) söyledik.
Eylemleri zincirlemek planlayıcının işi. Tasarımcı eylem ve hedef ekler; geçişleri kimse yazmaz. Bugünün konusu bu.
🎯 Bu konu için bilmeniz gerekenler
Yeşil = gerekli · kesikli = faydalı ama şart değil. Tıklayınca ilgili sunuma gider.
Neden?Planlayıcı, bir graf üzerinde en kısa yolu arar: Dijkstra’yı biliyorsanız A*’ı da anlarsınız. A*’ı Y8’de harita üzerinde ayrıntılı göreceğiz; burada sadece “maliyet + tahmin” fikri yeter.
🧰 Kodlamadan korkuyorsanızGOAP’ta tasarımcının işi tablo doldurmaktır: “bu eylem şunu ister, şunu değiştirir, şu kadar pahalıdır.” Arama kodu bir kez yazılır (ya da hazır alınır). Unity’de CrashKonijn GOAP eylemleri ScriptableObject/kod ile tanımlatır ve planı görsel olarak gösterir.
Mini sözlük
planning · plan
planlama · plan
Hedefe götüren eylem dizisini önceden bulmak · o dizi
goal
hedef
Ulaşılmak istenen dünya durumu: “hedef etkisiz = doğru”
world state
dünya durumu
Planlayıcının bildiği gerçekler: silah dolu mu, hangi odadayım…
action · precondition · effect
eylem · ön koşul · etki
Eylem, ön koşulları doğruysa yapılabilir; yapılınca etkileri dünyayı değiştirir
cost
maliyet
Eylemin “pahalılığı”; planlayıcı en ucuz planı arar
replanning
yeniden planlama
Plan bozulunca yeni durumla baştan plan yapmak
STRIPS
—
Stanford Research Institute Problem Solver (1971): klasik planlama dili
hiyerarşik görev ağı · bileşik / ilkel görev · yöntem
Büyük görevleri “tarif kitabındaki” yöntemlerle alt görevlere bölerek plan yapmak
working memory
çalışma belleği
NPC’nin bildikleri ve hatırladıkları (kara tahtanın akrabası)
LEVEL 0
Plan nedir?
refleks ile plan, Shakey ve STRIPS
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
Önce Alma’nın mutfağı: sırayı kim yazıyor? 🍕
Beş eylem kartı var. Her kartta yalnızca iki bilgi yazıyor: ne ister (ön koşul) ve ne sağlar (etki). Hedef tek: tok olmak. Kartların sırasını biz yazmıyoruz; planlayıcı kuruyor. Senaryoları deneyin: dünya değişince plan nasıl değişiyor?
Tepki vermek mi, plan yapmak mı?
Şimdiye kadar: “şimdi ne yapayım?”FSM, davranış ağacı ve utility her an bir sonraki eylemi seçer. Gelecek adımları düşünmez; durum değişince yeniden seçer. Refleks gibi: hızlı, öngörülebilir.
Planlayıcı: “hedefe nasıl giderim?”Bir hedef verilir; planlayıcı oraya götüren eylem dizisini arar. GPS gibi: “önce şuraya, sonra şuraya”. Yol kapanırsa yeniden rota hesaplar.
FSM / BT
GOAP / HTN
Kim karar sırasını yazar?
Tasarımcı (oklar, ağaç)
Planlayıcı (arama)
Yeni davranış eklemek
Geçiş / dal eklemek
Eylem eklemek
Beklenmedik çözümler
Yok
Var (bazen istenmeyen!)
Maliyet
Çok ucuz
Arama yapar: daha pahalı
Hata ayıklama
Kolay
Plan neden böyle? sorusu zor
Hikâye: Shakey, ilk “düşünen” robot (SRI, 1966–1972) 🤖
Stanford Research Institute’te kamerası, mesafe ölçeri ve tekerlekleri olan bir robot: Shakey (sarsıla sarsıla hareket ettiği için).
Ona “kutuyu diğer odaya it” gibi komutlar veriliyordu. Bunun için iki problem çözülmeliydi: nasıl gideceğim? ve hangi sırayla ne yapacağım?
Birinci soru için Hart, Nilsson ve Raphael A* algoritmasını yayımladı (1968). İkincisi için Fikes ve Nilsson STRIPS planlayıcısını (1971).
Yani oyunlarda kullandığımız yol bulma ve eylem planlama aynı robotun iki beyninden doğdu.
Shakey (SRI, 1972): kamera, menzil ölçer, tampon algılayıcılar · SRI International, CC BY-SA 3.0
35 yıl sonra Jeff Orkin, F.E.A.R.’da bu ikisini birleştirdi: A*’ı hem harita üzerinde yol, hem de eylem uzayında plan bulmak için kullandı.
STRIPS’in özü
Hedef: istenen dünya durumu
Eylem: ön koşullar + etkiler (ekle/sil listeleri)
Planlayıcı: başlangıç durumundan hedefe götüren eylem dizisini arar
Bugün akademide aynı fikir PDDL diliyle ve Uluslararası Planlama Yarışması’nda yaşıyor.
Eylemler tablosu: Alma örneği
eylem
ön koşul
etki
maliyet
Pizza ısmarla
para = ✔
tok = ✔
2
Pasta yap
tarif = ✔
tok = ✔
8
Para çek
—
para = ✔
3
Tarif bul
—
tarif = ✔
1
Hedef: tok = ✔. Başlangıç: hiçbir şey yok.
Plan A: Para çek (3) → Pizza ısmarla (2) = 5
Plan B: Tarif bul (1) → Pasta yap (8) = 9
Planlayıcı en ucuzunu seçer: Plan A. Bankamatik bozuksa (Para çek başarısız) yeniden planlar → Plan B.
Maliyetler bir kişilik de olabilir: tembel Alma için pasta 20 maliyetli, hevesli aşçı Alma için 2.
Quiz 1 · plan nedir?
GOAP’ta “önce şarjör tak, sonra ateş et” sırası nereden gelir?
GOAP’ta eylemler arasında elle yazılmış geçiş yoktur. Bir eylemin ön koşulunu başka bir eylemin etkisi sağlıyorsa, planlayıcı ikisini zincirleyebilir. Sıra, aramanın sonucudur.
LEVEL 1
F.E.A.R. ve GOAP
“Three States and a Plan” (GDC 2006)
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
📸 Oyundan bir kare: F.E.A.R. (2005)
Oyuncuların “takım hâlinde düşünüyorlar” dediği askerler. Aslında her biri kendi küçük planlayıcısıyla, Alma’nın mutfağındaki gibi eylem kartlarını zincirliyor: siper al, kapıyı tekmele, el bombası at. Görsel: F.E.A.R. oynanış görüntüsü, Monolith Productions, Wikipedia (eğitim amaçlı adil kullanım)
Derin hikâye: F.E.A.R. (Monolith, 2005) 👻
Oyuncular ve eleştirmenler F.E.A.R.’ın düşmanlarını yıllarca “oyun tarihinin en akıllı askerleri” listelerinde saydı: siper alıyor, körlemesine ateş ediyor, pencereden atlıyor, masayı devirip kendine siper yapıyor, takım hâlinde ilerliyor.
Jeff Orkin’in GDC 2006 bildirisi “Three States and a Plan” bu zekânın sırrını açıkladı ve başlığıyla herkesi şaşırttı:
Karakterlerin FSM’inde sadece üç durum var: Goto (bir yere giderken animasyon oynat), Animate (animasyon oynat), UseSmartObject (aslında Animate’in veri güdümlü hâli). Yani gerçekte iki durum!
Zor iş, hangi animasyonun ne zaman ve nereye giderken oynatılacağına karar vermek. Bunu FSM değil, bir planlayıcı yapıyor.
Neden planlama?Orkin: “FSM’ler prosedüreldir: her durumda ne yapılacağını ve ne zaman geçileceğini söylersiniz. Planlama bildirimseldir: YZ’ye hedeflerini ve eylemlerini söylersiniz, sıralamayı kendisi bulur.”
Saldıramaz: “öldür” için plan bulamaz, düşük öncelikli “devriye”ye döner
💡 Ders: hedef ve eylemi ayırKarakterin ne istediği (hedefler) ile neler yapabildiği (eylemler) ayrı listelerde. Yeni bir düşman türü = mevcut eylemlerden yeni bir karışım. F.E.A.R. ekibi sonradan eklenen bir düşmanı, hayaletin uçma eylemleriyle askerin ateş eylemlerini birleştirerek hızla yaptı.
Hedefler yarışırHer an en yüksek öncelikli hedef seçilir ve onun için plan aranır. Plan bulunamazsa sıradaki hedef denenir — utility (Y4) ile planlamanın buluşması.
Planlamanın üç faydası (Orkin)
1) Hedef ile eylemi ayırmakÖnceki oyunları No One Lives Forever 2’de hedefler kendi içinde küçük FSM’lerdi ve bilgi paylaşmazlardı. F.E.A.R.’da hepsi ortak bir çalışma belleği kullanır.
2) Katman katman davranışÖnce “kaçın” hedefi + iki eylem (yana yuvarlan, eğil). Sonra “siper al”. Sonra “siperdeyken vurulursan körlemesine ateş et”… Orkin buna soğanın katmanlarını eklemek der. Geçişleri hiç elle yazmadılar.
3) Dinamik problem çözmeAsker kapıyı açmaya çalışır; oyuncu kapıyı bedeniyle tutuyorsa açamaz → yeniden planlar, kapıyı tekmeler → yine olmaz → pencereden atlar ve yakın dövüşe girer. Başarısızlıklar belleğe yazılır, sonraki plan onları hesaba katar.
📜 NOLF2’den bir dersGeliştirmenin sonlarında “karanlık bir odaya girince ışığı aç” isteği geldi. Eski sistemde her hedefin içindeki durum makinesine tek tek dokunmak gerekti: riskli ve zahmetli. GOAP’ta: bir Işığı aç eylemi (etkisi: ışık açık) ve “Git” eylemine bir ışık açık ön koşulu. Bitti.
STRIPS’ten GOAP’a: oyun için dört değişiklik
değişiklik
ne demek?
neden?
Eylem başına maliyet
Pizza 2, pasta 8
Tercih belirtmek; A* ile en ucuz planı aramak
Sabit boyutlu dünya durumu
Ekle/sil listeleri yerine bir dizi: TargetDead, WeaponLoaded, OnVehicleType, AtNode…
Hangi eylemin hangi koşulu sağladığını bulmak çok hızlı. Bedeli: aynı anda tek hedef, tek silah düşünülür; hangisi olduğuna planlayıcının dışındaki sistemler karar verir.
Prosedürel ön koşul
Diziye sığmayan kontroller için kod: “kaçabileceğim güvenli bir yol var mı?”
Pahalı kontroller (NavMesh’te yol arama) sadece gerektiğinde yapılır
Prosedürel etki
Etki anında değil, animasyon bitince uygulanır
Oyunda eylemler zaman alır
F.E.A.R. aramayı hedeften geriye doğru (regressive) yaptı. Sonraki oyunlarda ileri arama da kullanıldı; Éric Jacopin’e göre ileri arama hata ayıklamada daha kolay. Bu sunumdaki demolar ileri arama yapıyor.
“Takım taktiği” yanılsaması
F.E.A.R.’da genel bir koordinatör, yakındaki askerleri periyodik olarak timlere ayırır. Sadece dört basit tim davranışı var:
Get-to-Cover: biri bastırma ateşi yaparken diğerleri sipere
Advance-Cover: biri ateşle örterken diğerleri daha yakın sipere
Orderly-Advance: tek sıra ilerle, sondaki arkayı kollasın
Search: ikili gruplarla odaları ara
Tim davranışı askerlere emir verir; emre uymak da askerin hedeflerinden biridir. Kaçmak gibi daha önemli bir hedef emri geçebilir.
💡 Kanat saldırısı yok!Orkin: “F.E.A.R.’da karmaşık tim davranışları hiç yok.” Oyuncunun “bak, beni kanattan sardılar!” dediği an çoğu zaman şu: askere geçerli bir sipere gitme emri verilmiş, önünde duvar var, NavMesh arka yoldan dolaştırmış ve asker oyuncunun yanında çıkmış. Kanat saldırısı, yol bulmanın yan etkisi.
🗣️ Ve diyaloglarY1’de gördüğümüz gibi askerler ne yaptıklarını bağırarak anlatır (“Siper alıyorum!”, “Yandan dolaşıyor!”). Oyuncu bu açıklamaları duyunca ortaya çıkan davranışı plan olarak yorumlar.
Quiz 2 · F.E.A.R.
F.E.A.R.’da fareye “Düşmanı öldür” hedefi verildiğinde ne olur?
Hedefler aynıdır ama eylem setleri farklıdır. Hiçbir eylem zinciri “hedef etkisiz” durumuna götürmüyorsa planlayıcı başarısız olur ve sıradaki hedef denenir. Ayrı kod yazmaya gerek yoktur.
🎬 Ara: F.E.A.R.’ın askerleri nasıl plan yapıyor?
Building the AI of F.E.A.R. with Goal Oriented Action Planning AI and Games (Tommy Thompson) · YouTube’da aç
Alma’nın mutfağındaki kartların gerçek oyundaki karşılığı: askerlerin eylemleri, ön koşulları ve etkileri; oyuncunun “takım hâlinde düşünüyorlar” sandığı davranışların nasıl ortaya çıktığı.
🤔 İzlerkenVideodaki askerin eylemlerinden ikisini “ister / sağlar” biçiminde yazın. Asker bir kapıyı açamayınca ne yapıyor; bu, mutfaktaki hangi senaryoya benziyor?
LEVEL 2
A* ile plan aramak
düğüm = dünya durumu, kenar = eylem
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
Plan aramak = graf üzerinde en kısa yol
Düğüm: bir dünya durumu (hangi gerçekler doğru)
Kenar: o durumda ön koşulu tutan bir eylem; ok, etkilerin uygulandığı yeni duruma gider
Kenar ağırlığı: eylemin maliyeti
Hedef: “tok” gerçeğini içeren herhangi bir durum
Orkin: “A* aslında genel bir arama algoritmasıdır.” F.E.A.R. aynı A* kodunu hem NavMesh’te yol hem de bu grafta plan bulmak için kullandı.
🎒 Tek slaytta A*
Her düğüm için g = başlangıçtan buraya gerçek maliyet, h = buradan hedefe tahmin, f = g + h.
Açık liste (öncelik kuyruğu): keşfedilmiş ama henüz genişletilmemiş düğümler. Her adımda f’si en küçük olanı çek.
Hedefse: bitti, geriye doğru ebeveynleri izleyerek planı çıkar. Değilse: ön koşulu tutan her eylem için yeni düğüm üret, açık listeye koy.
h = 0 ise A* = Dijkstra (En Kısa Yollar sunumu). İyi bir h aramayı hızlandırır; h gerçek maliyeti aşmamalı ki en ucuz plan bulunsun.
Planlama için sezgi (h)Basit ve yaygın: hedefte olup henüz sağlanmamış gerçek sayısı. “Hedef etkisiz” sağlanmadıysa h = 1. Her eylem en az 1 maliyetliyse ve tek bir eylem birden çok hedef gerçeğini aynı anda sağlamıyorsa bu tahmin asla fazla olmaz.
⚙️ Neden hızlı?Oyun planları kısadır (genellikle 1–6 eylem) ve bir karakterin eylem sayısı onlarla sınırlıdır. Jacopin, bu yüzden basit bir genişlik öncelikli ileri aramanın bile pratikte yeterli olduğunu gösterir.
A*’ı haritalarda Y8’de ayrıntılı göreceğiz.
Arama ağacını okuma kılavuzu
Kutular ve çizgiler
Her kutu bir dünya durumu; üstünde o duruma hangi eylemle gelindiği yazar. En üstteki BAŞLANGIÇ.
Her çizgi bir eylem: ön koşulu tuttuğu için o durumdan yapılabiliyor.
g = buraya kadar harcanan maliyet · h = hedefe kalan tahmin · planlayıcı hep g + h’si en küçük kutuyu açar.
Kesikli kutu = üretildi ama henüz açılmadı (bekleme listesinde).
Yeşil yol = bulunan en ucuz plan.
Üstteki kutucuklar: “dünya nasıl başlasın?”
silah dolu · yedek şarjör var · sağ odada: askerin başlangıç durumu.
🧠 ile başlayanlar: askerin hafızası — daha önce denedi ve olmadı (kapı açılmıyor, tekme işe yaramadı, cephanelik boş).
sezgiyi kapat: h = 0. Aynı plan bulunur ama daha çok kutu açılır.
Önce “İleri ▶|” ile tek tek ilerleyin ve her adımda “şimdi hangi kutuyu açar?” diye tahmin edin.
Adım adım plan arama 🔎
Varsayılan durumda adım adım ilerleyin: en ucuz plan Cephane al → Şarjör tak → Kapıdan geç → Ateş et (4). Kesikli kutular üretilmiş ama genişletilmemiş düğümler.
“🧠 kapı açılmıyor” kutusunu işaretleyin: plan kapı yerine tekmeyi kullanıyor. İkinci 🧠 kutusunu da işaretleyin: pencere.
“🧠 cephanelik boş”: silah doldurulamıyor; tek yol Yumruk (7). Ama dikkat: yumruk her zaman mümkündü, sadece pahalıydı!
“sezgiyi kapat”: kaç düğüm genişletildiğini karşılaştırın. Küçük problemde fark az; büyük alanlarda çok önemli.
Varsayılan durumda adım adım ilerleyin: en ucuz plan Cephane al → Şarjör tak → Kapıdan geç → Ateş et (4). Kesikli kutular üretilmiş ama genişletilmemiş düğümler.
“🧠 kapı açılmıyor” kutusunu işaretleyin: plan kapı yerine tekmeyi kullanıyor. İkinci 🧠 kutusunu da işaretleyin: pencere.
“🧠 cephanelik boş”: silah doldurulamıyor; tek yol Yumruk (7). Ama dikkat: yumruk her zaman mümkündü, sadece pahalıydı!
“sezgiyi kapat”: kaç düğüm genişletildiğini karşılaştırın. Küçük problemde fark az; büyük alanlarda çok önemli.
Sezgi h = “sağlanmamış hedef gerçeği sayısı”. Hangi durumda bu sezgi gerçek kalan maliyeti aşabilir (ve A* en ucuz planı kaçırabilir)?
İki gerçek eksikse h = 2 der; ama maliyeti 1 olan tek bir eylem ikisini birden sağlıyorsa gerçek kalan maliyet 1’dir: sezgi fazla tahmin etti. A*’ın en ucuz planı garanti etmesi için h gerçek maliyeti aşmamalı. C ve B’de h her zaman güvenli; A’da h = 0, yani Dijkstra (her zaman güvenli ama yavaş). Bizim askerin hedefinde tek gerçek var: h en fazla 1, her eylem en az 1 maliyetli → güvenli.
LEVEL 3
Canlı: yeniden planlama
kapıyı tutun, cephaneliği boşaltın
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
F.E.A.R.’ın kapı sahnesi — canlı 🚪
🔎 DEMODA DENEYİN
Hiçbir kutu işaretli değilken izleyin: dört adımlık plan sorunsuz yürüyor.
“🚪 kapıyı bedeninle tut” → ↺ Baştan. Asker kapıyı açmayı deniyor, başarısız oluyor, “kapı açılmıyor” bilgisini çalışma belleğine yazıyor ve yeniden planlıyor: tekme. O da olmayınca pencere. Orkin’in GDC’de anlattığı sahnenin aynısı.
İkisini birden işaretleyin. Kaç kez yeniden planlıyor? Toplam süre ne kadar uzadı?
Günlükte her planın maliyetine bakın: her başarısızlıktan sonra plan biraz daha pahalı ama hâlâ mümkün olan en ucuz.
Önemli tasarım ayrıntısı: başarısızlık bilgisi bir “gerçek” olarak dünya durumuna yazılıyor (🧠). Eylemlerin ön koşulları da bu gerçeklere bakıyor. Böylece planlayıcı aynı hatayı tekrar etmiyor.
LEVEL 4
Kod ve laboratuvarlar
eylem = veri, planlayıcı = 40 satır
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
🎒 Ön bilgi: sözlük, kopya ve öncelik kuyruğu
Dünya durumu = sözlük{"loaded": True, "inB": False}. Anahtar → değer. Sözlükte olmayan anahtarı yanlış kabul edeceğiz: s.get("loaded", False).
⚠️ Kopyalamadan değiştirme!Arama, aynı anda birçok olası geleceği dener. Bir eylemin etkisini uygularken orijinal durumu değiştirirseniz diğer dallar da bozulur. Önce kopyala: yeni = dict(s) / {...s} / new Dictionary<,>(s).
Öncelik kuyruğu“En küçüğü hızlı ver” diyen yapı (Öncelik Kuyrukları sunumundaki yığın/heap). Python: heapq.heappush, heapq.heappop. Küçük planlarda basit bir listeyi her adımda sıralamak da yeter.
Eylem = veriEylemler kod değil, tablo satırı: ad, ön koşul sözlüğü, etki sözlüğü, maliyet. Tasarımcılar bunları bir dosyada / ScriptableObject’te düzenleyebilir; F.E.A.R.’da GDBEdit adlı veritabanı aracındaydı.
Eylemler ve iki yardımcı
Planlayıcı: A* (ya da sezgisiz hâli Dijkstra) (1/2)
Planlayıcı: A* (ya da sezgisiz hâli Dijkstra) (2/2)
Planı yürütmek ve yeniden planlamak
Üç sinyal yeniden planlamayı tetikler: plan bitti, bir eylem başarısız oldu, sıradaki eylemin ön koşulu artık tutmuyor (ör. hedef kaçtı). Ek olarak periyodik yeniden planlama, daha önemli bir hedefin ortaya çıkmasını yakalar.
🎒 Kod sözlüğü
Dictionary<string, bool> · dict · {}
sözlük
Anahtar → değer tablosu; dünya durumu için ideal
s.TryGetValue(k, out var v) · s.get(k, False)
güvenli okuma
Anahtar yoksa hata yerine varsayılan değer
{ ...s, ...eff } · dict(s); n.update(eff)
kopyalayıp birleştirme
Önce s’nin kopyası, sonra eff’teki anahtarlar üzerine yazılır
all(... for ...) · every(...)
hepsi mi?
Bütün elemanlar için koşul doğruysa True
heapq.heappush / heappop
yığın (heap)
Python’un öncelik kuyruğu: en küçük ilk çıkar
itertools.count()
sayaç
Eşit f değerlerinde karşılaştırma hatasını önleyen sıra numarası
Queue<T> · Peek · Dequeue
kuyruk
Plan adımları: sıradakine bak · sıradakini çıkar
float("inf")
sonsuz
“Henüz yol bilinmiyor” başlangıç değeri
🌱 Isınma kodu: bu eylem şu an yapılabilir mi?
Planlayıcının sorduğu ilk soru. “Ateş et”in ön koşulu { inB: true, loaded: true }: asker B odasında değilse ya da silah boşsa bu eylem aday bile olamaz.
🌱 Isınma kodu: eylemin etkisini uygula
“Şarjör tak”ın etkisi { loaded: true, hasAmmo: false }. Kopya almadan değiştirirseniz planlayıcı aynı anda denediği diğer gelecekleri de bozar — GOAP yazan herkesin en az bir kez düştüğü tuzak. Bu iki fonksiyon + bir öncelik kuyruğu = planlayıcı.
🧪 Canlı laboratuvar: askerin eylem tablosu
Kapı tutulduğu için başlangıçta asker takılıp kalıyor. Eksik üç eylemi ekleyin: tekme kickFailed değilse çalışır, pencere her zaman, yumruk B odasında. Test beş senaryoda en ucuz plan maliyetini kontrol eder (4, 6, 8, 7, 1). Sonra maliyetlerle oynayın: pencere 2 olursa asker kapıyı hiç denemez mi?
🐍 Laboratuvar: en ucuz planın maliyeti
İki TODO’yu doldurun (Dijkstra = sezgisiz A*). Testlerde askerin bütün senaryoları, Alma’nın pizza/pasta problemi ve bir etkinin başka bir gerçeği sildiği (False yaptığı) zor bir örnek var.
LEVEL 5
HTN: görevleri bölmek
tarif kitabıyla planlama
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
HTN: hiyerarşik görev ağları
GOAP serbestçe arar: “hangi eylemler hedefe götürür?” HTN ise yukarıdan aşağı böler: “bu büyük görevi nasıl yaparım?”
Bileşik görev (compound): “Düşmana saldır”. Kendi başına yapılamaz, bölünür.
Yöntem (method): bir bileşik görevi bölmenin bir yolu + ne zaman geçerli olduğu. “Elinde kütük varsa: düşmana git, kütükle vur.”
İlkel görev (primitive): doğrudan yapılabilen eylem; koşulu ve etkisi var.
Planlayıcı kökten başlar, ilk uygun yöntemi seçer, alt görevleri sırayla ayrıştırır. Bir şey tutmazsa geri izler ve sonraki yöntemi dener.
Benzetme: yemek tarifi“Akşam yemeği hazırla” → (yöntem: misafir varsa) “çorba + ana yemek + tatlı” → “ana yemek” → (yöntem: fırın çalışıyorsa) “fırında tavuk”… Usta aşçının bilgisi, yöntemlerde saklı.
BT’ye benziyor mu?Troy Humphreys: HTN’ler davranış ağaçlarının modülerliğini taşır, ama BT’lerden farklı olarak eylemlerin etkileri hakkında akıl yürütebilir: “kütüğü vurunca elimde kütük kalmayacak” bilgisini plan sırasında kullanır.
Trunk Thumper: köprü bekçisi trol 🧌
Humphreys’in Game AI Pro’daki örneği (Transformers: Fall of Cybertron ekibinden):
Sonra tasarımcılar fikir değiştirir (“kütük saldırısı çok güçlü, vurduktan sonra kütük kırılsın”): yalnızca bir yöntem ve bir etki değişir.
⚙️ Neden hızlı?Arama maliyet ve sezgi kullanmaz; yöntemler sıralıdır ve hiyerarşi, ağın büyük kısımlarını baştan eler. Humphreys: bu özellikler sayesinde Fall of Cybertron’daki HTN planlayıcı, önceki oyun War for Cybertron’da kullandıkları GOAP sisteminden belirgin şekilde daha hızlıydı.
BedelHTN “yaratıcı” değildir: yöntemlerde yazmadığınız bir çözümü bulamaz. GOAP’ın pencereden atlama gibi beklenmedik zincirleri HTN’de ancak siz bir yöntem olarak yazarsanız çıkar.
HTN ayrıştırması — adım adım 🧌
🔎 DEMODA DENEYİN
Varsayılan: trol düşmanı görüyor ama elinde kütük yok. “kütük yoksa” yöntemi seçiliyor; Ağacı sök görevi planlama sırasındaki dünya durumunu “elinde kütük var” yapıyor ve sonraki Kütükle vur bu sayede uygulanabiliyor.
“yakında ağaç var”ı kapatın: Ağaç bul başarısız → geri izleme → saldırı yöntemi kalmadı → kök görev bir sonraki yönteme, Devriye’ye geçiyor.
“düşmana yol var”ı kapatın: iki saldırı yöntemi de “Düşmana git”te tıkanıyor. Kaç adım boşa gitti?
“düşmanı görüyor”u kapatın: ilk yöntem hiç denenmiyor.
Yığına dikkat: HTN’de “plan” sadece ilkel görevlerden oluşur; bileşik görevler planlama bitince ortadan kalkar.
HTN planlayıcının kalbi (Python) (1/2)
HTN planlayıcının kalbi (Python) (2/2)
Bu, Dana Nau’nun SHOP/Pyhop planlayıcılarının sade bir hâli. Özyineleme sayesinde geri izleme bedava: bir dal None dönerse döngü bir sonraki yöntemi dener.
Quiz 4 · HTN
Trol düşmanı görüyor, elinde kütük yok ve yakında ağaç da yok. HTN planlayıcı ne üretir?
İlk saldırı yöntemi “elinde kütük var” koşulunda, ikincisi “Ağaç bul”un koşulunda tıkanır. Planlayıcı geri izleyip kök görevin sonraki yöntemine (Devriye) geçer. HTN alan dosyasında olmayan bir eylemi asla icat etmez — bu hem güvencesi hem sınırıdır.
LEVEL 6
Gerçek oyunlarda
Monolith, Crystal Dynamics, Guerrilla, High Moon
plan nedir?
F.E.A.R. ve GOAP
A* ile plan aramak
canlı: yeniden planlama
kod ve laboratuvarlar
HTN: görevleri bölmek
gerçek oyunlarda
kütüphaneler ve entegrasyon
GOAP’ın 20 yılı
F.E.A.R. (2005) → Shadow of Mordor (2014)Monolith GOAP’ı geliştirmeye devam etti. GDC 2015’teki “Goal-Oriented Action Planning: Ten Years Old and No Fear!” oturumu, sistemin Middle-earth: Shadow of Mordor’da nasıl büyüdüğünü anlatır.
Tomb Raider (2013) ve devamıCrystal Dynamics aynı oturumda GOAP’ın ürettiği “çoğu zaman yeni ya da beklenmedik” davranışların nasıl hata ayıklandığını ve raporlandığını anlattı. Planlayıcıların gerçek sorunu: beklenmedik davranış hem güzellik hem baş ağrısı.
Deus Ex: Human Revolution — Director’s Cut (2013)Jacopin’in Game AI Pro 2 bölümünde GOAP’ın hâlâ kullanıldığı örnekler arasında sayılır; bu oyunlarda bazen ileri arama tercih edildi.
Transformers: War for Cybertron (2010)High Moon Studios GOAP kullandı; devam oyununda HTN’e geçti (sonraki slayt).
TürlerGOAP özellikle taktik nişancı ve sızma oyunlarında parlar: kısa planlar, çok sayıda koşul, beklenmedik engeller. Simülasyonlarda (köylüler odun toplar, alet yapar, ev kurar) da sık kullanılır.
HTN: Killzone’dan Horizon’a
Killzone 2 ve 3 (Guerrilla)Çok oyunculu botlar HTN ile çalıştı. Killzone 3’te botların ve taretlerin aynı planlayıcıyı kullandığı, akademideki SHOP planlayıcısına (Lisp) dayanan ve alanları C++’a derleyen bir sistem anlatılıyor (Straatman, Verweij vd., Game AI Pro, 29. bölüm).
Transformers: Fall of Cybertron (2012)Önceki oyundaki GOAP’ın yerine HTN; daha hızlı ve tasarımcıların “önce şunu dene” sezgisine daha uygun.
Horizon Zero Dawn (2017) ve Forbidden WestMakineler bireysel ajan; HTN planlayıcıdan “yeni bölgeye git”, “insana saldır”, “güvenliğe kaç” gibi görevler için plan ister. Sürüleri bir grup ajanı (oyunda fiziksel olarak yok) yönetir: kara tahtasıyla bilgi paylaşır, kimin saldıracağını seçer — sadece planlayıcı “yapabilir” dediği için değil, saldırı ilginç olacağı için. Diğer makineler sıralarını beklerken oyuncunun etrafında döner.
Guerrilla’nın Decima motoru HTN’i geliştirmeye devam ediyor: “HTN Planning in Decima” (Tim Verweij, 2024) Prolog benzeri geri izlemeyi ve oyun içi hata ayıklamayı anlatıyor.
Ne zaman planlayıcı, ne zaman değil?
FSM / BT
Utility
GOAP
HTN
Karar
kural / öncelik
puan
serbest arama
yöntemlerle bölme
Tasarımcı kontrolü
çok yüksek
yüksek
orta
yüksek
Beklenmedik çözüm
yok
az
çok
az
İşlemci
çok ucuz
ucuz
arama (kontrollü)
arama (hızlı)
Uygun olduğu yer
basit düşmanlar, boss
simülasyon, RPG ekip
taktik nişancı, sızma
büyük, sürü / tim YZ’si
⚠️ Planlayıcının tuzaklarıÇok fazla eylem → arama patlar (eylem sayısını ve dünya durumunu küçük tutun). Gerçek dünya plan bitmeden değişir (sık yeniden planlayın ama çok sık değil). Oyuncu davranışı “anlamazsa” zekâ boşa gider (Y1: F.E.A.R. bu yüzden diyalog kullandı).
Çok iş parçacıklı (Jobs) GOAP, görsel hata ayıklayıcı (planı ve maliyetleri gösterir), ScriptableObject veya kodla yapılandırma, iyi belgeler. Öğrenme eğrisi orta.
Bu sunumdaki 40 satır. Küçük alanlarda (≤ 20 eylem) en esnek ve en anlaşılır yol. Unreal ve Godot’da yerleşik GOAP/HTN yok; StateTree / BT ile birlikte kendi planlayıcınızı çağırabilirsiniz.
—
Unreal ve Godot için mağazalarda üçüncü taraf GOAP/HTN eklentileri var; kalite ve bakım durumları çok değişken, eklemeden önce son güncelleme tarihine ve örnek projeye bakın.
🧩 Projenize GOAP eklerken: adım adım
Dünya durumunu küçük tutun: 10–20 bool/enum. “Hangi düşman?” gibi seçimleri planlayıcının dışında yapın (F.E.A.R.’daki gibi).
Eylem tablosunu bir hesap tablosunda tasarlayın: ad · ön koşul · etki · maliyet. Her eylem küçük ve tek amaçlı olsun.
Hedefleri önceliklendirin (sabit sıra ya da utility puanı). En yüksek hedef için plan yoksa sıradakini deneyin.
Yürütücü: her eylem bir animasyon/hareket; başarı, başarısızlık ve “sürüyor” döndürsün (BT’deki gibi).
Başarısızlıkları belleğe yazın ve yeniden planlayın.
Görselleştirin: NPC’nin başında hedef ve planı yazın; arama ağacını kaydedin.
⚙️ PerformansPlanlamayı her karede değil, olaylar olunca (plan bitti, başarısız oldu, yeni algı) yapın. Aramaya düğüm sınırı koyun. Çok sayıda NPC varsa planlamayı karelere yayın; CrashKonijn GOAP bunu iş parçacıklarına dağıtır.
Melez mimariYaygın bir kombinasyon: utility hangi hedefin önemli olduğunu seçer → GOAP/HTN planı yapar → her plan adımı küçük bir BT ya da FSM ile yürütülür. F.E.A.R. bile planın altında iki durumlu bir FSM kullanıyordu.
🤖 Bu konuyu bir YZ kod asistanıyla yazarken
Sık yapılan hatalar — kontrol edin
Etkiyi orijinal duruma uygulamak (bütün dallar bozulur)
Her karede yeniden planlamak (işlemci + kararsızlık)
Dünya durumuna her şeyi koymak: arama uzayı patlar
GOAP ile HTN’i karıştıran yarım bir mimari üretmek: hangisini istediğinizi söyleyin
İyi bir istek (prompt) örneği
“Unity 6, C#. Bir asker için GOAP yaz. Dünya durumu Dictionary: inB, hasAmmo, loaded, targetDead, doorStuck, kickFailed. Eylemler ScriptableObject olsun (ad, pre, eff, cost). A* planlayıcı: h = sağlanmamış hedef gerçeği sayısı, en fazla 500 düğüm. GoapAgent: plan bitince, eylem başarısız olunca ya da ön koşul bozulunca yeniden planlasın; başarısız “Kapıdan geç” eylemi memory["doorStuck"]=true yazsın. Planı OnDrawGizmos ile karakterin üstüne yaz. PriorityQueue kullanma (Unity’nin .NET sürümü).”
Eylem tablosunu (ön koşul/etki/maliyet) siz tasarlayın, asistana planlayıcıyı yazdırın
Durum kopyalamanın (immutability) açıkça yapılmasını isteyin
Plan bulunamazsa ne olacağını (yedek hedef) belirtin
Arama için düğüm sınırı ve zaman bütçesi isteyin
Unit test: “şu başlangıç + şu hedef → şu maliyet” senaryoları
🔬 Araştırma ucu: dil modelleri plan yapabilir mi?
LLM+P (2023)Liu vd.: dil modelleri uzun planlarda sık hata yapıyor. Çözüm: LLM doğal dildeki problemi PDDL’ye (STRIPS’in torunu) çevirsin, klasik bir planlayıcı çözsün, LLM sonucu tekrar anlatsın. Klasik planlama ölmedi; LLM’e “güvenilir hesap makinesi” oldu.
Voyager (2023)Wang vd.: Minecraft’ta GPT-4 ile çalışan bir ajan kendi hedeflerini önerir, kod olarak beceriler yazar ve bir beceri kütüphanesi biriktirir. Elle yazılmış eylem tablosunun yerini, dil modelinin ürettiği eylemler alıyor.
Oyun için anlamıLLM’i her karede karar verici yapmak pahalı ve riskli (Y14). Daha gerçekçi yol: LLM’in hedef seçmesi ya da eylem tablosu önermesi, GOAP/HTN’in güvenilir ve hızlı biçimde yürütmesi. Doğrulanabilir ön koşul/etki yapısı, LLM’in saçmalamasına karşı bir emniyet kemeri.
💬 Tartışma soruları
Yanınızdakiyle 2 dakika konuşun, sonra sınıfça tartışalım
F.E.A.R.’ın askerleri oyuncuyu aslında kanattan sarmıyor; yol bulma onları tesadüfen yanınızdan çıkarıyor. Bunu öğrenmek oyundan aldığınız keyfi azaltır mı? Tasarımcı bu “kazayı” nasıl bilerek büyüttü?
Planlayıcı, tasarımcının hiç düşünmediği bir çözüm buldu (asker pencereden atladı). Bu ne zaman harika bir an, ne zaman bir hata raporu olur?
Bir hayatta kalma oyununda köylü: odun topla → balta yap → ağaç kes → ev kur. Bunu davranış ağacıyla mı, GOAP ile mi yazardınız? Oyuna her ay yeni eşya eklenecekse cevabınız değişir mi?
Sabah okula gelmek için yaptığınız planı GOAP gibi yazın: hedef, 4–5 eylem, ön koşullar, etkiler, maliyetler. Otobüs gelmezse planınız nasıl değişiyor?
🚀 Proje ve araştırma önerileri
[kolay]Alma’nın mutfağı — Pizza/pasta örneğini genişletin: 10 eylem, 3 hedef. Planlayıcınızın bulduğu planları ve maliyetleri tablo olarak yazdırın.
[kolay]Oduncu köylü — Unity/p5.js: köylü balta bulur, ağaç keser, odunu depoya taşır; balta kırılınca yeniden planlar. GOAP’ın klasik “ilk proje”si.
[orta]F.E.A.R. odası — Bu sunumdaki kapı/pencere sahnesini 3B’de: NavMesh + GOAP + başarısızlık belleği. Oyuncu kapıyı gerçekten tutabilsin.
[orta]HTN troll — Trunk Thumper alanını Fluid HTN ile Unity’de kurun; kütük kırılınca yeniden ağaç sökmesini izleyin.
[zor]Sürü planlayıcı — Horizon tarzı: bir grup ajanı, üç makineye roller dağıtır; saldıran HTN ile plan yapar, diğerleri bekler.
[araştırma]LLM eylem tablosu — Bir LLM’den yeni bir düşman türü için eylem tablosu (pre/eff/cost JSON) üretmesini isteyin; planlayıcıyla otomatik test edin: kaç tanesi geçerli plan üretiyor?
[araştırma]GOAP vs HTN ölçümü — Aynı problemi iki yöntemle çözüp eylem sayısı arttıkça planlama süresini ölçün; Humphreys’in “HTN daha hızlıydı” gözlemini tekrar edin.
Sonraki: oyun ağaçları — rakip de plan yapıyorsa? Minimax ve MCTS.
🎮 Bu sunumdaki oyunlar (1/2)
Adı geçen oyunu tanımıyorsanız: oyuncuların kullandığı wiki sayfası ve oyunu kısaca gösteren bir video. ▶ video slaydın üstünde açılır (Esc ile kapanır); 🎯 işaretli bağlantılar doğrudan bu sunumdaki konuya gider.
F.E.A.R.2005 · nişancı
Paranormal olayları araştıran özel tim; düşman askerleri yıllarca “en akıllı düşmanlar” listelerinde anıldı.
Adı geçen oyunu tanımıyorsanız: oyuncuların kullandığı wiki sayfası ve oyunu kısaca gösteren bir video. ▶ video slaydın üstünde açılır (Esc ile kapanır); 🎯 işaretli bağlantılar doğrudan bu sunumdaki konuya gider.