‫Merhaba ve hoş geldiniz.
‫Bu derste, davranış ağacında yeni bir şey olan hizmetleri tanıtacağız.
‫Hizmetlerin ne olduğunu, kalıcı çalışma davranışında bize nasıl yardımcı olduklarını ve C++'da kendimizinkini
‫nasıl yazabileceğimizi öğreneceğiz.
‫Hemen konuya girelim.
‫Artık yapay zeka denetleyicimizde davranış ağacımızda olmayan yalnızca birkaç mantık parçası kaldı.
‫Bunlardan biri başlangıç konumunun ayarlanmasıdır.
‫Bunu hala I kontrolöründen ayarlamak istiyorum.
‫Ancak şimdi davranış ağacımızın içinden yapmak istediğim tik gibi şeyler.
‫Burada ne yapmak istiyorum?
‫Bunu nasıl yapabilirim?
‫Bilinen son oyuncu konumunu güncellemek için oyuncu konumumuzu ayarlayın.
‫Bunların her ikisini de plan hizmeti adı verilen bir şeyle yapabiliriz.
‫Şimdi planlarımıza gidelim ve neler olduğuna bakalım.
‫Yapay zekama gidip davranış ağacını açarsam, onu ana pencereye yerleştirirsem, size bir hizmetin ne olduğunu göstermem
‫gerekir.
‫Daha önce hiç kullanmadık ve esasen belirli bir yol aktif olduğunda her tikte veya
‫sık sık bir şey çalıştırmanın bir yoludur.
‫Yani burada Chase davranışı üzerinde bir hizmetim olsaydı, o zaman bazı kodlar Chase davranışının aktif olduğu her zaman çalışabilirdi, hareket ediyor
‫olsak da, ateş ediyor olsak da, bu şeylerden herhangi birini ağırlıklandırıyor olsak
‫da, her zaman çalışıyor olurdu.
‫Ama soruşturmada olsaydık bu olmazdı.
‫Yani bu tam da bir hizmet kullanmak istediğimiz türden bir durum.
‫Şimdi örnek bir hizmet alalım.
‫Oynarken fark ettiğimiz bir şey, yapay zeka menzilimize girdiğinde ve biz hareket ettiğimizde,
‫bize bakmak için dönmüyor ve bunu burada zaten yerleşik bir hizmetle düzeltebiliriz.
‫Bu düğüme sağ tıklayıp hizmet eklemeye gidersek ve varsayılan odak hizmetini ararsak, farklı bir renkte olduğunu görebilirsiniz,
‫yeşil.
‫Ve bu varsayılan hizmeti seçersek, dekoratörlerin yaptığı gibi bu sıra düğümlerinin üstüne
‫değil altına gider.
‫Böylece varsayılan odak seçiliyken, neye odaklanmak istediğinizi seçebilirsiniz.
‫Ve bu durumda oyuncunun konumuna odaklanmak istiyoruz, devam edin ve kaydet'e ve oynat'a basın.
‫Şimdi gidip bakarsak ve etrafta dolaşırsak, bizi takip etmek için döndüğünü görebilirsiniz.
‫Harika şeyler.
‫Şimdi C++'da benzer bir servis uygulayabilmek istiyoruz, bu servis oyuncumuzun konumunu sürekli
‫güncelleyecek ve biz kovalarken bilinen son oyuncu konumumuzu güncelleyecek.
‫Bu yüzden bunu iki ayrı hizmet olarak yapacağız ve otomatik hizmetlerin bunu tik olarak yapmaktan nasıl biraz
‫daha verimli hale getirebileceğini görebilirsiniz çünkü bilinen son oyuncu konumunu yalnızca davranış
‫ağacının doğru kısmında olduğunuzda çalıştırabilirsiniz.
‫Sandbox'a gidelim, içerik tarayıcısına gidelim, yeni bir C++ sınıfı ekleyelim, tüm sınıfları gösterelim ve burada seçeneklerimizin
‫neler olduğuna bakalım.
‫BT hizmetini arıyoruz ve BT görevimizde olduğu gibi birkaç seçenek var, Blackboard tabanımız var ve aslında Blackboard
‫Tabanını isteyeceğiz çünkü hangi anahtarı güncellememiz gerektiğini
‫bilmek istiyoruz.
‫Örneğin, oyuncunun bulunduğu yer mi olmalı?
‫Bilinen son oyuncu konumu mu olmalı?
‫Bu yüzden Blackboard Base seçiliyken bunun üzerine gidip next tuşuna basacağız
‫ve bu BT hizmetini çağıracağız, oyuncu konumunun altını çizeceğiz ve devam edip bu sınıfı oluşturacağız.
‫Derleme işlemini tamamladıktan sonra Visual Studio koduna gideceğiz ve Service Blackboard Base Call'dan
‫devralınan bu BT hizmet oynatıcı konumuna sahip olduğumuzu görebilirsiniz.
‫Bizim istediğimiz de buydu.
‫Şimdi hangi işlevselliği buna taşıyacağız?
‫Mümkün olan en basit işlevi deneyeceğim ve taşıyacağım, bu da sadece temel olarak bilinen son oyuncu
‫konumunun değerini ayarlamaktır.
‫Bu anahtar davranış ağacında yapılandırılacak olsa da, burada düz bir metin olarak değil, ancak oyuncu --
‫konumunu alacak ve bir karatahta anahtarına ayarlayacaktır.
‫Ve herhangi bir görüş hattı kontrolü yapmayacaktır, bunun nedeni davranış ağacımızda sadece kovaladığımızda
‫çalıştırıyorsak, görüş hattı kontrolüne ihtiyacımız yoktur.
‫Oyuncuyu otomatik olarak görebiliyoruz, durumun böyle olduğunu biliyoruz.
‫Yani hizmette bunu yapmak için başka bir basitleştirme.
‫BT hizmetinde bir yöntem çağrısını nasıl alacağımızı biliyorsak, bu oldukça basit olmalıdır.
‫Şimdi gidip BT hizmetimize bir göz atalım ve orada nelerin mevcut olduğunu görelim.
‫Belgeler nedir, ne yapabiliriz?
‫Burada görebileceğiniz ana yöntemler, C ilgili tik düğümü ve arama başlangıcı üzerinde ilgili hale gelmektir.
‫Arama başlangıcında.
‫Özellikle ilgilenmiyoruz ama düğümü işaretleyin.
‫Evet, bu hizmetin aktif bir yolda olduğuna dair her zaman bir güncelleme alacağımız yer burasıdır.
‫İşte o zaman uygulamak isteyeceğiz.
‫İmzanın tamamını bulmak için gidip bu dosyada arama yapacağız.
‫Burada olduğunu görebiliyoruz.
‫Bakalım, hangi bölümde?
‫Korumalı bölümün altında.
‫Bu yüzden oluşturduğumuz BT hizmetimize gideceğiz ve korumalı bir bölüm oluşturacağız.
‫Ve yapıştırın, BT Service bunu bir üst sınıftan miras aldığı için burada otomatik olarak bir geçersiz kılma söz konusudur, ancak
‫bunu kendimiz tekrar geçersiz kılmamızda bir sakınca yoktur.
‫Uygulamayı oluşturmak için bir P kontrol kaydırması yapabiliriz ve ardından super'i çağırmak isteriz.
‫Bu yüzden süper tik düğümü istiyoruz ve kendi comp'imizi ve düğüm belleğimizi iletmek istiyoruz.
‫Bakalım, burada başka şeyler de var.
‫Delta saniyemizin yanı sıra geçmemiz gerekenler de var ve son olarak noktalı virgül
‫ile tick düğümü uygulamamızı bitirmeliyiz.
‫Şimdi burada temel olarak bu davranışı I denetleyicisi CP'den yapmak istiyoruz, burada yazı tahtası bileşenini
‫alıyoruz, ardından vektör olarak bir değer ayarlıyoruz.
‫Karatahta bileşenlerini sahip bileşen referanslarından nasıl alacağımızı biliyoruz.
‫Yani bu oldukça basit.
‫Sadece sahip comp noktasını yapacağız ve ardından davranış ağacı ileri eğik çizgi karatahta bileşeni
‫için buraya hash eklememiz gerektiğini hatırlayarak get karatahta bileşenini yapacağız.
‫Sonra ok operatörümüzü kullanabiliriz.
‫Burada yapmamız gereken sadece değeri vektör olarak ayarlamak ve ardından bir anahtara ihtiyacımız var.
‫Bununla nasıl başa çıkacağımızı biliyoruz ama yine de hafızamızı tazeleyelim.
‫BT hizmetimiz olan Blackboard Base'e gidersek, görevde olduğu gibi, get selected blackboard anahtarına
‫sahip olduğumuzu görebilirsiniz.
‫Biz de bunu kullanacağız.
‫Get selected Blackboard Key, davranış ağacında seçilen anahtarı alır ve ardından vektör değerimizi
‫isteriz.
‫Bunu nereden bulacağız?
‫Yapay zeka kontrolörüyle tamamen aynı olacağız.
‫Oyuncuyu alacağız - her şeyden önce burada en üstte.
‫Daha sonra bunun null olup olmadığını kontrol etmemiz ve oyun istatistiklerimizi de dahil etmemiz gerekir.
‫Bu yüzden, oyuncu hizmeti oyuncu konumumuza dahil edilen denetleyici CP'den oyun istatistiklerinin dahil edildiğinden
‫emin olalım.
‫Sonra oyuncu piyonu null pointer'a eşitse, o zaman yapmak isteyeceğimiz şey yine erken
‫dönmektir, burada void döndürür, böylece hızlı bir erken dönüş yapabiliriz.
‫Daha sonra oyuncu piyonumuzu burada basitçe oyuncu konumunu almak için kullanabiliriz ve buraya bir ekleme yapmamız gerekebilir.
‫Nasıl gideceğimizi göreceğiz.
‫Güvende olmaktan zarar gelmez, değil mi ve bu konularda açık olmak.
‫Bu yüzden oyun çerçevesi için bir include ve ardından forward slash yapacağız.
‫H üzerinde piyonlanacak, böylece burada her şeyin yolunda olduğundan emin olabiliriz ve sonra
‫değeri vektör olarak ayarlıyoruz.
‫İhtiyacımız olan tek şey bu olmalı.
‫Gidip derleyelim ve çalışıp çalışmadığını görelim.
‫Aslında, bir şey daha var.
‫Muhtemelen güzel bir isim istiyoruz, bu yüzden burada bir kurucumuz olmalı.
‫Bu yüzden, sınıfın adı olacak yapıcı ile bir public bölüm oluşturacağım ve sonra
‫devam edip bu uygulamayı oluşturacağız.
‫Uygulamamı tick düğümü için uygulamanın üzerine getireceğim ve
‫sonra düğüm adını oyuncu konumunu güncelle'ye eşit olarak ayarlayacağız ve bunun çalışıp çalışmadığını görelim.
‫Görünüşe göre noktalı virgül eksik.
‫Tekrar deneyelim.
‫Bu başarılı bir şekilde derlendikten sonra düşmanımıza geçebiliriz.
‫Ben ve ayar odağının yanı sıra, burada oyuncu konumu olarak gösterdiğimiz ve güzel adın temelde
‫oyuncu konumunu güncelle olarak geldiği yeni bir hizmet eklemek istiyorum.
‫Her 0'da bir tıklama sıklığını size söylemek istediğini görebilirsiniz. 4'e 0. 6 saniye.
‫Bu, tick kullanmaktan daha iyidir çünkü tick'in burada her kare çalıştığını biliyoruz.
‫Bu daha az sıklıkta çalışıyor, ki bu iyi bir şey.
‫Ayrıntılara girip bir yazı tahtası anahtarı oluşturabilir, aşağı açabilir ve güncellemek istediğimizin
‫yalnızca oyuncunun konumu değil, bilinen son oyuncu konumu olduğunu seçebiliriz, çünkü bu kovaladığımız sürece
‫her karede gerçekleşecektir ve istediğimiz davranış budur.
‫Devam etmek ve oluşturmak istediğimiz bir hizmet düğümü daha, AI denetleyicisinin kene içine inme ve ne kaldığını
‫görme davranışını gerçekleştirecek.
‫Burada yapmamız gereken, görüş hattına sahip olup olmadığımıza bağlı olarak oyuncunun konumunu güncellemektir.
‫Bu yüzden oyuncunun konumunu güncellemesini istiyoruz.
‫Görüş hattımız varsa, yoksa yeri temizleyin.
‫Yani bu yeni bir hizmet düğümü olacak çünkü biraz farklı bir davranış.
‫Yeni bir C++ sınıfı ekleyeceğiz.
‫Tüm sınıfları göstermeye gideceğiz ve yine BT hizmeti yapacağız, temel sınıfımız
‫olan karatahta tabanlarının altını çizeceğiz ve buna Beat Service Underscore adını vereceğiz.
‫Görüldüyse oyuncu konumu.
‫Ve devam edin ve bu sınıfı oluşturun.
‫Ve tüm bunlar çoğunlukla daha önce gördüğünüz şeyler olduğu için, bu hizmeti uygulamak sizin göreviniz
‫olacak.
‫Yani yapay zeka denetleyicisindeki kodu kullanarak tik düğümünü uygulayacaksınız.
‫Rehberiniz olarak, BT hizmeti içinden AI denetleyici işaretçisini ele geçirmeniz gerekecek.
‫Şimdi bu, BT görevinde yaptığımızla tamamen aynıdır, bu yüzden bunu AI denetleyici işaretçisini ele geçirmek için
‫bir rehber olarak kullanın.
‫Görüş hattını kontrol etmek için AI kontrolör işaretçisine ihtiyacınız olacak.
‫Unutmayın, görüş hattı AI denetleyicisinde bir yöntemdir ve ardından görüş hattı kontrolünüze bağlı olarak anahtarı
‫güncellemeniz veya temizlemeniz ve ardından bu düğümü davranış ağacına yerleştirmeniz gerekir.
‫Bu hizmetin çalışması için davranış ağacının doğru seviyesinin neresi olacağını düşünüyorsunuz?
‫Bunu nasıl düşüneceksiniz?
‫Biraz çenem kaşındı, bir videoyu duraklattım ve denedim.
‫Tamam.
‫Tekrar hoş geldiniz.
‫Böylece Visual Studio kodunda yeni bir güzellik hizmeti ortaya çıktı.
‫Şimdi başlıkta hemen hemen aynı olacak, bu yüzden devam edeceğim ve bunu yeni oluşturulan başlığımıza
‫kopyalayacağım, istisna olarak yapıcının adını eşleşecek şekilde değiştirmemiz gerekiyor.
‫Şimdi kurucu için bir uygulama oluşturacağız ve görüldüğünde oyuncunun konumunu güncellemek için ona
‫bir düğüm adı vereceğiz ve buraya bir noktalı virgül ekleyeceğiz.
‫Bu sefer bunu unutmayalım.
‫Daha sonra C++'a geri dönerek tick düğümünü de uygulayacağım ve kendimize oyuncu konumunu
‫bulabilirsek kopyalayacağım.
‫CP Ve sadece süper çağrısını, oyuncu piyonunun alınmasını ve null dönüşünün kontrolünü kopyalayacağım.
‫Aslında, tüm gövdeyi kopyalayacağım ve oradan değiştireceğiz.
‫Bu yüzden bunu karşıya kopyalıyoruz ve ayrıca yazı tahtası bileşenine erişimi yazı tahtası bileşeni, oyun
‫statiği ve piyon için include ile kopyalayacağız, çünkü bunların hepsine erişmemiz gerekiyor.
‫Aslında, işlevselliğin çoğu burada paylaşılmaktadır.
‫Bu kodu bir şekilde paylaşmalarını sağlamayı düşünebilirsiniz, ancak bence yeterince önemsediğimiz
‫kadar çok tekrarlama yok.
‫Burada yapmamız gereken şey, bir göz kontrolörümüz olup olmadığını da kontrol etmektir.
‫Bu yüzden, owner bileşeni veya owner comp dot get I owner null işaretçisine eşitse, bu aşamada devam
‫etmek ve geri dönmek isteyeceğiz.
‫Sonra yapmak isteyeceğimiz bir sonraki şey görünürlüğümüzü kontrol etmektir.
‫Bu yüzden bir if owner comp dot get I owner yapacağız ve sonra burada bir ok yapacağız ve kontrolörümüzü buraya
‫dahil etmemiz gerekiyor.
‫Yani karma olacak.
‫Sonra da I kontrolörü H olacak.
‫O zaman line yapmak istiyoruz ve burada doğru kullanımın ne olduğunu görelim.
‫I kontrolör CP'sine gidersek, istediğimiz görüş hattı iki.
‫Yani görüş hattı iki, o zaman oyuncu piyonuna görüş hattı yapmamız gerekiyor.
‫Bu durumda, oyuncu piyonu ile görüş hattımız var mı?
‫CP'de yaptığımız şey bu mu?
‫Bunu iki kez kontrol edelim.
‫Evet, öyle.
‫Daha sonra devam etmek ve değerleri farklı şekilde ayarlamak isteyeceğiz.
‫Böylece vektör değerini oyuncu piyonunun aktör konumunu almasına ayarlıyoruz.
‫Evet, eğer başka bir görüş hattımız varsa.
‫Eğer görüş hattımız yoksa, o değeri temizlememiz gerektiğini biliriz.
‫Yani hala sahip bileşenini alacağız, tahta bileşenini alacağız.
‫Daha sonra değeri temizleyeceğiz ve seçilen yazı tahtası tuşunun değerini temizlemeye
‫devam edeceğiz ve bu, oyuncu konumunun uygulanması için bizi hemen hemen kapsamalıdır.
‫Görüldüyse, gidip derleyelim ve iyi çalışıp çalışmadığını görelim.
‫Derleme başarılı oldu.
‫Davranış ağacına girelim.
‫Şimdi bunun çalışmasını istediğim seviye temelde ilk seçicide en üst seviyede, çünkü oyuncu konumunu temelde
‫her zaman güncellemesini istiyorum çünkü oyuncu konumunun ayarlanmasına bağlı olarak bu diğer davranışlardan
‫herhangi birini iptal edebilmemiz gerekiyor.
‫Bu yüzden istediğimiz zaman bunu ayarlayabilmemiz gerekir.
‫Bu yüzden gidip üst düzey seçiciye sağ tıklayacağım, hizmet ekleyeceğim, görülürse oynatma konumunu ekleyeceğim.
‫Daha sonra bu hizmet düğümünü seçmemiz ve oynatıcı konumumuz olacak olan karatahta anahtarını
‫seçmemiz gerekecek.
‫Böylece oyuncu konumunda bir set, oyuncu konumunu güncelleme, daha aptal olan son bilinen
‫oyuncu konumunu güncelliyor.
‫Ve şimdi AI denetleyicimize gidebilmeli ve TTIC'deki tüm bu kodu kaldırabilmeliyiz çünkü
‫bunun yerine hizmetlerimiz tarafından yerini almıştır.
‫Devam edip derleyebilir ve çalışıp çalışmadığına bakabiliriz.
‫Editörün yanına gidip oynayalım ve bakalım düşmanımız hâlâ bize doğru geliyor mu?
‫Koşarak bize doğru geliyor, görüş alanını kaybediyor, sonra tekrar bize doğru geliyor ve ateş etmeye başlıyor.
‫Evet.
‫Temel olarak her şey daha önce olduğu gibi çalışıyor, ancak şimdi bunu tamamen C++'da kendimiz için yazdığımız
‫hizmetler aracılığıyla yapıyor.
‫Bir sonraki derste, yapay zekanın ateş etmeye devam ettiği ve sonunda kendini öldürmeyi başardığı
‫o sinir bozucu hatayı düzelteceğiz.
‫Orada görüşürüz.