Bir NPC karakterinin davranışı, onun davranış kodu ile tanımlanır. Davranış kodu, karakterlere dünyada hangi eylemlerde bulunacaklarını (örn. nereye gideceklerini, neyle savaşacaklarını ve diğer karakterlerle nasıl etkileşime gireceklerini) söyler. Muhafızlar ve vahşi hayvanlar gibi karakterlerin algılama, tetikte olma ve işe alınabilme ya da evcilleştirilebilme gibi ilave davranışları olabilir.
NPC Davranışı, bir NPC karakterinin var olan davranışlarına ekstra işlevsellikler katan, kullanıcı tanımlı bir Verse kodudur. npc_behavior API’si bir NPC karakteri çıktığında veya yok olduğunda çalışan bir kod tanımlayabilmeni sağlar ve bunu sıhhiyeciler, esnaflar veya boss’lar gibi özel karakterler oluşturmak için kullanabilirsin. NPC Davranışları, npc_behavior soyut sınıfından devralınır ve kullanılması için /Fortnite.com/AI modülünün içe aktarılması gerekir.
Bir NPC davranış kodunu çalıştırmak için onu bir NPC Karakter Tanımı’na bağlaman gerekir. NPC davranış kodunun karakter tanımıyla nasıl etkileşime gireceği, NPC karakterinin türüne bağlıdır. Özel tür NPC’lerin eylemler gerçekleştirmesi için bir davranış kodu gerekirken Muhafız ve Vahşi Hayvan türündeki NPC’ler bir davranış kodu almadıysa varsayılan davranışı çalıştıracaktır. NPC karakter tanımı oluşturma ve farklı karakter türleri hakkında daha fazla bilgi için Karakter Tanımı sayfasına bak.
Bu eğitim, NPC davranış kodu oluşturma hakkında temel bilgiler verir ve bir NPC’yi nasıl çıkarıp bir hedefe götüreceğini öğretir.
Yeni Bir NPC Davranış Kodu Oluşturma
UEFN’de bir muhafız çıkaran ve onu iki nokta arasında devriye gezdiren bir NPC davranış kodu oluşturmak için aşağıdaki adımları izle.
Projeni UEFN'de aç, ardından Menü Çubuğunda Verse > Verse Gezgini seçeneğine git.
Verse Gezgini‘nde projenin adına sağ tıkla ve Projeye yeni Verse dosyası ekle’yi seçerek Verse Kodu Oluştur penceresini aç.
Verse Kodu Oluştur penceresinde şablon olarak seçmek için NPC Davranışı’na tıkla.
NPC Davranışı Adı alanındaki metni cihazının adıyla değiştirerek NPC Davranışına bir ad ver. Bu örnekte cihazın adı my_first_npc_behavior olarak belirlenmiş.
Verse dosyasını oluşturmak için Oluştur butonuna tıkla.
Verse Gezgini’nde Verse dosyanın adına çift tıklayarak dosyayı Visual Studio Code’da aç.
Kodunu kaydet, derle ve yeni bir NPC karakter tanımı oluştur. NPC karakteri oluşturma hakkında daha fazla bilgi için Karakter Tanımı sayfasına bak.
my_first_behaviorkodunu yeni karakter tanımının Verse davranışı olarak ata.Bölümünün oynanış testini yapmak için UEFN araç çubuğunda Oturumu Başlat düğmesine tıkla. Bölümün için oynanış testi yaparken Karakter Çıkma Yerinden çıkarılan karakterler çıktıkları yerin yakınında rastgele bir nokta seçmeli ve oraya gitmelidir. O noktaya ulaştıklarında belirli bir süre beklemeli ve başlangıç noktalarına geri dönmelilerdir. Ada Ayarları cihazından Verse Hata Ayıklama Çizimi etkin seçeneğini etkinleştirdiysen karakterin nereye odaklandığını gösteren okların ve karakterin gitmekte olduğu noktayı gösteren kutuların çizilmiş olduğunu göreceksin.
Navigatable
Karakterleri belirli hedeflere ve devriye gezme, bir noktayı koruma veya başka bir karakteri takip etme gibi eylemlere yönlendirmek için Navigatable API’sini kullanabilirsin. Muhafız türündeki NPC’ler bunu Yapay Zekâ Devriye Yolu Noktalarıyla yapabilir, ancak burada bu işlevselliği herhangi bir türdeki karaktere de uygulamak ve bölüme daha fazla cihaz yerleştirmekten kaçınmak için Verse kodunu kullanacaksın. Karakterin navigatable arayüzü, karakterleri bir agent veya position oluşturabileceğin bir navigation_target’a yönlendirmene olanak tanır. Özel, Muhafız ve Vahşi Hayvan türündeki NPC’lerin hepsi gidilebilir arayüzü kullanabilir. Karakterin navigatable arayüzünü almak için öncelikle karakterin fort_character referansını alman gerekir. Bunu da `GetFortCharacter[] çağrısıyla yapabilirsin.
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
Şablon örneğinde kod, karakterin çıktığı rastgele bir uzaklıktan bir konum seçer ve onu bir GoToPoint değişkenine kaydeder. Daha sonra hem GotToPoint’ten hem de karakterin çıkma noktasından bir navigatoin_target oluşturur.
# Create a random offset from the spawn point to walk toward.
GoToPoint := NPCSpawnPoint + vector3{X := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Y := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Z := 0.0 }
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateBeginMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
# Create a navigation target from these two positions that the navigation interface can use.
NavTargetStart := MakeNavigationTarget(GoToPoint)
NavigateTo() fonksiyonu, karakterin navigation_target hedefine ulaşıp ulaşmadığı hakkında bilgi içeren bir navigation_result enum döndürür. navigation_result değerini kontrol ederek karakterlere hedeflerine ulaşıp ulaşmadıklarına göre davranışlar verebilirsin.
# Check to see if something has interfered with the NPC reaching the intended location and print a
# message to the output log.
if (NavResultGoTo <> navigation_result.Reached):
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
else:
# Once it arrives at its location, wait for this duration in seconds
Navigatable.Wait(?Duration := MoveToWaitDuration)Karakterlerin dünyada nasıl gezindiği hakkında daha fazla bilgi almak ve karakterlerin gidebileceği farklı alanları görmek için Navigasyon Örgüsü sayfasına bak.
Focus
Karakterler eylemler gerçekleştirirken belirli hedeflere bakarlar. Bir karakterin baktığı belirli hedef, karakterin odağıdır. Karakterler; konuştukları karaktere, saldırdıkları hedefe veya gitmekte oldukları konuma odaklanırlar. focus_interface, karakterlerinin odaklanacağı belirli hedefler belirtmene olanak tanır. Özel, Muhafız ve Vahşi Hayvan türündeki NPC’lerin hepsi odak arayüzünü kullanabilir. MaintainFocus() fonksiyonu, karakterini bir hedefe odaklar. Bu hedef bir vector3 konumu veya bir agent olabilir. focus_interface, fort_character arayüzünün bir parçasıdır ve onu GetFocusInterface[] kullanarak alabilirsin.
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
Şablon örneğinde karakter başlangıç konumuna geri gitmeye başladıktan sonra kod, karakteri önceki navigation_target’a odaklanmaya zorlamak için MaintainFocus()’u kullanır. Bunun yapılması, karakterin geriye doğru yürümesine neden olur ve karakter başlangıç noktasına dönerken onu arkadan izleyebilirsin.
# Leveraging concurrency to wait until the NPC reaches its destination, while the calls to look back at its origin point
# and drawing a debug arrow never completes, continuing, ensures only the NavigateTo can win the race.
NavResultGoToNext := race:
# Move back to its starting position.
Navigatable.NavigateTo(NavTargetEnd)
# Sets NPC to look at its previous position which will make it walk backwards.
# This is meant to show the utility of the focus interface.
block:
Focus.MaintainFocus(GoToPoint)
Leashable
Muhafızlar bir hedefi koruduğunda muhafızların hedef çevresindeki bir alanda kalmasını ve çok uzağa gitmemesini sağlaman doğru olacaktır. fort_leashable arayüzü, muhafız türündeki bir NPC’ye özgü bir arayüz olup bir hedefin çevresinde muhafızların dışına çıkmayacağı bir yarıçap belirlemene olanak tanır. Muhafızları belirli konumlara veya diğer NPC’lere tasmayla bağlayabilirsin. Muhafızlar tasmayla bağlandıkları hedefin hareket etmesi durumunda onun yakınında kalacak şekilde konumlarını güncellerler. Şu anda özel ve vahşi hayvan türündeki NPC karakterlerinin fort_leashable arayüzünü kullanamayacaklarını unutma. fort_leashable arayüzünü GetFortLeashable[] kullanarak alabilirsin.
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Bir yakalama noktasının veya önemli bir NPC’nin korunması gibi durumlarda muhafızları konumlara veya diğer aracılara tasmayla bağlayabilirsin. Her takip bölgesinin (leash), sırasıyla muhafızların takip bölgesi hedefine ne kadar yakın ve ne kadar uzak durması gerektiğini santimetre cinsinden belirten bir InnerRadius ve OuterRadius değeri vardır. Şablon örneğinde leashable arayüzü kullanılmıyor ancak kendi muhafız NPC’lerini oluştururken bu arayüzü kullanışlı bulabilirsin.
# Leash the guard to a position so they stay between 500 and 1000
# cm of the position they're leashed to
Leashable.SetLeashPosition(NPCSpawnPoint, InnerRadius := 500.0, OuterRadius := 1000.0)
# Leash the guard to an agent so they stay between 500 and 1000
# cm of the agent they're leashed to
Leashable.SetLeashAgent(AgentToFollow, InnerRadius := 500.0, OuterRadius := 1000.0)
# Clear all leashes on the guard
Leashable.ClearLeash()
Hata Ayıklama Çizimi
Dosyanın en üstünde bu şablon, hata ayıklama çizimi için ayrılmış bir kanal tanımlar. Hata Ayıklama Çizimini, belirli oyun verilerini test etmek amacıyla görselleştirmek için kullanabilirsin. Örneğin, karakterinin görünürlük aralığını görüntüleyebilir veya ulaşmak üzere seyahat etmekte olduğu konumun çevresinde bir şekil çizebilirsin. Bu hata ayıklama şekillerini görselleştirmek için Ada Ayarları’ndaki Hata Ayıklama sekmesinden Verse Hata Ayıklama Çizimi etkinleştirilmelidir. Böylelikle bunlar yayınlanmış deneyimlerde görünmez. Dosyanın en üstündeki kanal, tek bir metot kullanarak bir kanaldaki tüm hata ayıklama şekillerini gizlemene, göstermene veya temizlemene olanak tanır.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
new_npc_behavior şablon sınıfı, görselleştirme ve hareket için kullanılan birkaç değer tanımlar.
MoveToWaitDuration, karakterinin hareket etmeden önce bir noktada kaç saniye beklediğini tanımlar.Verse# How long to wait in seconds after the NPC navigates to a point before moving on. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5}, MaxValue:=option{10.0} MoveToWaitDuration:float = 5.0DistanceFromSpawnPtToMovekarakterinin hareket edeceği çıkma noktasından itibaren rastgele uzaklık aralığını tanımlar.Verse# The negative min and absolute max x & y coordinate offset in centimeters to tell the NPC to move to @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.0} DistanceFromSpawnPtToMove:float = 1500.0ShowAIDebugmantık değeri, editörden hata ayıklama şekilleri çizme seçeneğini açıp kapatmanı sağlar.Verse# Whether to draw debug to the NPC channel when Verse Debug Draw is enabled in Island Settings. @editable: Categories:=array{my_first_npc_behavior_message_module.SettingsCategory} ShowAIDebug:logic = trueAIDebugDrawTimekayan değerini kullanarak hata ayıklama çizimi konumunun işleneceği süreyi belirleyebilirsin.Verse# How long in seconds to render the debug draw location and print text. # It is recommended to keep this in sync with MoveToWaitDuration otherwise the print will not be shown if a previous message is displayed. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0LookAtDebugDrawDurationkayan değerini kullanarak bakma oku hata ayıklama çiziminin ne kadar süre boyunca işleneceğini belirleyebilirsin.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5DebugDrawNPCkanalı, hata ayıklama çizimi örneğini tanımlar ve dosyanın üst kısmında tanımlanmış kanalı kullanır.Verse# How long in seconds to render the look at arrow's debug draw. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} LookAtDebugDrawDuration:float = 0.5Son olarak
VerticalOffsetToNPCHead, hata ayıklama bakma okunu çizmek için NPC’nin pelvisiyle kafası arasındaki bu uzaklığı tanımlar. Bu uzaklık olmadan hata ayıklama bakma oku, NPC’nin merkezinden çizilecektir.Verse# Used for specifying a point offset from the NPC pelvis to the head to draw the look at arrow from. VerticalOffsetToNPCHead<private>:float = 55.0
new_npc_behavior şablon sınıfındaki iki fonksiyon, hata ayıklama şekilleri çizer. DrawDebugLocation() fonksiyonu, LookAtDebugDrawDuration süresi boyunca belirtilen bir konumda büyük bir nokta çizer.
# This function draws a box around a specified position for a finite amount of time.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLocation(Location:vector3):void =
DebugDrawNPC.DrawPoint( Location,
?Color := NamedColors.SteelBlue,
?Thickness := 100.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
?Duration := AIDebugDrawTime )
DrawDebugLookAt() fonksiyonu, aracının kafasından bakma noktasına doğru bir ok çizerek karakterin nereye baktığını görselleştirmene olanak tanır.
# This function draws an arrow from the Agent's head to its look at point every half a second.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLookAt(Character:fort_character, LookAtPoint:vector3)<suspends>:void=
loop:
DebugDrawNPC.DrawArrow( Character.GetTransform().Translation + vector3{ Z := VerticalOffsetToNPCHead},
LookAtPoint,
?ArrowSize := 50.0,
?Color := NamedColors.Yellow,
?Thickness := 5.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
Karakterini Bölüme Ekleme
Artık NPC BehaviorScript hakkında bilgi sahibi olduğuna göre şimdi bir karakter oluşturup kodu bir adada kullanmaya sıra geldi. Aşağıdaki iş akışı, Muhafız türündeki karakterler için tasarlanmıştır, ancak NPC Davranış Kodu, Özel ve Vahşi Hayvan türündeki karakterler için de işleyecektir.
MyFirstCharacterDefinition adlı yeni bir NPC Karakter Tanımı oluştur. Yeni karakter tanımına tıklayarak Karakter Tanımı ekranını aç.
Karakter Tanımı ekranında aşağıdaki özellikleri değiştir:
NPC Karakter Türü altında Tür değerini Muhafız olarak ayarla. Muhafız arayüzünü kullanarak muhafızın tetikte veya şüpheci olduğu olaylar gibi muhafıza özgü karakter işlevselliklerine erişebilir ve takım arkadaşı olarak kullanılacak muhafızlar işe alabilirsin. Muhafızlar silah da kuşanabilirken Özel ve Vahşi Hayvan türündeki karakterler şu anda bunu yapamaz. Ad sekmesi altında karakterinin adını da değiştirebilirsin.
NPC Karakter Davranışı altında Davranış değerini Verse Davranışı olarak ayarla. Ardından NPC Davranış Kodu‘nu
my_first_npc_behaviorolarak değiştir. Karakterin, muhafız arayüzündeki işlevselliklere erişmeye devam eder ancakOnBeginveOnEndsırasında ne yapacağına karar vermek için senin Verse kodunu kullanır.Karakterinin kozmetik görünümünü değiştirmek için Değiştiriciler sekmesindeki Muhafız Çıkma Değiştiricisi altında Kozmetik sekmesine tıkla. Önceden var olan bir kozmetiği seçebilir ya da Karakter Kozmetik Yeniden Hedeflemesi’ni etkinleştirerek özel bir model kullanabilirsin. Karakter kozmetiği yeniden hedeflemesini yalnızca muhafızlar ve Özel türdeki karakterler kullanabilir, vahşi hayvanlar ise kullanamaz. Karakter değiştiricileri ve farklı karakter türlerine bunlardan hangilerinin uygulandığı konusunda daha fazla bilgi için NPC Karakter Tanımı sayfasına bak.
Karakterine yeni bir değiştirici eklemek için Değiştiriciler sekmesinde Öğe Ekle’ye tıkla. Yeni değiştiricinin türünü Çanta Değiştiricisi olarak değiştir. Çanta değiştiricisini yalnızca muhafızların kullanabileceğini unutma.
Karakterinin çantasına yeni bir eşya eklemek için Çanta Değiştiricisi altında Öğe Ekle’ye tıkla. Eşya Tanımı’nı silah, eşya, tek kullanımlık eşya veya karakterinin sahip olması gereken başka herhangi bir şey olarak ayarla. Karakterinin çantasına birden fazla eşya ekleyebilirsin; böylece karakterlerin savaşmak için silahlar, iyileştirici eşyalar vb. kullanabilir.
Karakterine yeni bir değiştirici eklemek için Değiştiriciler sekmesinde Öğe Ekle’ye tıkla. Yeni değiştiricinin türünü Kullanıcı Arayüzü Değiştiricisi olarak değiştir.
Karakterinin adını değiştirmek için Kullanıcı Arayüzü Değiştiricisi altında Ad sekmesine tıkla. Karakterinin adı, başının üstünde gösterilecektir.
NPC karakter tanımını kaydet. İçerik Tarayıcısı’nda NPC karakter tanımını bölüme sürükle. Bunu yaptığında otomatik olarak yeni bir Karakter Çıkma Yeri oluşturulacak ve karakter tanımın oraya atanacaktır.
Karakter Çıkma Yerini seç. Anahat Düzenleyicisi’ndeki Kullanıcı Seçenekleri altında:
Çıkma Sayısı’nı 20 olarak ayarla. Sana yardımcı olması için birkaç muhafıza ihtiyacın olacak, ama biraz eğlenmeye bak ve bunu maksimum olarak ayarla.
Bölümünün oynanış testini yapmak için UEFN araç çubuğunda Oturumu Başlat düğmesine tıkla. Oynanış testi yaptığında karakterin ortaya çıkıp başlangıç noktası ile ona yakın rastgele bir nokta arasında devriye gezmeli ve yolda karşılaştığı düşmanlarla etkileşime girmelidir.
Kendi Kendine Yapabileceklerin
Bu kılavuzu tamamlayarak kendi özel karakterlerini üretmek için bir NPC Davranış Kodu oluşturmayı öğrendin. Bu konuda daha fazla bilgi edinmek ve belirli türlerdeki karakterler ile senaryoları nasıl oluşturacağını öğrenmek için aşağıda listelenen NPC Davranışı eğitimlerinden bazılarına göz atabilirsin.