T: tema · Z: kodu büyüt · S: konuşmacı notları · F: tam ekran · Esc: genel bakış · ⌂ ders haritası
OYUNLARDA YAPAY ZEKÂ · HAFTA 3
Davranış Ağaçları
Selector, sequence, decorator, kara tahta — Halo 2’den Unreal’a modern NPC beyni
PRESS ▶ TO START

Bu derste oyunun haritası 🗺️

  1. FSM’den ağaca — Halo 2 neden ağaca geçti?
  2. Düğüm türleri — selector, sequence, decorator, koşul, eylem
  3. Tick — ağaç her karede nasıl düşünür (adım adım + canlı nöbetçi)
  4. Kod — 60 satırlık kendi BT motorumuz (C#, JS, Python) + laboratuvarlar
  5. Kara tahta, hafıza, olaylar — RUNNING, reaktif ağaçlar, Unreal’ın olay güdümlü ağaçları
  6. Tuzaklar ve melezler — dev ağaçlar, titreme, FSM+BT, utility+BT
  7. Gerçek oyunlarda — Halo 2, Spore, Alien: Isolation, The Last of Us, Amalur…
  8. Kütüphaneler — Unity Behavior, Unreal BT, Behavior Designer, Beehave, LimboAI, BehaviorTree.CPP, py_trees, mistreevous
🎮 Bu dersin sonunda…

…geçen haftaki nöbetçiyi bir davranış ağacıyla yeniden kurabilecek, bir ağacın her karede hangi yolu izlediğini elle takip edebilecek, kendi küçük BT motorunuzu yazabilecek ve Unity / Unreal / Godot’nun hazır BT araçlarını projenize ekleyebileceksiniz.

🤔 ISINMA: GEÇEN HAFTANIN NÖBETÇİSİNE YENİ BİR DAVRANIŞ EKLEYİN

“Nöbetçi, yerde bir el bombası görürse ne yapıyor olursa olsun siper alsın.”

  • FSM’de: yeni bir SİPER durumu + beş durumun her birinden ona bir ok + siperden çıkınca nereye döneceği… Y2’deki “durum patlaması”.
  • Asıl soru “hangi durumdan hangisine?” değil, “şu an en önemli şey ne?”. Önce hayatta kal, sonra saldır, sonra kovala, sonra araştır, hiçbiri yoksa devriye gez.
  • Bu bir öncelik listesi. El bombası kuralı listenin en üstüne tek satır olarak eklenir — başka hiçbir yere dokunmadan.
  • Davranış ağacı = öncelik listelerinin iç içe geçmiş hâli. 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?Aynı nöbetçiyi bu kez ağaçla kuracağız; FSM’yi bilmek karşılaştırmayı kolaylaştırır. Ağacı çalıştıran kod özyinelemeli (kendini çağıran) bir fonksiyondur: BST sunumundaki ağaç yürüyüşüyle aynı fikir. Bilmiyorsanız sorun değil, 🎒 slaytlarında anlatıyoruz.
🧰 Kodlamadan korkuyorsanızDavranış ağacı kurmak için kod yazmak şart değil: Unity Behavior, Unreal Behavior Tree editörü, Behavior Designer ve Beehave tamamen görseldir. Bu sunumda ağacı çizmeyi ve okumayı öğrenmek, kodu yazmaktan daha önemli. Kod bölümünü ilk okumada hızlı geçebilirsiniz.

Mini sözlük

behavior tree (BT)davranış ağacıKararları iç içe öncelik listeleri ve adım dizileri olarak tutan ağaç. Bu sunumda BT hep bunun kısaltmasıdır (ikili ağaç — binary tree — değil!)
node · root · leafdüğüm · kök · yaprakAğacın parçaları; yapraklar asıl işi (koşul/eylem) yapar
ticktık / değerlendirmeAğaca “şimdi ne yapayım?” diye sorma; kökten başlar
SUCCESS · FAILURE · RUNNINGbaşarılı · başarısız · sürüyorHer düğümün ebeveynine verdiği üç cevaptan biri
selector (fallback, “?”)seçiciÇocukları sırayla dener, ilk başarısız olmayanda durur: “olmazsa B planı”
sequence (“→”)diziÇocukları sırayla çalıştırır, ilk başarılı olmayanda durur: “tarif”
decoratordekoratör / süsleyiciTek çocuğu saran, sonucunu değiştiren düğüm: tersine çevir, tekrarla, bekleme süresi
condition · action (task)koşul · eylem (görev)Koşul anında evet/hayır der; eylem birkaç kare sürebilir
blackboardkara tahtaAğacın okuduğu/yazdığı ortak hafıza: hedef, son görülen yer…
abort · serviceiptal · servisUnreal: daha önemli dal açılınca çalışanı kes · arada bir çalışan güncelleyici

Önce günlük hayat: acıktınız 🍕

Kafanızda hazır bir “olmazsa şu” listesi var: önce dolaba bak; olmazsa sipariş ver; o da olmazsa bakkala in. Listeyi soldan sağa dener, ilk tutanda durursunuz. Bu listeye selector (seçici) denir ve ? ile gösterilir.

Her çare aslında bir tarif 📋

“Sipariş ver” tek hamle değil; sırayla yapılacak adımlar: şarj var mı? → uygulamayı aç → para yetiyor mu? → onayla. Bir adım olmazsa gerisi yapılmaz, tarif yarıda kalır. Bu adım dizisine sequence (dizi) denir ve → ile gösterilir. Yuvarlak kutu soru (koşul), köşeli kutu iş (eylem).

İkisini birleştirin: ilk davranış ağacınız 🌳

Üstte ? hangi planın deneneceğini seçer; altta her plan bir → tarifidir. Okuma kuralı: yukarıdan aşağı, soldan sağa. Her düğüm işi bitince üstündekine tek kelime söyler: oldu ya da olmadı. Davranış ağacı bundan ibaret; gerisi ayrıntı.

LEVEL 0
FSM’den ağaca
Halo 2 ve “karmaşıklığı yönetmek”
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

📸 Oyundan bir kare: Halo 2 (2004)

Halo 2 (2004) ekran görüntüsü
Davranış ağaçlarını oyun endüstrisine tanıtan oyun. Ekrandaki her düşman her karede aynı ağacı kökten yaprağa gezip “şu an ne yapmalıyım?” sorusuna cevap arıyor: siper al, el bombası at, araca bin, kaç…
Görsel: Halo 2 ekran görüntüsü, Bungie/Microsoft, Wikipedia (eğitim amaçlı adil kullanım)

Hikâye: Halo 2 (2004) ve 50 davranış

Bungie’den Damian Isla, GDC 2005’te “Handling Complexity in the Halo 2 AI” konuşmasını yaptı. Sorun şuydu: oyuncular NPC’lerin çok şey yapmasını istiyor (siper al, araca bin, el bombası at, liderini kaybedince kaç…) ama davranış sayısı arttıkça FSM’ler yönetilemez oluyordu.

  • Çözüm: davranışları bir ağaçta (aslında bir DAG — aynı alt ağaç birden çok yerde) toplamak. Halo 2’nin çekirdek ağacında yaklaşık 50 davranış vardı.
  • En çok kullanılan karar biçimi öncelikli liste (prioritized-list): çocukları sırayla dene, ilk çalışabilen çalışsın; ama üstteki bir kardeş bir sonraki tick’te onu kesebilir.
  • Ağırlıklı puanlarla seçim de denendi ama Isla’nın gözlemi: “2–3 seçenekte sayılarla oynamak olur, 20’den fazla seçenekte neredeyse imkânsız.” Uygunluk testi bu yüzden evet/hayır yapıldı.
📜 SonrasıIsla’nın yazısı Gamasutra’da yayımlandı ve endüstriye yayıldı. Spore ekibi (Chris Hecker vd.) yaratık YZ’sini “Halo tarzı, sürüm 1.5” bir BT ile yeniden yazdı; Unreal Engine 4 (2014) BT’yi motora yerleşik araç olarak koydu; Unity 6 resmî “Behavior” paketini çıkardı.
🎬 İzleyinThe Behaviour Tree AI of Halo 2 (AI and Games) · Isla’nın konuşması (Bungie arşivi)

🎬 Ara: Halo 2’nin davranış ağacı

The Behaviour Tree AI of Halo 2
AI and Games (Tommy Thompson) · 9 dk 49 sn · YouTube’da aç

Az önceki hikâyenin ayrıntısı: Damian Isla’nın ağacı nasıl kurduğu, öncelik sırası, “uyaranlar” ve davranışların neden FSM yerine ağaçla yönetildiği. Sektörün davranış ağacına geçişinin başladığı oyun.

🤔 İzlerkenVideoda ağacın kökünde hangi büyük dallar var? Bir davranış daha öncelikli bir dalı nasıl kesiyor? “Uyaran davranışı” (lider ölünce kaç) ağaca nasıl ekleniyor?

Aynı nöbetçi, ağaç olarak

  • Soldan sağa = öncelik sırası. “Kaç” en solda: canım azsa başka hiçbir şeye bakmadan kaçarım.
  • Her alt dal bir sequence (→): “koşullar tamamsa eylemi yap”.
  • Kök bir selector (?): “ilk işe yarayan dalı seç”.
  • Y2’deki FSM’de 9 geçiş satırı vardı; burada hiç geçiş oku yok. Geçişler örtük: daha soldaki dal açılınca otomatik olarak ona geçilir.
  • El bombası kuralı? En sola tek bir dal: → [bomba var mı?] [siper al]. Bitti.

FSM mi, davranış ağacı mı?

Sonlu durum makinesiDavranış ağacı
Kararın yeriHer durumun içinde, çıkış oklarındaAğacın yapısında: sıra = öncelik
Yeni davranış eklemekYeni durum + birçok yeni okDoğru yere tek bir dal
Yeniden kullanımZor (oklar duruma bağlı)Kolay: “siper al” alt ağacı her NPC’de
“Şu an ne yapıyor, neden?”Durum adı söylerKökten yaprağa yol söyler (hangi koşul neyi engelledi)
Küçük işler (kapı, ışık, menü)Daha basit ✔Fazla
MaliyetÇok ucuzUcuz ama her tick’te birçok koşul (önlemleri var)
💬 Chris Hecker (Spore)“Davranış ağaçlarını hâlâ sağlam biçimde FSM kategorisinde görüyorum. Sihir yeni bir teknik olmalarında değil; geliştirme sürecine o kadar uygunlar ki FSM’lerle ulaşabileceğiniz karmaşıklığı çok çok ileri taşıyorlar.” — yani BT, FSM’nin ölçeklenen bir yazım biçimi.
Quiz 1 · FSM’den ağaca
Bir davranış ağacında “kaçmak saldırmaktan daha önemlidir” bilgisi nasıl ifade edilir?
Klasik bir BT’de öncelik sıradır: selector çocuklarını soldan sağa dener. Ok çizmek FSM’nin yoludur; ağırlıkla seçmek ise Utility AI’ın (Y4) yolu — BT’ye “utility selector” olarak eklenebilir, ama temel BT’de yoktur.
LEVEL 1
Düğüm türleri
üç cevap, beş tür düğüm
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

Her düğüm üç cevaptan birini verir

SUCCESS · başarılı“İşimi yaptım / koşul doğru.”
Kapıyı açtım. Oyuncuyu görüyorum.
FAILURE · başarısız“Yapamadım / koşul yanlış.”
Kapı kilitli. Oyuncu görünmüyor. Yol yok.
RUNNING · sürüyor“Hâlâ uğraşıyorum, sonraki karede tekrar sor.”
Hedefe yürüyorum (3 sn sürecek). Şarjör değiştiriyorum.
  • RUNNING, BT’yi oyunlar için kullanışlı yapan şeydir: oyunda eylemler zaman alır, bir fonksiyon çağrısı gibi anında bitmez.
  • Ebeveyn düğüm, çocuklarının cevaplarına bakıp kendi cevabını üretir. Kökün cevabı, ağacın o karedeki kararıdır.

Selector ve sequence: “B planı” ve “tarif”

? Selector (fallback)

Çocukları soldan sağa dener.

  • Bir çocuk SUCCESS ya da RUNNING derse → dur, aynı cevabı yukarı ver.
  • FAILURE derse → bir sonrakini dene.
  • Hepsi başarısızsa → FAILURE.
? Kapıdan geçSUCCESSKapıyı aç1. FAILUREKilidi kır2. SUCCESSPencereden gir3. denenmez

Mantıktaki VEYA: “A olmazsa B, o da olmazsa C”.

→ Sequence

Çocukları soldan sağa çalıştırır.

  • Bir çocuk FAILURE ya da RUNNING derse → dur, aynı cevabı yukarı ver.
  • SUCCESS derse → bir sonrakine geç.
  • Hepsi başarılıysa → SUCCESS.
→ SaldırRUNNINGDüşman görünüyor1. SUCCESSSilahı doldur2. SUCCESSAteş et3. RUNNING

Mantıktaki VE: “A’yı yap, sonra B’yi, sonra C’yi”.

İsimler araca göre değişir: selector = fallback (BehaviorTree.CPP) = Try In Order (Unity Behavior) = priority/prioritized-list (Halo 2). Sequence her yerde sequence.

Aynı kalıp, oyun karakteriyle: odaya gir 🚪

Ağaç hep aynı; değişen yalnızca dünya. Beş senaryoyu sırayla deneyin ve her birinde ağacın hangi dalda durduğunu önce tahmin edin. Renkler: yeşil = denendi, oldu · kırmızı = denendi, olmadı · gri = sıra ona hiç gelmedi.

Çizimle: üç dekoratör, üç küçük ağaç

Dekoratör (eşkenar dörtgen) tek bir çocuğun üstüne oturur ve onun cevabını değiştirir ya da ne zaman çalışacağını belirler. Renkler bu tick’teki cevaplar. Sonraki slayt bütün dekoratörleri tablo hâlinde veriyor.

Dekoratörler: tek çocuğu “süsleyen” düğümler

dekoratörne yaparoyun örneği
Inverter (değil, !)SUCCESS ↔ FAILURE; RUNNING aynen“Oyuncu görünmüyorsa devriye gez”
Cooldown (bekleme)Çocuk başarılı olunca X sn boyunca FAILURE döndürEl bombası 8 sn’de bir (Halo 2’de tam bu vardı)
Repeat / Until FailÇocuğu N kez / başarısız olana dek tekrar çalıştır“Mermi bitene kadar ateş et”
Time Out (zaman aşımı)Çocuk X sn’de bitmezse kes, FAILURE“5 sn’de kapıya ulaşamazsan vazgeç”
Succeeder (her zaman başarılı)Sonuç ne olursa olsun SUCCESSİsteğe bağlı adım: “bağırabiliyorsan bağır” sequence’ı bozmasın
Koşullu dekoratör (Unreal)Koşul doğruysa dalı aç; değişirse dalı iptal et“HasLineOfSight?” anahtarı doğruysa kovala

Bunların hepsi Unity Behavior’da hazır düğüm olarak var: Inverter, Cooldown, Repeat, Time Out, Succeeder, ayrıca Abort/Restart koşulları.

Çizimle: paralel düğüm ve iki tür yaprak

Solda iki eylem aynı karede çalışıyor: karakter hem yürüyor hem etrafı tarıyor. Sağda yaprakların iki türü: koşul bir soru sorar ve hemen cevap verir; eylem dünyayı değiştirir ve çoğu zaman birkaç kare sürer.

Yapraklar ve paralel düğüm

Koşul (condition)Dünyaya bakar, anında SUCCESS/FAILURE der; asla RUNNING demez ve dünyayı değiştirmez. Diyagramda yuvarlak köşeli, mavi çerçeve. canım az mı? · görüyor mu? · mermim var mı?
Eylem (action / task)Dünyayı değiştirir. Çoğu zaman birkaç kare RUNNING der, sonunda SUCCESS ya da FAILURE. Diyagramda köşeli, mor çerçeve. yürü · ateş et · animasyon oynat · ses çal
⚙️ ParallelÇocukların hepsini aynı karede çalıştırır; “kaç tanesi başarılı olursa ben başarılıyım” kuralı (hepsi / biri / N tanesi) düğüm ayarıdır. Örnek: “hedefe yürü” ∥ “yürürken etrafı tara”.

“Paralel” çoklu iş parçacığı demek değil: aynı karede sırayla çalışırlar (Unreal belgeleri de bunu vurgular). Unreal tam paralel yerine sade bir Simple Parallel (bir ana görev + bir arka plan alt ağacı) sunar; Unity Behavior’da Run In Parallel var.

Quiz 2 · düğüm türleri
Sequence → [görüyor mu? = SUCCESS] [yakın mı? = FAILURE] [Ateş et]. Sequence ne döndürür ve “Ateş et” çalışır mı?
Sequence ilk başarılı olmayan çocukta durur ve onun cevabını verir. “yakın mı?” başarısız → sequence FAILURE, üçüncü çocuk hiç ziyaret edilmez. Üst selector bu durumda bir sonraki dalı (kovala) dener.
LEVEL 2
Tick: ağaç nasıl düşünür
kökten yaprağa, soldan sağa, her karede
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

Çizimle: bir tick, altı adımda

Numaralar ziyaret sırası. Kök sol çocuktan başlar; “canım az mı?” hayır deyince o sequence başarısız olur ve selector bir sonraki çocuğu dener. “Görüyor mu?” evet dediği için “kovala” çalışır ve tick burada biter: sağdaki “devriye” hiç sorulmaz. Sonraki karede her şey kökten yeniden.

Bir “tick”in anatomisi

  1. Oyun döngüsü (ör. Unity Update) ağaca sorar: root.Tick().
  2. Kök, ilk çocuğunu tick’ler; o da kendi ilk çocuğunu… derinlik öncelikli, soldan sağa.
  3. Yapraklar cevap verir; cevaplar yukarı doğru selector/sequence kurallarıyla birleşir.
  4. Bir RUNNING eyleme ulaşıldığında o eylem bu karenin işidir (yürü, ateş et).
  5. Sonraki karede yeniden kökten. Daha soldaki bir koşul doğru olduysa ağaç kendiliğinden o dala geçer: reaktiflik.
🎒 Derinlik öncelikli yürüyüşBST sunumundaki “önce sol alt ağaç, sonra sağ” yürüyüşüyle aynı: bir düğümün çocuklarını sırayla ve tamamen bitirmeden kardeşine geçmezsin. Fark: burada çocuk cevabına göre erken durabiliriz.
⚙️ Her kare mi?Küçük ağaçlar için evet. Büyük oyunlarda saniyede 5–10 tick ya da olay güdümlü (Level 4) yapılır.

Adım adım tick 👣

  1. Varsayılan: “görüyorum” açık, “yakın” kapalı. “Saldır” dalında “görüyor mu?” yeşil, “yakın mı?” kırmızı olur ve sequence orada durur. Selector bir sonraki dala (“Kovala”) geçer.
  2. “canım az” kutusunu açın: tick ilk dalda biter, geri kalan her şey gri kalır. Yüksek öncelik = ucuz karar.
  3. Her şeyi kapatın: ağacın tamamı dolaşılır, devriyeye ulaşmak en pahalı yoldur. (Halo 2 bu maliyeti “davranış etiketleri” ile düşürdü — Level 4.)
  4. Dikkat: “görüyor mu?” iki kez soruluyor. Gerçek motorlarda bu tür koşullar önbelleğe alınır ya da bir kara tahtadan okunur.
🔎 İZLEYİCİDE DENEYİN
  1. Varsayılan: “görüyorum” açık, “yakın” kapalı. “Saldır” dalında “görüyor mu?” yeşil, “yakın mı?” kırmızı olur ve sequence orada durur. Selector bir sonraki dala (“Kovala”) geçer.
  2. “canım az” kutusunu açın: tick ilk dalda biter, geri kalan her şey gri kalır. Yüksek öncelik = ucuz karar.
  3. Her şeyi kapatın: ağacın tamamı dolaşılır, devriyeye ulaşmak en pahalı yoldur. (Halo 2 bu maliyeti “davranış etiketleri” ile düşürdü — Level 4.)
  4. Dikkat: “görüyor mu?” iki kez soruluyor. Gerçek motorlarda bu tür koşullar önbelleğe alınır ya da bir kara tahtadan okunur.

🔗 Başka gözle: etkileşimli anlatımlar ve yazılar

Aynı konuyu başka bir anlatımla, kendi elinizle oynayarak görmek çok işe yarar. Kartlar yeni sekmede açılır; çoğu İngilizce ama görsel ve etkileşimli.

Elle tick: siz ağaç olun ✍️

can azgörüyoryakıniz varseçilen eylemziyaret edilen yapraklar
hayırevetevethayırAteş etcan az? · görüyor? · yakın? · Ateş
evetevetevetevetKaçcan az? · Kaç (gerisi gri)
hayırhayırevetevetİze gitcan az? · görüyor? · görüyor? · iz var? · İze git
hayırhayırhayırhayırDevriye5 koşulun hepsi başarısız → en sağdaki eylem

Üçüncü satırdaki ilginç nokta: “yakın” doğru olsa da önemsiz, çünkü “görüyor mu?” başarısız olduğunda “yakın mı?” hiç sorulmuyor.

Quiz 3 · tick
Selector’ün çocukları sırayla FAILURE, RUNNING, SUCCESS cevabı verecek durumda. Selector ne döndürür, üçüncü çocuk tick’lenir mi?
Selector ilk başarısız olmayan çocukta durur: ikinci çocuk RUNNING → selector de RUNNING der ve üçüncüye hiç gitmez. Bu, “ikinci plan şu an sürüyor, onu bölme” demektir. Sonraki karede ilk çocuk başarılı olursa (yüksek öncelik), ikinci çocuğun işi kesilir.

Canlı ağacı okuma kılavuzu

Sol: aynı nöbetçi, aynı arena
  • Y2’deki sahnenin aynısı: üçgen = nöbetçi, yeşil daire = oyuncu (fareyle siz), dilim = görüş konisi, koyu kutular = duvar.
  • Nöbetçinin üstündeki yazı artık bir “durum” değil, ağacın bu karede seçtiği eylem.
  • Alttaki dört sayaç ağacın o karede sorduğu koşulların cevapları: can az mı, görüyor mu, yakın mı, iz var mı?

Kontroller: fare = oyuncu · tıkla = ses (iz bırakır) · X = ateş et (−25 can).

Sağ: ağaç, satır satır
  • Ağaç yukarıdan aşağı liste olarak yazılı; girinti = çocuk. Üstteki dal = yüksek öncelik.
  • ? selector · → sequence · ◆ koşul · ▶ eylem.
  • Yeşil = başarılı · kırmızı = başarısız · turuncu = çalışıyor · renksiz = bu karede hiç sorulmadı.
  • Turuncu satırları kökten aşağı izleyin: o yol, nöbetçinin şu anki kararı.

Önce “Durdur” + “1 kare” ile tek tek ilerleyip listeyi okuyun; sonra oynatın.

🔗 Dışarıda da deneyin: mistreevous görselleştirici (ağacı metinle yazın, canlı çalışsın) · BehaviorTree.CPP belgeleri (düğüm türleri, animasyonlu anlatım).

Canlı: davranış ağaçlı nöbetçi 🌳

🔎 DEMODA DENEYİN
  1. Görüş konisine girin ve uzak durun: “Kovala” dalının yeşil yandığını görün. Yaklaşın: yol bir dal sola, “Saldır”a kayar.
  2. İki kez ateş edin: can 30’un altında. Ağacın yalnızca ilk dalı renkli; nöbetçi kaçıp iyileşiyor. Kaçış 70’e kadar sürüyor: koşul “önceki eylem KAÇ ise < 70” — histerezis, tıpkı Y2’deki gibi.
  3. Duvarın arkasına saklanın: “iz var mı?” koşulu son görülen yere gitmeyi sağlıyor (4 sn hafıza). Bir yere tıklayıp ses çıkarın: aynı dal.
  4. ▶| 1 kare ile ilerleyin: Y2’deki FSM nöbetçisiyle aynı davranış, ama ortada tek bir geçiş oku yok.

Sayaçlar: ağacın o karede gördüğü koşul değerleri. Histerezis ve “iz” hafızası ağacın dışında, algı katmanında hesaplanıyor — sağlıklı bir BT tasarımının ilk kuralı (Level 4: kara tahta).

LEVEL 3
Kod: kendi BT motorumuz
bir arayüz, beş sınıf, 60 satır
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

🎒 Ön bilgi: “her düğüm Tick’e cevap verir”

Soyut sınıf / arayüz: “Bu aileden olan herkesin bir Tick() metodu vardır” sözleşmesi. Ama nasıl çalıştığını her alt sınıf kendisi yazar.

  • Selector.Tick(): çocukları B planı mantığıyla dener
  • Sequence.Tick(): çocukları tarif mantığıyla çalıştırır
  • Condition.Tick(): bir soruyu cevaplar

Ebeveyn, çocuğunun hangi tür olduğunu bilmez, sadece child.Tick() der. Buna çok biçimlilik (polymorphism) denir: aynı çağrı, türüne göre farklı iş.

🎒 Özyineleme (recursion)Selector.Tick() içinde çocuğun Tick()’i çağrılıyor; çocuk da bir selector olabilir ve o da kendi çocuklarını çağırır… Bir fonksiyonun (dolaylı olarak) kendini çağırmasına özyineleme denir. Yapraklara ulaşınca durur, çünkü yaprakların çocuğu yoktur.
BenzetmeBir şirkette müdür “bu işi kim yapabilir?” diye ekibine sorar; ekip liderleri kendi ekiplerine sorar; asıl işi en alttaki çalışan yapar ve cevap yukarı doğru iletilir.

Motorun kalbi: durum, düğüm, selector, sequence (1/2)

Motorun kalbi: durum, düğüm, selector, sequence (2/2)

Yapraklar ve dekoratörler (1/2)

Yapraklar ve dekoratörler (2/2)

Nöbetçi ağacını kurup her karede çalıştırmak

Cooldown soğurken FAILURE der; o zaman selector bir sonraki dala (Kovala) geçer: nöbetçi ateş edemediği anlarda hedefe doğru yürür. Bu davranış istenmiyorsa Cooldown’ı sequence’ın dışına alın.

🎒 Kod sözlüğü

abstract class Nodesoyut sınıfDoğrudan nesnesi oluşturulamaz; alt sınıflar için şablon. abstract Tick = “alt sınıf bunu yazmak zorunda”
overridegeçersiz kılmaÜst sınıfın metodunu alt sınıfta yeniden yazmak
params Node[] · ...children · *childrendeğişken sayıda parametrenew Selector(a, b, c) gibi istediğiniz kadar çocuk verebilmek; içeride dizi olarak gelir
Func<Guard, bool>fonksiyon türü“Guard alıp bool döndüren fonksiyon” tutan değişken
g => g.hp < 30 · lambda g: g.hp < 30lambda / ok fonksiyonuAdsız minik fonksiyon. Uzun hâli: bool LowHp(Guard g) { return g.hp < 30; } yazıp new Condition(LowHp) demek
Status Tick(Guard g) => ...;ifade gövdeli metotTek satırlık metodun kısa yazımı: { return ...; } ile aynı
a ? b : cüçlü (ternary) işleç“a doğruysa b, değilse c”
readonlysalt okunurYapıcıda bir kez atanır, sonra değişmez

🌱 Isınma kodu: selector ne döndürür?

Selector, FAILURE olmayan ilk çocukta durur. Başlangıç kodu RUNNING’i atlayıp arkasındaki SUCCESS’e gidiyor — Quiz 3’teki hatanın aynısı. Koşulu r !== "FAILURE" yapın.

🌱 Isınma kodu: sequence ne döndürür?

Selector’ın ayna görüntüsü: SUCCESS olmayan ilk çocukta dur; hepsi başarılıysa SUCCESS. Boş bir sequence’ın cevabı da SUCCESS’tir (“yapılacak adım kalmadı”). Bu iki küçük fonksiyon, bir davranış ağacı motorunun kalbidir.

🧪 Canlı laboratuvar: ağacı siz kurun

Ağacı tamamlayın: kaç (lowHp) → saldır (sees + close) → kovala → araştır (clue → SUPHE) → devriye. Test 16 algı birleşiminin hepsini dener. Sonra bilerek “Kovala” dalını “Saldır”ın soluna alın: nöbetçi neden hiç ateş etmiyor?

🐍 Kod laboratuvarı: tick fonksiyonunu yazın

Sequence: sırayla çocukları tick’le, SUCCESS olmayan ilk cevabı (eylemiyle birlikte) döndür; hepsi başarılıysa ("SUCCESS", None). Selector: FAILURE olmayan ilk cevabı döndür; yoksa ("FAILURE", None). Not: SUCCESS↔FAILURE, eylemi aynen geçir. Boş sequence ve boş selector testleri de var!
LEVEL 4
Kara tahta, hafıza, olaylar
RUNNING’in bedeli ve büyük oyunların çözümleri
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

Kara tahta (blackboard): ağacın not defteri

  • Düğümler birbirine doğrudan veri göndermez; ortak bir anahtar → değer tablosuna yazar ve oradan okur.
  • Örnek anahtarlar: TargetActor, LastSeenPos, HasLineOfSight, Ammo.
  • Algı katmanı (görüş, ses) kara tahtaya yazar; ağaç sadece okur ve karar verir. Demodaki “iz var mı?” böyle çalışıyor.
  • Unreal’da kara tahta ayrı bir varlık (asset), Unity Behavior’da “Blackboard variables”.
📜 Halo 2’de hafıza türleriIsla dört tür hafıza ayırdı:
  • Davranışa ait, kalıcı: son el bombası zamanı (cooldown)
  • Davranışa ait, kısa ömürlü: davranış bitince silinir
  • Nesneye ait: hedefin son görüldüğü yer ve yön
  • Nesne + davranış: “bu hedefi aramayı denedim, başaramadım”

Bellek hilesi: ~100 NPC × ~60 davranış × 32 bayt ≈ 192 KB yerine, yalnızca çalışan yolun (4 seviye) hafızasını tutarak ≈ 25 KB. Xbox’ın sınırlı belleğinde fark büyüktü.

Çizimle: ikinci tick’te sequence nereden başlar?

Önceki tick’te “nişan al” bitti ve sıra “ateş et”e geldi. Solda reaktif sequence: her tick baştan, “nişan al” yeniden çalışıyor. Sağda hafızalı sequence: “nişan al”ı hatırlıyor, doğrudan “ateş et”ten devam ediyor. Hangisinin doğru olduğu duruma bağlı: sonraki slayt.

RUNNING sorunu: kökten mi, kaldığı yerden mi?

Sequence → [nişan al] [ateş et] [şarjör değiştir]. “Nişan al” 1 sn RUNNING dedi ve bitti; sıra “ateş et”te. Sonraki tick’te ne olacak?

  • Reaktif: her tick kökten ve her sequence baştan. Koşullar sürekli yeniden kontrol edilir (bizim motor ve demolar böyle). Ama “nişan al” yeniden başlayabilir!
  • Hafızalı: sequence kaldığı çocuktan devam eder; önceki başarılı kardeşleri tekrar sormaz. Ama arada koşul bozulduysa fark etmez.

Gerçek kütüphaneler ikisini de sunar; doğru olanı seçmek tasarımcının işi. Kaba kural: koşulları reaktif bir ebeveynin altına, uzun eylem dizilerini hafızalı bir sequence’a koyun.

BehaviorTree.CPPçocuk FAILUREçocuk RUNNING
Sequencebaştan başlaaynı çocuğu tekrar tick’le
ReactiveSequencebaştan başlabaştan (koşullar yeniden)
SequenceWithMemoryaynı çocuğu tekraraynı çocuğu tekrar

py_trees: Sequence(memory=True/False). Champandard & Dunstan bunu “1. nesil” (her tick kökten tarama) ve “2. nesil” (çalışan düğümleri hatırlayan, olaylarla uyanan) ağaçlar olarak adlandırır.

⚠️ Kesilen eylemi temizleyinYüksek öncelikli dal açılınca çalışan eylem yarıda kalır. Animasyonu durdurmak, rezervasyonu bırakmak için bir halt / OnEnd çağrısı gerekir; basit motorumuzda bu yok.

Olay güdümlü ağaçlar: Unreal’ın yolu

Unreal belgeleri: “Unreal Engine davranış ağaçları her karede gereksiz iş yapmamak için olay güdümlüdür. Bir şeyin değişip değişmediğini sürekli kontrol etmek yerine ağaç, değişiklikleri tetikleyebilecek olayları pasif olarak dinler.”

  • Decorator = koşul. Yaprak değil, dalın üstüne takılır: “HasLineOfSight doğruysa bu dal açılabilir”.
  • Observer aborts: kara tahtadaki değer değişince dekoratör uyanır. Self = kendi dalımı kes · Lower Priority = sağdaki (düşük öncelikli) çalışan dalı kes · Both.
  • Service: bir dal aktifken her X saniyede bir çalışan güncelleyici. “Kovalarken 0,5 sn’de bir en yakın düşmanı seç.”
  • Task = eylem yaprağı (Blueprint’te Event Receive Execute AI → Finish Execute).
📜 Halo 2: uyaran davranışları“Lider ölünce kaç” kuralını her tick test etmek israf. Isla’nın çözümü: “bir aktör öldü” olayı gelince, ağaca 1–2 saniyeliğine “lider öldüğü için kaç” dalı eklenir. Dal ağacın içinde olduğu için daha öncelikli dallar (ör. araca binmek) yine söz hakkına sahip.
⚙️ Neden önemli?Yüzlerce NPC × her karede tüm koşullar = boşa giden işlemci. Olaylar sayesinde koşullar yalnızca değer değiştiğinde hesaplanır. Champandard & Dunstan, olay güdümlü BT örneği olarak Bulletstorm’u (2011) anar (Game AI Pro, 6. bölüm).

Halo 2’nin diğer üç hilesi

Dürtüler (impulses)Önceliğin sabit olmadığı durumlar: “normalde savaş, araca binme; ama oyuncu araçtaysa bin”. Koşul ayrı bir “dürtü” düğümüne alınır; dürtü, ağacın başka bir yerindeki davranışı işaret eder. İlke: “Açıklığı her şeyin üstünde tut.”
Davranış etiketleri“Araçta mı? Hedefi görüyor mu?” gibi sık koşullar bir bit vektörü olarak tutulur; uymayan büyük dallar hiç test edilmez. Yan etki: ağacın büyük kısımları kilitlenip açılır — araç yolcusunun kaçma/arama dalları kapalıdır.
Özel davranışlarOrtak bir temel ağaç + karaktere özel eklemeler. Grunt’lar (korkak uzaylılar) çok sayıda “geri çekil” dürtüsü alır, deniz piyadeleri ekip koordinasyonu davranışları. Flood ise o kadar farklıydı ki tamamen ayrı bir ağaç aldı.

Isla’nın ilkelerinden biri: “Hacklenebilirlik anahtardır.” Gerçek projede tasarımcılar her zaman kuralın istisnasını isteyecektir; mimari buna yer açmalı.

Quiz 4 · olaylar
Unreal’da “Kovala” dalının dekoratöründe “Observer aborts: Lower Priority” seçili. Nöbetçi devriye gezerken (sağdaki dal) HasLineOfSight doğru olursa ne olur?
Lower Priority: dekoratörün koşulu doğru olunca, kendisinden daha düşük öncelikli (daha sağdaki) çalışan dalları iptal eder ve kendi dalını açar. Self ise koşul yanlışa dönünce kendi dalını keser. Bu, reaktifliğin olay güdümlü hâlidir.
LEVEL 5
Tuzaklar ve melezler
dev ağaçlar, titreme, FSM+BT, utility+BT
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

Sık düşülen tuzaklar

1) Dev, tek parça ağaçYüzlerce düğüm tek ekranda → kimse okuyamaz. Çare: alt ağaçlar (Unity: Run Subgraph, Unreal: Run Behavior) ve isimlendirilmiş dallar.
2) Dal titremesiFSM’deki titremenin aynısı: “yakın mı?” eşiğin etrafında gidip gelir, ağaç Saldır↔Kovala arasında zıplar. Çare: koşullarda histerezis, Cooldown/minimum süre, kara tahtada hafıza.
3) Pahalı koşullar her tickGörüş ışını, yol bulma… Çare: algıyı ayrı katmanda saniyede birkaç kez hesaplayıp kara tahtaya yaz; ya da servisler/olaylar.
📜 Anthony Francis (Google robotik, Game AI Pro 3, 9. bölüm)
  • Çok fazla düzenleyici sınıf: “beceri”, “modül”, “görev” için ayrı kök sınıflar yazmayın; BT’nin kendi kavramları yeterli.
  • Erkenden dil icat etmek: Not, And, Or, If… düğümleri ekledikçe ağaç bir programlama diline dönüşür. Gerçekten gerekene kadar bekleyin.
  • Her şeyi kara tahtadan geçirmek: prototipte basit veri akışı için dilin kendi değişkenleri daha güvenilir.
4) Ağacı programlama dili sanmakDöngüler, sayaçlar, karmaşık matematik yapraklara (koda) aittir. Ağaç karar verir; hesap yapmaz.

Gerçek projelerde teknikler karışır

The Last of Us (2013)Naughty Dog’un insan düşmanlarında üst seviye kararlar “beceriler” (skills): panik, ilerle, yakın dövüş, silahlı çatışma, saklan, araştır… Beceriler öncelik sıralı; her kare her biri “çalışmak istiyor musun?” diye sorulur ve en öncelikli olan kazanır — bir selector. Her becerinin içi ise kendi FSM’i (Game AI Pro 2, 34. bölüm).
Final Fantasy XV (2016)Durum makinesi + davranış ağacı aynı editörde: büyük resmi bir durum makinesi (FSM) çizer, her durumun içinde bir davranış ağacı (BT = behavior tree) çalışır (Game AI Pro 3, 11. bölüm).
Utility + BTBill Merrill (Game AI Pro, 10. bölüm): mevcut bir BT’ye “utility selector” eklemek — çocukları sırayla değil, puanına göre dener. Y4’ün konusu.
Planlayıcı + BTKinect Star Wars’taki Jedi YZ’si: BT’yi “simüle edip” birkaç adım ilerisini planlayan melez yapı (Hilburn, Game AI Pro, 8. bölüm). Y5’teki GOAP’a köprü.
Unreal StateTreeUnreal’ın yeni aracı: durum makinesinin durumlarını, BT’nin seçicileriyle birleştirir. Y2’de de değindik.
LEVEL 6
Gerçek oyunlarda
Alien: Isolation, Spore, Amalur, Mafia III, Paragon… ve robotlar
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

Derin hikâye: Alien: Isolation’ın “öğrenen” canavarı 👾

Creative Assembly’nin 2014 korku oyununda tek bir uzaylı sizi bütün oyun boyunca avlar. İki beyin var (Y1’den hatırlayın): yönetmen sizin yerinizi hep bilir ve uzaylıyı ara sıra doğru yöne “dürter”; uzaylı ise hile yapmaz, sizi duyularıyla bulmak zorundadır.

  • Uzaylının davranış ağacında 100’den fazla düğüm var; en üstte ~30 düğüm hangi tür davranışın çalışacağını seçiyor.
  • Asıl numara: ağacın bazı bölümleri oyun başında kilitli. Oyuncu belirli taktikleri kullandıkça (ör. dolaplara saklanmak, alev silahı) ilgili dallar açılıyor: uzaylı dolapların içine bakmayı, alevden sonra geri çekilip başka yoldan gelmeyi “öğreniyor”.
  • Tasarımcı Andy Bray’in vurguladığı kural: kilit açan koşulların hiçbiri oyuncunun ölümüne yol açan olaylardan gelmiyor — yoksa oyuncu neyi yanlış yaptığını anlayamadan uzaylı avantaj kazanırdı.
  • Oyuncu hep aynı taktiği kullanmasa bile, belirli noktalarda kalan dallar zorla açılır; böylece uzaylı oyuncuyla aynı hızda “gelişir”.
💡 DersBu bir makine öğrenmesi değil! Tasarımcının önceden yazdığı dalların zamanla açılması. Oyuncuya “öğreniyor” hissi veren, tamamen kontrol edilebilir bir yapı. Halo 2’nin “davranış etiketleri”yle dalları kilitleme fikrinin akrabası.
📖 Okuyun / izleyinThe Perfect Organism: The AI of Alien: Isolation (Tommy Thompson) · video

BT kullanan oyunlar: kısa turlar

Spore (2008)Yaratık YZ’si önce başka bir sistemle yazılmış, sorun çıkınca ekip Halo tarzı BT’ye geçmiş. Chris Hecker, Isla ve Bungie ekibiyle konuşup sistemi “sürüm 1.5” olarak tasarladığını ve belgelerini yayımladığını anlatıyor.
Kingdoms of Amalur: Reckoning (2012)BT yapısı C++’ta, yaprak davranışları Lua betiklerinde. Tasarımcılar motoru yeniden derlemeden davranış yazabildi (Dawe, Game AI Pro, 7. bölüm).
Mafia III (2016)Açık dünya düşmanlarında BT, algı / pozisyon seçimi / siper sistemlerini birbirine bağlayan “tutkal”. İlginç ayrıntı: ateş ederken “ıskala mı vur mu” kararını BT değil, ayrı bir sistem veriyor; BT sadece ne zaman ateşe başlanacağına karar veriyor.
Paragon botları (Epic, 2016)Unreal’ın kendi BT’siyle: bir “ana ağaç” genel yapıyı tanımlar, kahramana özel kısımlar parametre olarak verilir (Game AI Pro 3, 32. bölüm, Mieszko Zieliński).
Motorlara yerleştiBT bugün AAA’da en yaygın karar yapılarından biri: Unreal (2014’ten beri), CryEngine (“Modular Behavior Tree”), Unity 6 (Behavior paketi) motorla birlikte gelir. Yani öğrendiğiniz kavramlar doğrudan iş ilanlarındaki araçlara karşılık gelir.
🤖 Oyunların dışında: robotlarBT oyunlardan robotiğe geçti: ROS 2’nin navigasyon yığını Nav2, görevlerini BehaviorTree.CPP ağaçlarıyla tanımlar. Colledanchise & Ögren’in kitabı tam bu geçişi anlatır. Oyun geliştiricisi olarak öğrendiğiniz şey, robotik mühendisliğinde de iş görür.
LEVEL 7
Kütüphaneler ve entegrasyon
Unity, Unreal, Godot, web ve Python
  • FSM’den ağaca
  • düğüm türleri
  • tick: ağaç nasıl düşünür
  • kod: kendi BT motorumuz
  • kara tahta, hafıza, olaylar
  • tuzaklar ve melezler
  • gerçek oyunlarda
  • kütüphaneler ve entegrasyon

🧰 Kütüphaneler ve araçlar

adplatformne yapar / sınırlarınasıl eklenir
Unity BehaviorUnity 6+ · ücretsiz, resmîGörsel “behavior graph” (dallar birleşebilir), Blackboard, hazır düğümler (Try In Order, Sequence, Run In Parallel, Cooldown, Inverter, Repeat, Patrol, Navigate To Target), C# ile özel düğüm. Yeni bir paket, topluluk kaynağı az.Package Manager → + → Add package by name → com.unity.behavior
Behavior Designer (Opsive)Unity · ücretliYıllardır en yaygın Unity BT eklentisi; çok sayıda hazır görev, hata ayıklayıcı, Movement/Tactical paketleri. Kaynak kod paralı.Asset Store’dan satın al → içe aktar
NodeCanvasUnity · ücretliBT + FSM + diyalog ağacı aynı araçta; FSM durumunun içinde BT çalıştırma (FFXV tarzı melez).Asset Store
NPBehave · Fluid BTUnity · açık kaynakKoddan ağaç kurma. NPBehave olay güdümlü (Unreal tarzı) ve kara tahtalı; Fluid BT akıcı (fluent) “builder” sözdizimi.GitHub’dan Packages klasörüne / UPM git URL
Unreal Behavior TreeUnreal 4/5 · yerleşikOlay güdümlü BT + Blackboard + Decorator/Service/Task, görsel hata ayıklayıcı, EQS ile konum sorguları. Unreal dışına taşınmaz.İçerik tarayıcı → Artificial Intelligence → Behavior Tree + Blackboard; AIController’da RunBehaviorTree
BeehaveGodot 4 · açık kaynakDüğüm sahnesi olarak BT; hata ayıklama paneli. GDScript ile yaprak yazılır.AssetLib’de “Beehave” → kur → eklentiyi etkinleştir
LimboAIGodot 4 · açık kaynakBT + hiyerarşik durum makinesi birlikte, görsel editör, C++ ile hızlı; GDExtension ya da modül.AssetLib’de “LimboAI” ya da GitHub sürümü
BehaviorTree.CPP + Groot2C++ · açık kaynakEndüstri/robotik standardı; XML ağaçlar, reaktif ve hafızalı düğümler, Groot2 görsel editör ve canlı izleme. Nav2’nin temeli.CMake / vcpkg / conan; ROS 2 paketi
py_treesPython · açık kaynakEğitim ve prototip için temiz Python BT; ağacı metin/grafik olarak çizer. ROS sarmalayıcısı var. Oyun motoru değil.pip install py_trees
mistreevousJavaScript/TypeScript · açık kaynakKüçük, bağımlılıksız; ağacı MDSL metniyle ya da JSON ile tanımlar. p5.js/Phaser oyunları için ideal.npm install mistreevous

Hepsi 2026 Ekim’de kontrol edildi. Ücretli araçlar için önce ücretsiz seçeneği (Unity Behavior, Beehave/LimboAI) deneyin; gereksinim büyüyünce geçin.

Unity Behavior ile nöbetçi: adım adım

  1. Window → Package Manager → + → Add package by name → com.unity.behavior.
  2. Sahneye NavMesh ekleyin (Y9); nöbetçiye NavMeshAgent.
  3. Project penceresi: Create → Behavior → Behavior Graph. Nöbetçiye Behavior Graph Agent bileşenini ekleyip grafiği atayın.
  4. Blackboard değişkenleri: Player (GameObject), HP (float), SeesPlayer (bool), Waypoints (liste).
  5. On Start → Repeat → Try In Order (selector). Altına dallar: Conditional Guard (HP < 30) → kaç; SeesPlayer → Navigate To Target; en sonda Patrol.
  6. SeesPlayer’ı bir C# betiği güncellesin (algı ağacın dışında!).
  7. Play’e basın, grafiği açık tutun: çalışan düğümler canlı olarak vurgulanır.

Dikkat: editörün ürettiği şablonda ayrıca bir id alanı vardır; onu elle değiştirmeyin. Kesin sözdizimi paket sürümüne göre değişebilir: “Create new Action” sihirbazını kullanın.

Unreal, Godot, web, Python: aynı ağaç

🧩 Projenize BT eklerken: adım adım

  1. Önce kâğıt: öncelik listesini cümleyle yazın (“önce hayatta kal, sonra…”). Her satır bir dal.
  2. Algı ayrı: görüş/ses/can bilgisini bir bileşen hesaplasın, kara tahtaya yazsın. Ağaç sadece okur.
  3. Yapraklar küçük: “Kovala” = hedefe NavMesh ile yürü. Karmaşık işler kodda, karar ağaçta.
  4. Görsel hata ayıklama: araç editörünü Play sırasında açık tutun; kendi motorunuzda aktif yolu NPC’nin üstüne yazdırın.
  5. Titreme kontrolü: eşiklerde histerezis, eylemlerde minimum süre.
  6. Alt ağaçlar: “siper al”, “ekip çağır” gibi parçaları yeniden kullanın.
⚙️ PerformansYüzlerce NPC’de: tick’i her karede değil 5–10 Hz’de yapın, NPC’lerin tick’lerini karelere yayın, pahalı koşulları önbelleğe alın (Y18). Unreal’ın olay güdümlü yapısı bunu sizin yerinize yapar.
FSM mi, BT mi? Pratik karar3–5 davranış, az değişiklik → FSM. Çok davranış, öncelikler, ekipte tasarımcı var → BT. Ağır puanlama gerekiyorsa → Utility (Y4). Uzun vadeli plan gerekiyorsa → GOAP/HTN (Y5).

🤖 Bu konuyu bir YZ kod asistanıyla yazarken

Sık yapılan hatalar — kontrol edin
  • Unity Behavior ile eski “Muse Behavior” ya da Behavior Designer API’lerini karıştırmak (yeni paket, model eski bilgilerle cevap verebilir)
  • Her tick’te new ile düğüm oluşturmak (ağaç bir kez kurulur)
  • Bütün NPC’lerin aynı Cooldown nesnesini paylaşması (bir NPC atınca hepsi bekler!)
  • Koşulu yaprak yerine eylemin içine gömmek: ağaç neden o dalı seçtiğini göstermez
  • RUNNING’i hiç kullanmamak: her eylem tek karede “bitmiş” sayılır
İyi bir istek (prompt) örneği

“Unity 6, Behavior paketi 1.0 (com.unity.behavior). Bir nöbetçi için behavior graph tasarla: Try In Order altında sırasıyla (1) HP < 30 ise kaç, (2) oyuncuyu görüyor ve 6 m’den yakınsa ateş et (0,6 sn cooldown), (3) görüyorsa Navigate To Target, (4) LastSeenPos doluysa oraya git ve 3 sn bekle, (5) Patrol. Blackboard değişkenlerini listele, algıyı güncelleyen ayrı bir MonoBehaviour yaz, ateş için Create new Action ile özel bir düğüm şablonu ver. Sadece bu paketin API’sini kullan.”

  • Öncelik listesini siz yazın, asistan ağacı/kodu kursun
  • Hangi aracı kullandığınızı ve sürümünü söyleyin (Unity Behavior 1.x, Unreal 5.x, Beehave 2.x)
  • Reaktif mi hafızalı mı olacağını açıkça isteyin
  • Algının ağaçtan ayrı bir bileşende olmasını isteyin
  • Kesilen eylemler için temizlik (OnEnd/halt) isteyin

🔬 Araştırma ucu: BT’yi kim yazar?

Evrimle ağaç üretmekLim, Baumgarten & Colton (2010), ticari strateji oyunu DEFCON için BT’leri genetik programlama ile evrimleştirdi: rastgele ağaçlar maç yapıyor, iyiler çaprazlanıyor. Sonuçta oyunun kendi yapay zekâsını yenen ağaçlar çıktı. BT’nin yapısı (alt ağaç değiş tokuşu) evrime çok uygun.
Öğrenme ile BTColledanchise, Parasuraman & Ögren (2019): Super Mario gibi ortamlarda BT’yi örnekleri ve deneyimi kullanarak otomatik büyütmek. Okunabilirliği korurken öğrenme.
LLM ile BT üretmekBTGenBot (2024): küçük bir dil modeli, doğal dilden robot görevleri için BehaviorTree.CPP XML’i üretiyor. Oyun için fikir: LLM ağacı tasarlar, ağaç güvenle çalışır — LLM’in her kare karar vermesi yerine (Y14), çıktısı okunabilir ve test edilebilir bir ağaç olur.

Bu üç yön, “davranışı elle yazmak” ile “davranışı öğrenmek” (Y13) arasındaki köprü. Bitirme projesi için iyi konular.

💬 Tartışma soruları

Yanınızdakiyle 2 dakika konuşun, sonra sınıfça tartışalım
  1. Nöbetçi ağacında “Kovala” dalını “Saldır” dalının soluna alırsanız ne olur? Bu hatayı kodu çalıştırmadan, sadece ağaca bakarak nasıl görürsünüz?
  2. Alien: Isolation’da uzaylı “öğreniyor” gibi görünüyor ama aslında önceden yazılmış dallar açılıyor. Oyuncuyu bu şekilde “kandırmak” sizce sorun mu? Gerçek makine öğrenmesi kullansalardı ne kazanır, ne kaybederlerdi?
  3. Bir kapı, bir ışık düğmesi ve bir boss düşünün. Hangisi için FSM, hangisi için davranış ağacı seçerdiniz? Kararınızı hangi soru belirledi?
  4. Davranış ağacı her karede kökten yeniden düşünüyor. Bu ne zaman bir özellik (hemen tepki), ne zaman bir sorun (yarım kalan işler)?

🚀 Proje ve araştırma önerileri

  1. [kolay] p5.js nöbetçi — Bu sunumdaki 60 satırlık motoru p5.js’e taşıyın; aktif yolu ekranda ağaç olarak çizin.
  2. [kolay] Kapı ve oda — Kapı örneğini bir Unity sahnesinde Unity Behavior ile kurun: açık kapı, kilitli kapı + anahtar, kırılabilir kapı.
  3. [orta] Grunt ve Elite — Aynı temel ağaçtan iki karakter: biri korkak (fazladan “geri çekil” dalları), biri cesur. Halo 2’nin “özel davranışlar” fikri.
  4. [orta] Kilit açılan dallar — Alien: Isolation gibi: oyuncu bir taktiği 3 kez kullanınca düşmanın ağacında yeni bir dal açılsın (ör. saklanma yerlerini kontrol et).
  5. [zor] Olay güdümlü motor — Kendi motorunuza kara tahta + gözlemci (observer) ekleyin: koşullar sadece değer değişince yeniden hesaplansın. Her kare tick ile işlemci süresini karşılaştırın.
  6. [araştırma] Evrilen ağaçlar — Basit bir arena oyununda BT’leri genetik programlamayla evrimleştirin (DEFCON makalesi gibi). Sonuçta çıkan ağaçlar okunabilir mi?
  7. [araştırma] LLM tasarımcı — Bir LLM’den doğal dil tarifinden mistreevous MDSL ya da BT.CPP XML ağacı üretmesini isteyin; ürettiklerini otomatik testlerle (bu sunumdaki 16 algı birleşimi gibi) doğrulayın.

Neler öğrendik? 🎒

  • Davranış ağacı: iç içe öncelik listeleri; soldan sağa = öncelik.
  • Üç cevap: SUCCESS, FAILURE, RUNNING.
  • Selector = B planı (VEYA), sequence = tarif (VE), dekoratör = tek çocuğu değiştirir.
  • Tick: kökten, derinlik öncelikli; reaktiflik bedavaya gelir.
  • Kara tahta: algı yazar, ağaç okur.
  • Reaktif vs hafızalı sequence; olay güdümlü ağaçlar (Unreal).
  • Halo 2, Spore, Alien: Isolation, TLOU, Amalur, Mafia III, Paragon; robotikte Nav2.
  • Araçlar: Unity Behavior, Behavior Designer, Unreal BT, Beehave, LimboAI, BT.CPP, py_trees, mistreevous.
  • Sonraki: Utility AI — sıra yerine puanla karar vermek.

🎮 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.

Halo 2 2004 · nişancı
Serinin ikinci oyunu; davranış ağaçlarını oyun endüstrisine tanıtan YZ’siyle bilinir.
Spore 2008 · yaşam simülasyonu
Tek hücreden uzay çağına bir türü evrimleştirirsiniz; yaratıkların yürüyüşü prosedürel.
Alien: Isolation 2014 · korku / gizlilik
Uzay istasyonunda sizi oyun boyunca avlayan tek bir uzaylıdan saklanırsınız; onu öldüremezsiniz.
The Last of Us 2013 · aksiyon-macera
Salgın sonrası Amerika’da Joel ve Ellie’nin yolculuğu; yoldaş YZ’si çok övüldü.
Kingdoms of Amalur: Reckoning 2012 · aksiyon RPG
Açık dünyalı fantastik rol yapma oyunu; düşman grupları davranış ağacıyla saldırı sırası alır.
Halo: Combat Evolved 2001 · nişancı
Xbox’ın amiral gemisi bilimkurgu nişancısı; korkak küçük Grunt’lar ve lider Elite’ler meşhurdur.

🎮 Bu sunumdaki oyunlar (2/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.

Final Fantasy XV 2016 · aksiyon RPG
Dört arkadaşın yol hikâyesi; yoldaşlar FSM + davranış ağacı karışımı bir YZ ile savaşır.
Mafia III 2016 · açık dünya aksiyon
1968 New Orleans benzeri bir şehirde suç hikâyesi.
Paragon 2016 · MOBA
Epic’in kapatılan üçüncü şahıs MOBA’sı; varlıkları sonradan ücretsiz yayımlandı.
Super Mario Bros. 1985 · platform
Nintendo’nun yan kaydırmalı platform klasiği; zıplama hissi bugün hâlâ ölçüt.
The Sims 2000 · yaşam simülasyonu
Sanal insanların evini kurar, açlık, uyku, eğlence gibi ihtiyaçlarını yönetirsiniz.

Kaynaklar: oyunlardan videolar 🎬

Kaynaklar: araç eğitimleri 🎬

📄 Akademik okumalar

Isla 2005 · Handling Complexity in the Halo 2 AI (GDC 2005 / Gamasutra)
BT’yi endüstriye tanıtan yazı: öncelikli listeler, dürtüler, etiketler, uyaran davranışları, hafıza.
Champandard & Dunstan 2013 · The Behavior Tree Starter Kit (Game AI Pro, Bölüm 6)
1. ve 2. nesil BT, olay güdümlü yapı, örnek C++ kodu.
Francis 2017 · Overcoming Pitfalls in Behavior Tree Design (Game AI Pro 3, Bölüm 9)
Google robotikten pratik dersler: az sınıf, geç dil, ölçülü kara tahta.
Colledanchise & Ögren 2018 · Behavior Trees in Robotics and AI: An Introduction (CRC Press (arXiv sürümü ücretsiz))
BT’nin biçimsel tanımı, FSM/HFSM ile karşılaştırması; ders kitabı.
Iovino vd. 2022 · A Survey of Behavior Trees in Robotics and AI (Robotics and Autonomous Systems)
Alanın kapsamlı taraması: oyunlardan robotiğe.
Lim, Baumgarten & Colton 2010 · Evolving Behaviour Trees for the Commercial Game DEFCON (EvoApplications, LNCS 6024)
BT’leri genetik programlamayla otomatik üretmek.
Colledanchise, Parasuraman & Ögren 2019 · Learning of Behavior Trees for Autonomous Agents (IEEE Transactions on Games)
Öğrenme ile BT oluşturma; Mario örnekleri.
Izzo, Bardaro & Matteucci 2024 · BTGenBot: Behavior Tree Generation for Robotic Tasks with Lightweight LLMs (arXiv 2403.12761)
Küçük dil modelleriyle doğal dilden BT üretmek.

Kaynaklar: okuma 📚

NEXT LEVEL ▶
Utility AI
The Sims’ten Dave Mark’a: kararları puanlarla vermek
SONRAKİ SUNUM ▶